信号量机制

1965年,由荷兰学者迪科斯彻Dijkstra提出(P、V分别代表荷兰语的Proberen (test)和Verhogen (increment))、是一种卓有成效的进程同步机制。

信号量-软件解决方案

  • 保证两个或多个代码段不被并发调用
  • 在进入关键代码段前,进程必须获取一个信号量,否则不能运行
  • 执行完该关键代码段,必须释放信号量
  • 信号量有值,为正说明它空闲,为负说明其忙碌

信号量的类型可分为

  • 整型信号量
  • 记录型信号量(最为常用)
  • AND型信号量
  • 信号量集

信号量机制介绍

1、整型信号量

用一个整数型的变量 "S"作为信号量,用来表示系统中某种资源的数量。

wait(S) :
while S<=0; /*do no-op*/ 
    S:=S-1;

signal(S):
    S:=S+1;
  • 提供两个不可分割的[原子操作]访问信号量
  • Wait(s)又称为P(S)
  • Signal(s)又称为V(S)
  • 缺点:进程忙等 

2、记录型信号量

  • 为了解决“忙等”问题,而提出的信号量。
  • 每个信号量S除一个整数值S.value外,还有一个进程等待队列S.list,存放阻塞在该信号量的各个进程PCB
  • 信号量只能通过初始化和两个标准的原语PV来访问--作为OS核心代码执行,不受进程调度的打断
  • 初始化指定一个非负整数值,表示空闲资源总数(又称为"资源信号量")-- 若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数
typedef struct {
    int value;
    stuct process_control_block *list;
}semaphore;

相应地,wait(S)和signal(S)操作可描述为:

wait(semaphores *S) {  //请求一个单位的资源
    S->value --;  //资源减少一个
    if (S->value<0) block(S->list)  //进程自我阻塞
}

signal(semaphores *S){  //释放一个单位资源
    S->value++;  //资源增加一个
    if (S->value<=0) wakeup(S->list);  //唤醒等待队列中的一个进程
}

3、AND型信号量

  • AND型信号量同步的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部分配给进程,待进程使用完后再一起释放
  • 对若干个临界资源的分配,采用原子操作。
  • 在wait(S)操作中增加了一个 “AND” 条件,故称之为AND同步,或同时wait(S)操作,即Swait(Simultaneous wait)。

4、信号量集

  • 在记录型信号量中,wait或signal能对某类临界资源进行一个单位的申请和释放,当需要对N个单位进行操作时,需要N次wait/signal操作,效率低下
  • 扩充AND信号量:对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放
    • 进程对信号量Si的测试值是该资源的分配下限值ti,即要求Si≥ti,否则不予分配。一旦允许分配,进程对该资源的需求值为di,即表示资源占用量,进行Si= Si-di操作
    • Swait(S1, t1, d1, ..., Sn, tn, dn)
    • Ssignal(S1, d1, ..., Sn, dn)

信号量的应用

1、利用信号量实现进程互斥

        key:设置互斥信号量

        为使多个进程能互斥地访问某临界资源,只须为该资源设置一个互斥型信号量mutex,并设其初值为1,然后将各进程访问该资源的临界区置于wait(mutex) 和signal(mutex)操作之间即可。
        这样,每个欲访问该临界资源的进程,在进入临界区之前,都要先对mutex执行wait操作。若该资源此刻未被访问,则本次wait操作必然成功,进程便可进入自己的临界区,这时若再有其他进程也欲进入自己的临界区,则由于对mutex执行wait操作定会失败,因而该进程阻塞,从而保证了该临界资源能被互斥地访问。当访问临界资源的进程退出临界区后,又应对mutex执行signal操作,以便释放该临界资源。

