操作系统——信号量(理解什么是信号量,信号量如何解决同步互斥问题,信号量一些注意点)-程序员宅基地

技术标签: 操作系统  队列  

信号量是什么

信号量(semaphore)是操作系统用来解决并发中的互斥和同步问题的一种方法。
信号量是一个与队列有关的整型变量,你可以把它想象成一个数后面拖着一条排队的队列,如图:

在这里插入图片描述
那信号量上面值n代表什么意思呢?
n>0:当前有可用资源,可用资源数量为n
n=0:资源都被占用,可用资源数量为0
n<0:资源都被占用,并且还有n个进程正在排队
那信号量拖着的那个队列就是用来放正在排队想要使用这一资源的进程

信号量伪代码

信号量的伪代码又如何实现呢
在这里插入图片描述
在代码中我们可以看到有两个对信号量的count值和阻塞队列的操作,一个是semWait,一个是semSignal,前者也被称为P操作,后者也被称为V操作。

这两个操作的用途是什么呢?
semWait我们可以理解为申请资源
semSignal我们可以理解为释放资源

在这里插入图片描述
当申请资源的时候,资源数count值-1,我们注意到资源数如果在-1之后<0,那么这个这个进程就会加入到等待队列

为什么这个条件设置成<0呢?
其实很好理解,当这个资源已经其他进程占有完了,即为0或者负数,那么新进程要申请这个资源时资源数再减1必然count<0,那么这个进程就要被被阻塞,进入阻塞队列
在这里插入图片描述

再看semSignal操作
在这里插入图片描述
一个进程终会使用完这个进程,然后离开,那么此时可用资源数+1

为什么这个条件设置成<=0呢?
一个进程用完资源走了,count++,如果还有进程在排队(count即值是-1或者更小),那+1之后必然count<=0,此时就唤醒一个排队中的进程
在这里插入图片描述

信号量解决互斥同步问题

用一个经典例子来说——生产者/消费者问题
在这里插入图片描述

  1. 首先我们分析这里有几种进程,很显然有两种:
  • 消费者
  • 生产者
  1. 分析进程之间的关系有什么:
  • 互斥关系:缓冲区是临界资源,各进程互斥访问

  • 两组同步关系
    只有缓冲区未满,生产者才能往缓冲区放产品
    只有缓冲区非空,消费者才能从缓冲区取产品

  1. 根据以上分析,写出大致的伪代码如下:

在这里插入图片描述

总结

  • semWait(S):请求分配一个资源。

  • semSignal(S):释放一个资源。

  • semWait、semSignal操作必须成对出现。

  1. 用于互斥时,位于同一进程内(初始值为1);
  2. 用于同步时,交错出现于两个合作进程内。
    (且在前事件后加semSignal,在后事件前加semWait),比如先刷牙再吃饭,那刷牙这个事件后加semSignal,在吃饭这个事件前加semWait
  • 多个semWait操作的次序不能颠倒,否则可能导致死锁。

  • 多个semSignal操作的次序可任意。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43914272/article/details/108317212

智能推荐

UnityDOTS环境搭建_unity dots项目 build步骤-程序员宅基地

文章浏览阅读608次。一.DOTS环境搭建1.首先要下载2019版本的Unity。2.创建好工程后找到Window→Package Manager→找到Entites下载下来。如下图如果搜索不到系应该Advanced选项为Show preview packages就会发现增加了许多测试包其中就包含一下所需要的Entities3.导入Entities后在Package Manager面板中找到HybridRenderer也下载下来导入工程中这个是用来显示物体的,没有这个包我们创建的物体是看不到的4.以上两个包都下载导入之_unity dots项目 build步骤

【Docker实战】批量删除指定名称的容器镜像_docker 删除名字中带有某种字符的镜像-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏7次。【场景】在学习docker的时候,经常会编译docker镜像,很多都是基于上一个Dockerfile修改编译而来,因此出现了很多REPOSITORY 和 TAG 为 none 的镜像。每次 docker images 查看镜像,都会列出一长串,有的时候一屏还展示不全,所以就想要删除某些镜像。但是一个一个删又很费时,那就只有批量删除了。【实战】使用 grep 函数查找出所有包含 none 的镜..._docker 删除名字中带有某种字符的镜像

融合3大场景,BeyondCMP多云管理平台4.0最新升级_cmp云管理平台-程序员宅基地

文章浏览阅读676次。 云计算解决方案服务商BoCloud博云正式发布了BeyondCMP多云管理平台4.0版本。该版本将资源纳管、运营维护及运营交付三大场景融合,并对每个版块内容进行了新升级,进一步满足用户需求,提升用户体验。 本次BeyondCMP4.0版本更新重点在以下几方面: 1.资源概览云管平台的资源概览功能以多个视角对平台中的所有的资源进行可视化展示,实时查看云环境下的资源保有、..._cmp云管理平台

