• 信号量、互斥锁、计数信号量


    大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。

    信号量(semaphores)一个多进程共享的非负整型全局变量。信号量常用于多进程的进程同步。

    介绍

    信号量(semaphores)是一个简单的多进程共享非负整型全局变量
    信号量简称为s,它除了初始化外只能通过两个标准原子(原子:一个进程修改信号量时,信号量不可被其他进程修改)操作:wait() 和 signal() 来访问。

    wait()

    wait()操作(也称 P 操作,荷兰语proberen,测试的意思),测试是否有其他进程使用该资源。\

    Talk is cheap.Show you the code.。

    wait(semaphores S) {
        while(S <=0)
             ;// no operator
        S--;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那个while循环里面只有一个;,表示不进行任何操作。在这个循环里,该进程被挂起,不能访问临界资源或共享资源。


    引用CSAPP中的话。

    如果 s 是非零的,那么 P 将 s-1,并且立即返回。如果 s 为零,那么就挂起这个进程,直到 s 变为非零,而一个 V 操作会重启这个线程。在重启之后,P 操作将 s 减1并将控制返回给调用者。

    signal()

    signal()操作(也称 V 操作,荷兰语verhogen,增加的意思)。

    Show you the code.

    V(semaphores S) {
        S++;
    }
    
    • 1
    • 2
    • 3

    二元信号量(互斥锁)

    二元信号量(binary semaphore)只有两个值(0或1),初始的二元信号量为1。
    s == 0表示共享资源正在被占用,其他进程挂起等待。
    s == 1表示共享资源空闲,可以被进程使用。


    P操作在二元信号量中也叫上锁,V操作在二元信号量中也叫解锁。通常会在一段代码前上锁,然后运行完这段代码解锁。比如下面这段代码。

    void gdt_free_sel(int sel) {
        mutex_lock(&mutex);
        gdt_table[sel/sizeof(segment_desc_t)].attr = 0;
        mutex_unlock(&mutex);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当然,在互斥锁在实际中的使用并不是像上面那样只是增加计数,真正的应用还涉及到添加到等待队列等等。


    给个互斥锁的例子。

    /**
     * 申请锁
     */
    void mutex_lock (mutex_t * mutex) {
        irq_state_t state = irq_enter_protection();
    
        task_t * curr = task_current();
        if (mutex->locked_count == 0) {
            // 没有任务占用,占用之
            mutex->locked_count++;
            mutex->owner = curr;
        } else if (mutex->owner == curr) {
            // 已经为当前任务所有,只增加计数
            mutex->locked_count++;
        } else {
            // 有其它任务占用,则进入队列等待
            task_set_block(curr);
            list_insert_last(&mutex->wait_list, &curr->wait_node);
            task_dispatch();
        }
    
        irq_leave_protection(state);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    计数信号量

    计数信号量(Counting Semaphore)的信号量值的范围取决于共享资源分的实例个数。


    信号量2.webp
    如图,共享资源有两个实例,sem的值就是当前空闲的实例。当前进程A占用了实例一,进程B占用了实例二,所以sem=0进程C就挂起等待。

  • 相关阅读:
    【布局优化】基于遗传算法实现分布式发电单元优化分配附matlab代码
    go的解析命令行库flag
    Vue3(笔记)
    Python实现天文计算
    Docker 架构解析:理解 Docker 引擎和容器运行时
    使用.Net6中的System.Text.Json遇到几个常见问题及解决方案
    Linux下“多线程”相关内容整理总结
    数字IC设计中为什么要避免锁存器(Latches)
    vite+vue3+electron开发环境搭建
    <Linux常用开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile等)>——《Linux》
  • 原文地址:https://blog.csdn.net/Roger_Spencer/article/details/133972598