当前位置: 首页 > news >正文

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

大家好,我叫徐锦桐,个人博客地址为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--;
}

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


引用CSAPP中的话。

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

signal()

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

Show you the code.

V(semaphores S) {
    S++;
}

二元信号量(互斥锁)

二元信号量(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);
}

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


给个互斥锁的例子。

/**
 * 申请锁
 */
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);
}

计数信号量

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


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

相关文章:

  • Qt扫盲-QPen 理论使用总结
  • 钢铁异常分类 few-shot 问题 小陈读paper 钢铁2
  • 【Linux】文件权限、目录权限、掩码、粘滞位以及相关指令
  • nvm 安装 node 安装不上 npm
  • Go 语言的垃圾回收机制:自动化内存管理
  • 微信小程序自定义方法submitPwd(e){}传入的e有什么作用
  • 国密https访问
  • 冯诺依曼体结构 - 为什么要有操作系统
  • SystemVerilog学习(4)——自定义结构
  • LLM 系列 | 21 : Code Llama实战(上篇) : 模型简介与评测
  • 寻找Windows API 原始字节(x64dbg)
  • JavaPTA练习题 7-3 身体质量指数(BMI)测算
  • 微信小程序一键获取位置
  • 解决windows10、windows11故障:Microsoft-Windows-Kernel-Processor-Power 事件ID:37
  • Could not find artifact com.sleepycat;je:jar:7.3.7 in aliyunmaven
  • 智能水印相机微信小程序源码
  • 深度学习中常用的激活函数有sigmoid、tanh、ReLU、LeakyReLU、PReLU、GELU等。
  • 08-React扩展
  • c/c++的include机制简述
  • STM32不使用 cubeMX实现外部中断
  • 解放日报:浦东夯实“热带雨林”式科创生态
  • 出行注意防晒补水,上海五一假期以多云天气为主最高33℃
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 伊朗港口爆炸已致46人死亡
  • 美媒:受关税政策影响,美国电商平台近千种商品平均涨价29%
  • 加拿大今日大选:房价、印度移民和特朗普,年轻人在焦虑什么?