一、信号量是什么

就是更优于前面学的【软件方式】和【硬件方式】的一种新的【同步机制】

【具体表示方式】

        提示:之所以叫P、V操作是因为,发明他的科学家迪杰斯特拉是荷兰人,P是荷兰语“请求”的首字母、V是荷兰语“释放”的首字母

二、信号量分类

【整型信号量】

顾名思义,信号量的值用整型数字表示

比如当【前有10个打印机资源可用:int 信号量 = 10;

  • 具体各进程调用时:
    • 每个进程执行【wait()语句】,并传入信号量S作为参数,当一个进程开始使用该信号量代表的资源时,【信号量S-1】
    • 当一个进程在wait()语句里判断【S<=0】说明没有可用的资源了,只能在循环等待,也就是 “忙则等待” 原则
    • 直到某一进程用完资源后,执行【signal()语句】,释放资源,【信号量S+1】,其他进程才会停下wait()语句的循环,开始轮到他们使用资源,再次将信号量S-1
  • 【特点】
    • 1、跟双标志先检查法有点像,都是【先检查、后上锁】
      • 但是区别是【双标志先检查法】是软件实现,不具备原子性,可以并发穿插执行各进程间的代码;【整型信号量】的操作是【原子语句】,一旦执行不被打断,所以【“检查” + “上锁”】过程是一气呵成,不会被插手打断!!!
    • 2、【整型信号量】依旧不具备【让权等待】
      • 前面说过,你有【while循环】就肯定不具备【让权等待】,因为你这个进程因为某些原因没资格使用该资源,但是又卡着循环不让别人用,发生【忙等】!

【记录型信号量】

  • 他的特点就是:进程等待使用资源,是被动挂在阻塞队列中等待的
    • 而前面不管软件、硬件、整型信号量,都是各个进程自己靠循环检查资源可否使用
    • 而记录型信号量的进程不可用时,被挂在信号量的等待队列,直到资源可用时被动被唤醒
  • 另外,它遵循的【让权等待】!!!!他没有循环!!!!

  • 具体各进程使用资源时:
    • 1、【信号量】数据结构里记录着【信号量值】+【进程等待队列
      • 信号量值S.value】:
        • 【正数时】:还有几个空闲资源可以被使用
        • 【负数时】:信号量值的绝对值 = 有几个进程要用资源、却无法使用
      • 进程等待队列S.L】:哪些进程想使用资源、却因资源被占用而暂时无法使用
    • 2、进程使用资源时
      • 注意特点:wait()】语句是【先该值再检查!!!
      • 一个进程使用了一个资源,就用【wait()语句】先把【信号量值S.value-1】再检查【信号量S.value < 0】否?是【正数】就说明还有资源可以用
    • 3、当可用资源为0,没有资源可分配,而别的进程依旧申请时
      • 【wait()】语句依旧:【先该值!!!后检查!!!
      • 这样做的好处是:
        • 先改完值后,信号量值是【负数】时,可以直接判断出没有资源可以用,同时 【| 信号量值 | = 阻塞等待的进程数
        • 然后在检查【信号量S.value < 0】符合后,用block语句让【申请进程】阻塞,放入信号量的【进程等待队列S.L】(运行态—>阻塞态)
    • 4、最后,一个进程用完资源,就执行【signal()】语句释放资源
      • 【signal()】直接给【信号量S.value + 1,并把信号量里的【阻塞等待队列S.L】的队头进程用wackup语句唤醒,准备执行该进程、并使用可用资源
      • 只要【信号量值S.value<=0】,【signal()】语句就会执行wackup语句,把等待队列S.L的队头第一个进程恢复就绪状态,给予空闲资源其使用(阻塞态—>就绪态)
        • 直到【S.value>0】、【进程等待队列S.L为空】,一切又恢复到原来的样子
    • 总结【记录型信号量】:

【两种信号量对比总结】

【例题】

2、信号量的使用

回顾信号量值得意义:【代表某个资源的可用数量】

  • 执行P操作后,mutex--,此时
    • 1、信号量mutex >= 0时,有可用资源,可以让进程进入临界区
    • 2、信号量mutex < 0时,没有可用资源,谁要用进程就先去阻塞队列等待

1)信号量实现【互斥】

重点大纲:

具体分析逻辑:

2)信号量实现【同步】

重点大纲:

具体实现逻辑:

3)信号量实现【前驱关系】

重点大纲:

具体实现逻辑:

        其实就是多个【信号量实现同步】的操作结合起来,有多个值为0的信号量而已,每一对前驱关系都是一个进程同步

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