java开发_模仿百度文库_OpenOffice2PDF_源码下载_office2pdf.openoffice2pdf-程序员宅基地

文章浏览阅读1.6k次。java开发_模仿百度文库_OpenOffice2PDF_源码下载这几天在研究模仿着做类似于百度文库的东西,在这里给大家分享一下我自己做的东西。由于需要做这样的项目,我查阅了很多资料,最后选定一下方案去做:Txt/Word/Excel/PPT=>PDF(OpenOffice+JodConverter)=>SWF(pdf2swf)=>FlexPaper浏览_office2pdf.openoffice2pdf

面部变形+基于特征的图像变形+field warping-Siggraph 1992_基于路径的图像变形算法-程序员宅基地

文章浏览阅读7.8k次,点赞5次,收藏27次。参考资料国立台湾大学-Image Morphing-Homework图像处理(十)基于特征线的图像变形-Siggraph 1992Face Morphing on Animation Producing-ntu-csie2D Image Morphing Algorithms基于特征的图像变形算法,来源于1992年的一篇论文。它是分别在两幅图像中分别选择相应的特征对(特征线段对),然后根据_基于路径的图像变形算法

JavaSE面试题-程序员宅基地

文章浏览阅读135次。1转载于:https://www.cnblogs.com/wj-gu/p/10575946.html_javase面试题

随便推点

算法题_位运算_7_将二进制整数的奇偶位互换_将一个二进制整数的奇数位翻转-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏2次。位运算--将二进制整数的奇偶位互换_将一个二进制整数的奇数位翻转

深信服安服类(安全服务/安全运营工程师)校招2023届面经_深信服安全运营工程师面试-程序员宅基地

文章浏览阅读7.7k次,点赞25次,收藏133次。近期秋招也即将结束,经过几个offer的对比,最终选择了深信服。以下我会以聊天的形式分享一些安服类岗位的面经,有想要进一步了解的同学可以评论或者私信我。感觉今年的就业形势真的不好,考研也很难,能感受到周围人的压力,同为学生我感同身受,所以希望我的分享能有些帮助,祝大家都能找到满意的工作,实现自己的目标,有一个好的人生起点。_深信服安全运营工程师面试

jmeter connect response timeout 默认超时时间_response took longer than timeout: pt30s-程序员宅基地

文章浏览阅读9.8k次。jmeter connect response timeout 默认超时时间都是0。也就是会一直等下去。jmeter 源码:public int getConnectTimeout() { return getPropertyAsInt(CONNECT_TIMEOUT, 0);}public void setResponseTimeout(String value) { ..._response took longer than timeout: pt30s

Java位运算_java 30 位运算拆开-程序员宅基地

文章浏览阅读7.4k次,点赞33次,收藏86次。在位运算前,需要先了解二进制码相关知识,详情请见博主的另一篇博文:原码、反码、补码Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节类型(byte)等类型。Java包含了七种位运算符位运算符说明>>右移运算符,符号左侧数值 按位右移 符号右侧数值指定的位数,若为正数则高位补0,若为负数则高..._java 30 位运算拆开

mysql 5.6建立数据库连接时出错_WordPress定期出现“建立数据库连接时出错”问题的解决方案...-程序员宅基地

文章浏览阅读209次。文章目录[隐藏]起因论证解决方案操作步骤先贴阿里云服务器的配置:这是一个困扰我很久的问题,之前不管是搭在CentOS还是Ubuntu上,Wordpress都会定期出现“建立数据库连接时错误”,最近一周更是每天早上网站都无法访问。通过 netstat -tunlp 发现是MySQL的进程被干掉了,service mysqld restart 还重启不了,简单粗暴点就直接reboot。不过每天早上起床..._mysql5.6 wordpress数据库连接

uni-app如何使用Unipush实现消息推送(在线&离线)-程序员宅基地

文章浏览阅读2w次,点赞8次,收藏69次。一、前期准备 在动手之前建议先看下官方文档:https://ask.dcloud.net.cn/article/id-35622__page-5 首先,在App模块配置勾选如下后,点击配置进入DCloud开发者中心 第一次进来的话,可能会要求填写相应的资料,按步骤填写即可,不做详细介绍二、在线推送 在线推送的话比较简单,坑比较少,很快就能实现 在App.vue中onLaunch生命周期中添加如下代码,其中c..._unipush

推荐文章

热门文章

相关标签