2.3.4 信号量机制

在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决了进程互斥与进程同步问题。

目录

2.3.4 信号量机制

2.3.4.1 信号量机制概述

2.3.4.2 整型信号量

2.3.4.3 记录型信号量


2.3.4.1 信号量机制概述

操作系统可以用一对操作原语来对信号量进行操作从而实现进程同步和进程互斥。

信号量:一种变量,可以用它来表示系统中某资源的数量

  一对原语:wait(S) 原语和 signal(S) 原语原语具有一气呵成不可中断的特性,它是由关中断来实现的,我们可以将原语看作不可中断的函数,函数所使用的参数是S(信号量),我们还经常用P,V来分别表示wait原语以及signal原语。

2.3.4.2 整型信号量

之前提到,信号量可以表示某资源的数量,整形信号量就表示这个资源的数量可以用整型数来表示。整形信号量与普通的整型变量是不一样的,整型信号量只能进行初始化、P、V操作。

  在整形信号量中,wait与signal的逻辑如下:假如有一台计算机可供使用

int S = 1;                //表示系统中只有一个资源可以使用void wait(int S){        //wait原语就相当于“进入区”,完成检查以及上锁的工作while(S <= 0);       //检查资源是否够用,如果资源不够就等待释放资源S--;                 //资源够用,占用一个资源并上锁
}void signal(int S){      //相当于退出区S++;                 //将资源释放,解锁
}P1:
wait(S);                //进入区,申请资源
使用计算机;              //临界区,访问资源
signal(S);              //退出区,释放资源P2:
wait(S);                //进入区,申请资源
使用计算机;              //临界区,访问资源
signal(S);              //退出区,释放资源
.........

在上述代码中,如果资源不够,那么会一直等待资源的分配,不满足让权等待,会造成忙等。

2.3.4.3 记录型信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。

typedef struct{int value;                //表示资源struct progess *L;        //等待队列
}semaphore;                   //定义了一个结构体,并用semaphore来代替结构体命名变量void wait(semaphore S){S.value--;                //申请资源if(S.value<0){            //如果剩余资源数不够,使用block原语使进程从运行态进入阻塞态block(S.L);}
}void signal(semaphore S){S.value++;                //释放资源if(S.value<=0){           //释放资源后,还有别的进程在等待这种资源,则使用wakeup 原语唤醒它wakeup(S.L);}
}
 S.value 的初值表示系统中某种资源的数目。对信号量 S 的一次 P 操作意味着进程请求一个单位的该类资源,因此需要执行 S.value--,表示资源数减1,当S.value < 0 时表示该类资源已分配完毕,因此进程应调用 block 原语进行自我阻塞(当前运行的进程从运行态->阻塞态),主动放弃处理机,并插入该类资源的等待队列 S.L 中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。
对S 的一次 V 操作意味着进程释放一个单位的该类资源,因此需要执行 S.value++,表示资源数加1,若加1后仍是 S.value <= 0,表示依然有进程在等待该类资源,因此应调用 wakeup 原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态->就绪态)。

操作系统(二十一)信号量机制相关推荐

  1. 【操作系统·考研】信号量机制/PV操作

    在操作系统引入进程后,一方面,系统中的多道程序可以并发执行,不仅有效改善资源利用率,而且显著提高系统的吞吐量.另一方面,如果不对多个进程的运行进行妥善管理,必然会因为这些进程对系统资源的无序争夺给系统 ...

  2. 【操作系统原理】信号量机制

            信号量机制是一种卓有成效的进程互斥同步工具.这里只介绍记录型信号量机制,它可以有效的解决CPU"忙等"的问题,实现互斥.          记录型信号量机制的数据结 ...

  3. 操作系统 之 「信号量机制解决进程同步问题」

    文章目录 经典的信号量同步问题 第一部分 生产者消费者问题 1.多生产者多消费者 -- 吃水果 2.单生产者多消费者问题 -- 吸烟者 分析 3.多生产者问题 -- 仓库存货物 分析 解答 4.多生产 ...

  4. 操作系统 # 从零开始的信号量机制理论与实践

    copyright© skysys 未经授权,禁止转载.原文发布于CSDN:skysys.blog.csdn.net 编程实现使用DevCpp 运行环境为Windows系统 完成这个实验需要自学&qu ...

  5. 操作系统之信号量机制

    一.信号量 百度百科:信号量(Semaphore)是在多线程环境下使用的一种设施,是可用来保证两个或者多个关键代码不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦关键代码段完成了, ...

  6. 五、深入了解信号量机制(大彻大悟篇)内附经典生产者消费者等线程同步问题

    一.信号量机制 复习回顾+思考:之前学习的这些进程互斥的解决方案分别存在哪些问题? 进程互斥的四种软件实现方式(单标志法.双标志先检查.双标志后检查.Peterson算法 ) 进程互斥的三种硬件实现方 ...

  7. 十六、用信号量机制实现进程互斥、同步、前驱关系

    一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...

  8. 信号量机制实现进程控制

    一.信号量机制实现进程互斥 我们将一次仅允许一个进程访问的资源称为临界资源,而临界区是指访问临界资源的那段代码. 通常将互斥信号量设置为 mutex ,初始值为 1. 为什么初始值设置为 1 呢? 因 ...

  9. 二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

    一.什么是进程同步? 二.什么是进程互斥? 临界资源:一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进.临界区空闲时,可以允许一个 ...

最新文章

  1. Linux系统无线鼠标不能用,手把手教你win7系统无线鼠标不能用的处理方案
  2. MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
  3. 服务器2008操作系统漏洞,【操作系统安全漏洞 】解决CVE-2017-11780:Microsoft Windows SMB Server远程代码执行漏洞...
  4. 漫谈概率 PCA 和变分自编码器
  5. 绝对素数(信息学奥赛一本通-T1153)
  6. ucloud对象存储装宝塔_使用UCloud优刻得云主机和宝塔面板快速搭建WP个人博客网站教程...
  7. 计算机操作系统英语,操作系统的英文介绍
  8. Emacs进阶之使用Google翻译单词及句子
  9. ACM时间复杂度及算法的选择分析
  10. 有了BBdoc文档搜索,就不要使用DocFetcher 全文搜索了
  11. Java Web基础入门第三十九讲 利用易宝第三方支付实现简单在线支付
  12. 黑客帝国产业链调查:熊猫烧香作者一年赚千万
  13. Linux系统入门学习
  14. win11共享打印机无法连接怎么办
  15. 今日头条搜索应该怎么做?头条搜索SEO排名和信息流排名课程
  16. 论文笔记|固定效应的解释和使用
  17. 人工智能之语音识别技术(四)
  18. centos7配置tomcat环境变量
  19. 让VBOX支持USB
  20. 双极型晶体管---三极管

热门文章

  1. OPCDAAuto.dll的C#使用方法浅析(转载)
  2. Spring Cloud中,Eureka常见问题总结
  3. epoll的LT和ET模式
  4. 同域下跨文档通信iframe和window.open
  5. 如何在属性面板中增加一个属性-UI界面编辑器(XproerUI)教程
  6. AD 画图 镜像翻转元器件
  7. 关于栈的理解(读书笔记)
  8. Win7+Ubuntu双系统启动项修复总结
  9. 【Python】matplotlib.pyplot 标题换行
  10. 科大星云诗社动态20210822