• 信号量机制


    在这里插入图片描述

    信号量

    指有某个特定含义的变量或用于记录某些东西的有特殊结构的变量
    例如设置一个: int PrinterNum用于表示打印机的数量
    这种就是用于表示 系统中某种资源的数量的信号量

    原语

    已经提到过很多次了, 就是指 执行一气呵成, 不可被中断的一种特殊程序段
    由 关/开中断指令 实现

    信号量机制

    指用户进程可以使用操作系统提供的一对原语来对信号量进行操作
    从而很方便地实现了进程互斥于进程同步

    在这里插入图片描述

    其中wait与signal这两个操作又称为P与V, 即 PV操作
    来自荷兰语
    proberen
    verhogen

    整型信号量

    用一个 整数型的变量作为信号量, 用来表示 系统中某种资源的数量
    与普通整数变量的区别在于整型信号量只有三种操作:
    初始化, P操作, V操作

    例如某计算机只有一台打印机:
    在这里插入图片描述

    由上可见, 其与双标志先检查类似
    先检查资源数量是否足够, 如果足够就退出循环并对资源数量减一

    不过wait()是用原语实现的, 其中的while循环执行时无法中断
    也就是说避免了像 双标志先检查法 由于进程并发异步导致的问题

    由于其也是使用while循环作为spin lock, 也违背了让权等待的原则

    问题:

    既然wait使用原语实现, 是否其会一直无法进行进程切换导致进程持续占用处理机?
    按照教材来说是不会导致一个进程一直占用处理机, 具体实现我也不清楚
    可能是针对时钟中断单独做了处理, 如果时间片到了引起的中断就 开中断然后进行中断

    记录型信号量

    即使用某种数据结构作为信号量

    例如:
    在这里插入图片描述
    value保存着数量
    L保存着需要该资源的进程的队列

    当某个进程需要使用资源时, 调用wait原语检查是否还有该资源
    将该资源的记录型信号量中value减1
    并判断value是否<0, 如果是, 则说明资源用完了
    资源用完了应当将该进程指针放入等待该进程的队列中, 进程也转为阻塞态
    资源没有用完则继续执行
    在这里插入图片描述

    当进程使用完某个资源时
    应当调用signal原语
    检查该资源的记录型信号量, 由于要释放一个该资源, 则value+1
    还要检查value的值, 如果value+1后仍然<=0, 说明还有进程在等待该资源
    则唤醒等待队列中的一个进程
    在这里插入图片描述

    总结

    在这里插入图片描述
    下节将介绍使用记录型信号量实现进程互斥与进程同步

  • 相关阅读:
    mybatis如何对mysql数据库进行批量插入呢?
    Java基础- 浅谈javac和javap
    P4_toturial练习1问题:ModuleNotFoundError: No module named ‘p4.tmp‘
    基于X86+FPGA+AI的智能仓储AGV机器人解决方案
    生命周期成本VE——五十铃汽车
    行为型-命令模式
    大数据技术基础实验四:HDFS实验——读写HDFS文件
    【Golang】判断某一类型是否实现指定接口的几种方法
    揭秘制造业精益生产和智慧供应链管理背后的秘密武器!
    L11.linux命令每日一练 -- 第二章 文件和目录操作命令 -- rename和basename命令
  • 原文地址:https://blog.csdn.net/weixin_45575944/article/details/126432082