利用信号量实现两个进程互斥的描述如下。

  1. 设mutex为互斥型信号量,其初值为1,取值范围为(-1,0,1)。当mutex=1时,表示两个进程皆未进入需要互斥访问的临界区;当mutex=0时,表示有一个进程进入临界区运行,另一个必须等待,挂入阻塞队列;当mutex=-1时,表示有一个进程正在临界区运行,而另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程在退出时唤醒。
  2. 代码描述:
    semaphore mutex=1;  //初始化为1
    
    PA(){
        while (1){
        wait (mutex);
        临界区;
        signal (mutex);
        剩余区;
        }
    }
    
    PB(){
        while (1){
        wait (mutex);
        临界区;
        signal (mutex);
        剩余区;
        }
    }
    

在利用信号量机制实现进程互斥时应注意,wait(mutex) 和 signal(mutex)必须成对出现。缺少wait(mutex)将会导致系统混乱,无法保证对临界资源的互斥访问;缺少signal(mutex)将会导致临界资源永远不被释放,从而使因等待该资源而阻塞的进程不能被唤醒。

2、利用信号量实现前趋关系

main (){
Semaphore a,b,c,d,e,f,g;

a.value=0;b.value=0;c.value=0;
d.value=0;e.value=0;f.value=0;g.value=0;

cobegin
    { S1 ;signal(a);signal(b); }
    { wait(a);S2;signal(c);signal(d);}
    { wait(b);S3;signal(e); }
    { wait(c);S4;signal(f); }
    { wait(d);S5;signal(g); }
    { wait(e);wait(f);wait(g);S6; }
corend
}

3、利用信号量实现进程同步

        key:设置同步信号量

        假设进程P1和P2中有两段代码C1和C2,若要强制C1先于C2执行,则须在C2前添加wait(S),在C1后添加signal(S)。需要说明的是,信号量S的初值应该被设置为0。这样,只有P1在执行完C1后,才能执行signal(S)以把S的值设置为1。这时,P2执行wait(S)才能申请到信号量S,并执行C2。如果P1的C1没有提前执行,则信号量S的值为0,P2执行wait(S)时会因申请不到信号量S而阻塞。

  1. 设S为同步型信号量,其初值为0,取值范围为(-1,0,1)。当S=0时,表示C1还未执行,C2也未执行;当S=1时,表示C1已经执行,C2可以执行;当S=-1时,表示C2想执行,但由于C1尚未执行,C2不能执行,进程P2处于阻塞状态。
  2. 代码描述:
    semaphore S=0;  //初始化为0
    
    P1() {
        while (1) {
            C1
            signal(S);
            ...
        }
    }
    
    P2() {
        while (1) {
            wait(S);
            C2 ;
            ...
        }
    }
    

同步型信号量的使用通常比互斥型信号量的使用要复杂。一般情况下,同步型信号量的wait(S)和signal(S)操作位于两个不同的进程内。

Examples

1、请思考互斥与同步的关系,它们有哪些地方相同?哪些地方不同?

相同之处:

  1. 目的:互斥和同步都是为了协调多个进程对共享资源的访问,以避免竞争条件和数据不一致性。
  2. 都可以通过信号量、互斥锁等机制来实现。

不同之处:

  1. 定义:互斥是指在任意时刻只允许一个进程访问共享资源,而同步是指协调进程之间的交互和通信,确保它们按照一定顺序执行
  2. 目标:互斥的目标是防止多个进程同时访问共享资源,而同步的目标是确保进程按照特定顺序执行,或者在某个条件满足时进行通信和协调。
  3. 实现方式:互斥通常使用互斥锁或信号量来实现,而同步可以使用信号量、条件变量、屏障等机制来实现。

2、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,妈妈可向盘中放香蕉,儿子专等吃盘中的香蕉,女儿专等吃盘中的苹果,请按照要求回答:

        (1)本题中存在哪些互斥关系和同步关系?

        (2)试用P、V操作描述放水果和吃水果的过程。

答: (1)在本题中,盘中一次只能放一个水果;妈妈和爸爸对盘子的使用存在互斥关系,所以需要设互斥信号量mutex;爸爸和女儿,妈妈和儿子都是同步关系,需设置同步信号量apple, banana

        (2)设置信号量mutex, apple, banana,初值分别为100。分别表示可否向盘中放水果,可否取苹果,可否取香蕉。

代码段如下:   

Father(){   
    while (true){
        p(mutex);  //申请盘子使用权
        将苹果放入盘子;
        v(apple);  //苹果产品+1
    }
}

Mother(){  
    while (true){
        p(mutex);  //申请盘子使用权
        将香蕉放入盘子;
        v(banana);  //香蕉产品+1
    }
}

son(){  
    while (true){
        p(banana);  //申请香蕉资源,若非空
        从盘子取香蕉;
        v(mutex);   //盘子空了,释放盘子使用权
        吃香蕉;
    }
}

daugher(){  
    while (true){
        p(apple);  //申请苹果资源,若非空
        从盘子取苹果;
        v(mutex);  //盘子空了,释放盘子使用权
        吃苹果;
    }
}

3、公共汽车上有1名司机和1名售票员,司机和售票员活动如下,车辆运行规则是只有到站停车后售票员才能开门,只有关门后司机才能启动车辆。初始状态是车辆停在起始站。使用P、V原语描述车辆运行过程。

分析:本例中存在同步关系,即只有售票员关门后司机才能启动车辆;只有司机到站停车后售票员才能开门;

故设置:

        司机的同步信号量: S1表示是否允许司机启动车辆,初值为0

        售票员同步信号量: S2表示是否允许售票员开门,初值为1

则车辆运行过程描述如下:

driver:
    while (true){
        P(S1);//申请启动车辆,若标志为1,则可以启动
        启动车辆;
        正常运行;
        到站停车;
        V(S2);
    }

conductor:
    while (true){
        P(S2); //申请开门,若标志为1,则可以开门
        开门;
        售票;
        关门;
        V(S1);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/316000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录一个Insert姿势引起的MySQL从库上查不到数据的问题

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 某测试环境的MySQL用了两台节点&#xff0c;主从同步结构。忽然有研发同学反映说MySQL的主从不同步了。他…

数据分析实战丨基于flask+pygal可视化分析sqlite中的数据

文章目录 写在前面实验目标项目框架实验内容1.配置实验环境2.查看sqlite3数据库的数据3.创建项目文件4.编写代码5.运行项目 运行结果写在后面 写在前面 本期内容&#xff1a; 基于FlaskPygal可视化分析Sqlite3中的数据 实验环境&#xff1a; pythonpygalflask 项目下载地址…

浅析链表结构

一、单向链表 C语言中数组是常用的一种数据类型&#xff0c;但可惜数组长度是固定大小的&#xff0c;不能动态扩展&#xff0c;使用起来有时不是很方便。然后就有了自定义的动态数组结构&#xff0c;动态数组就比较好用了&#xff0c;长度可以任意扩展&#xff0c;但还有一个问…

2024阿里云服务器ECS介绍_全方位解析_CPU性能详解

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Ubuntu 在线Swap扩容

1. 查看本机swap空间 free -h 2. 找一个较大的高速盘&#xff0c;创建swap的空间 mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs50M count1k3.建swapfile&#xff0c;大小为bs*count 50M * 1k 50G 4.标记为Swap文件&#xff0c;让系统能识别交换文件。 sudo mk…

C1-3.2 关于‘神经网络’

C1-3.2 关于‘神经网络’ 【注释】 彩色图像&#xff08;RGB&#xff09;由三原色构成&#xff0c;二维图像在任意一个点像素为立体三层结构&#xff0c;分别是红色、绿色、蓝色值&#xff0c;该值的范围在0∽255之间 1、全连接神经网络——整体架构 【注释】&#xff1a; …

科技顶天,市场立地 。璞华科技“顶天立地”的成长之路

科技顶天&#xff0c;市场立地。 几十年来&#xff0c;我们越来越深刻地认识到&#xff0c;这就是真理&#xff0c;质朴而深刻。尤其在当前特殊的国际国内商业环境中&#xff0c;这一理念不但没有过时&#xff0c;反而恰逢其时。有这么一家企业&#xff0c;一直践行“科技顶天…

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】

分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】 目录 分类预测 | Matlab实现RP-LSTM-Attention递归图优化长短期记忆神经网络注意力机制的数据分类预测【24年新算法】分类效果基本描述模型描述程序设计参考资料 分…

2023极客大挑战web小记

拿到题目提示post传参还以为是道签到题 刚开始直接把自己极客大挑战的username以及password怼上去&#xff0c;但是不对。看看F12&#xff0c;有提示。 当一个搜索蜘蛛访问一个站点时&#xff0c;它会首先检查该站点根目录下是否存在robots.txt&#xff0c;如果存在&#xff0c…

近视的孩子用什么灯?学生考研护眼台灯推荐

随着时代快速发展&#xff0c;2022年我国近视人数达到了7亿&#xff0c;呈现低龄化趋势&#xff0c;儿童及青少年人数占了53.8%。现在学业负担都很重&#xff0c;每个家长都不希望自己的孩子近视或加深近视了&#xff0c;都会想尽一切办法保护视力。而护眼台灯就成了家长购买台…

智能路由器中的 dns.he.net可使用自定义域名的免费 DDNS 服务配置方法

今天介绍的这个是可以使用自定义域名同时支持使用二级域名的免费DDNS服务 dns.he.net的动态DDNS服务的配置方法, 这个服务相对还是比较稳定的, 其配置也和其他的DDNS服务有些不太一样, 首先他的主机名: 这里需要设置为登录后分配的区域域名: ipv6.he.net 然后就是 DDNS 用户…

Git新手?这篇文章带你飞!基础操作一网打尽!

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读Git初识Git啥是版本控制系统&#xff1f;&#xff1f;集中式VS分布式 git使用…

录屏怎么打开?看这里,录制视频不费事!

随着科技的快速发展&#xff0c;录屏已经成为人们日常生活中经常使用的功能。无论是录制游戏视频、教程讲解&#xff0c;还是录制在线会议&#xff0c;录屏软件都发挥着重要作用。然而&#xff0c;很多用户并不知道录屏怎么打开&#xff0c;以及如何使用它们。本文将介绍两种常…

【书生·浦语】大模型实战营——第四课作业

教程文档&#xff1a;https://github.com/InternLM/tutorial/blob/main/xtuner/self.md 基础作业需要构建数据集&#xff0c;微调模型&#xff0c;让其明白自己的弟位&#xff08;OvO&#xff01;&#xff09; 微调环境准备 进入开发机后&#xff0c;先bash&#xff0c;再创…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

应急管理蓝皮书 |《应急预案数字化建设现状和发展建议》下篇

导读 《应急预案数字化建设现状和发展建议》&#xff1a;297-313页 《中国应急管理发展报告》系列蓝皮书由中央党校&#xff08;国家行政学院&#xff09;应急管理培训中心&#xff08;中欧应急管理学院&#xff09;联合社会科学文献出版社研创出版&#xff0c;本着“权威前沿…

RT-Thread I/O设备模型

I/O设备模型 绝大部分的嵌入式系统都包括一些I/O&#xff08;Input/Output&#xff0c;输入/输出&#xff09;设备&#xff0c;例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的Flash或SD卡&#xff0c;以及网络设备的以太网接口等&#xff0c;都…

Linux 内核学习 3a - 如何查看虚拟内存和物理内存,以及虚拟内存和物理内存之间转换

/proc/iomem, ioremap(), mmap() The kernel manages device resources like registers as physical addresses(物理地址). These are the addresses in /proc/iomem. The physical address is not directly useful to a driver; it must use ioremap() to map the space and …

linux安装MySQL5.7(安装、开机自启、定时备份)

一、安装步骤 我喜欢安装在/usr/local/mysql目录下 #切换目录 cd /usr/local/ #下载文件 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz #解压文件 tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local …

【电路电子学】7天速通攻略+笔记

7天是 看视频记笔记刷题的总时长&#xff0c;时间紧迫的同学可以看情况进行缩减。个人认为做题&#xff0c;尤其是解析齐全的题最重要&#xff01; 我校所用教材 《电路与电子学基础》唐胜安 复习总流程 所用材料&#xff08;都可自行找到免费资源&#xff09; 视频知识点讲…