信号量机制(重要)-第二十八天

目录

前言

信号量机制

信号量S

整型信号量

记录型信号量

四个原语

实例(对于单核CPU的情况)

本节思维导图


前言

        之前我们学习了关于进程互斥的四种软件实现方法(单标志法、双标志先检查法、双标志后检查法、Peterson算法)和三种硬件实现方法(中断屏蔽方法、TS/TSL指令、Swap/XCHG指令)但是它们都存在一定的缺陷:

  1. 双标志先检查法中,进入区的"检查"、“上锁”操作无法一气呵成,从而导致了两个进程可能同时进入临界区
  2. 所有解决方案都无法实现“让权等待”

为此,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制  

信号量机制

基本概念:用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程同步

信号量S

基本概念:一个变量,可以用来表示系统中某种资源的数量(系统中只有一台打印机,就可以设置一个初始值为1的信号量)

原语: 一种特殊的程序段,其执行只能一气呵成,不可被中断(原语是由关中断/开中断指令实现的。进程互斥的软件实现方式的主要问题是“进入区和退出区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题)

一对原语:wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,括号里的信号量S其实就是函数调用时传入的参数 

wait、signal原语通常被简称为P、V操作(来自荷兰语proberen和verhogne)因此,wait(S)和signal(S)两个操作也可以写为P(S)、V(S)

整型信号量

基本概念:用一个整型数的变量作为信号量,用来表示系统中某种资源的数量

与普通整型变量的区别:对信号量的操作只有三种:初始化、P操作、V操作

//某计算机系统中有一台打印机
int S = 1;  //初始化整型信号量S,表示当前系统中可用的打印机资源数void wait(int S)   //wait原语,相当于"进入区"
{while(S <= 0); //如果资源数不够,就一直循环等待S-=1;          //如果资源数足够,则占用一个资源
}void signal (int S)//signal原语,相当于“退出区”
{S+=1;          //使用完资源后,在退出区释放资源
}
进程P0:
...
wait(S);            //进入区,申请资源
使用打印机资源...    //临界区,访问资源
signal(S);          //退出区、释放资源
... 进程P1:
...
wait(S);            //进入区,申请资源
使用打印机资源...    //临界区,访问资源
signal(S);          //退出区、释放资源
... 其他进程...进程Pn:
...
wait(S);            //进入区,申请资源
使用打印机资源...    //临界区,访问资源
signal(S);          //退出区、释放资源
... 

优点:进入区的“检查”和“上锁”、退出区的“解锁”都依靠原语一气呵成,避免了进程并发、互斥导致的问题

缺点:不满足“让权等待”原则,还是会发生“忙等”

记录型信号量

基本概念:用记录型数据结构表示的信号量:

/*记录型信号量的定义*/
typedef struct{int value;           //剩余资源数struct process *L;   //等待队列
}semaphore;
四个原语
/*某进程需要使用资源时,通过wait原语申请*/
void wait(semaphore S)
{S.value--;if(S.value < 0){block(S.L); }
}/*进程使用完资源后,通过signal原语释放*/
void signal(semaphore S)
{S.value++;if(S.value <= 0){wakeup(S.L);    }
}

block原语:剩余资源数不足,使用block原语使进程从运行态转为阻塞态,并将其挂至信号量S的 等待队列(阻塞队列)中 (S.L)

wakeup原语:释放资源后,若还有别的进程在等待这种资源,则使用wakeup原语唤醒等待队列中的一个进程,该进程从阻塞态变为就绪态

实例(对于单核CPU的情况)

有两台打印机,初始化记录型信号量S时,剩余资源数value=2、等待队列L =  NULL

/*记录型信号量的定义*/
typedef struct{int value;           //剩余资源数为2struct process *L;   //等待队列为NULL
}semaphore;

 现有四个进程要使用临界区资源(两台打印机)

!!!对于单核CPU,同一时间只运行一个进程上CPU 执行!!!

根据时间片轮转:

1、进程P0先上CPU,P0进程执行wait原语后value--变为1,不会执行block原语

2、进程P1接着上CPU,P1进程执行wait原语后value--变为0,不会执行block原语

3、进程P2接着上CPU,P2进程执行wait原语后value--变为-1,执行block原语,P2进程被挂在阻塞队列

4、进程P3接着上CPU,P2进程执行wait原语后value--变为-2,执行block原语,P2进程被挂在阻塞队列

根据时间片轮转:

1、P0可以访问临界区资源(上CPU)

2、P1可以访问临界区资源(上CPU)

3、P0执行signal原语,value++变为-1,执行wakeup原语,此时P2被唤醒(阻塞态->就绪态)P3仍为阻塞态,P0下CPU【假设此时P0已执行完毕】

4、P2可以访问临界区资源(上CPU)

5、P2执行signal原语,value++变为0,执行wakeup原语,此时P3被唤醒(阻塞态->就绪态),P2下CPU【假设此时P2已执行完毕】

6、P1接着访问临界区资源(上CPU,上一次给的时间片不够用)

7、P1执行signal原语,value++变为1,不执行wakeup原语,P1下CPU【假设此时P1已执行完毕】

8、P3可以访问临界区资源(上CPU)

9、P3执行signal原语,value++变为2,不执行wakeup原语,P3下CPU【假设此时P3已执行完毕】

本节思维导图

~over~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 知识点

ping ping 不能带协议&#xff0c;如&#xff1a;ping baidu.com 引入包顺序 分三级&#xff0c;第一级是 Python 的内置库&#xff0c;第二级是第三方库&#xff0c;第三级是自己的代码。每一级用一个空行间隔 运算符 keyError&#xff1a;key不存在 列表推导式 创建字典 字…

python实现Ethernet/IP协议的客户端(二)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议&#xff0c;它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一&#xff0c;Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端&#xff0c;可…

【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和代码

深入探索Java技术中常用到的六种加密技术和实现 背景介绍柯克霍夫原则加密机制加密类型密码学原则 加密常用代表组件加密算法介绍Base64算法消息摘要算法&#xff08;Message Digest&#xff09;数据指纹MD5MD5算法的工作原理 SHASHA工作原理 对称加密DESDES的原理分析 3DES3DE…

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

【openlayers-5】地图点、线、面等要素添加

1、添加点 //创建一个点 var point new ol.Feature({geometry: new ol.geom.Point([117.2, 35.8] ),}) //设置点的样式信息 point.setStyle(new ol.style.Style({//填充色fill: new ol.style.Fill({color: rgba(255, 255, 255, 0.2),}),//边线颜色stroke: new ol.style.Strok…

主成分分析(PCA):探索数据的核心

文章目录 前言1. 什么是 PCA &#xff1f;2. PCA 的原理2.1 协方差和方差2.2 核心思想2.3 步骤 3. PCA 的应用场景4. PCA 的优缺点5. 示例&#xff1a;人脸识别5.1 完整代码5.2 运行结果 结语 前言 当今社会&#xff0c;数据无处不在。从社交媒体到金融交易&#xff0c;从医疗…

Valheim英灵神殿2456-2457-2458端口TCP和UDP开通

Valheim英灵神殿游戏需要开启云服务器2456、2457和2458三个端口&#xff0c;端口的TCP和UDP协议均要开通&#xff0c;云服务器吧yunfuwuqiba.com分享来详细说下Valheim英灵神殿游戏服务器端口说明&#xff1a; Valheim英灵神殿服务器端口 Valheim英灵神殿游戏要使用云服务器的…

以元旦为题的诗词(三)

愿新的一年给我们带来无尽的好运和幸福愿我们的梦想在新的起点绽放! 让我们在未来的日子里书写新的篇章! 接着分享几首以元旦为题的几首诗&#xff0c;喜欢的朋友可以自取&#xff0c;想要更多免费的诗词&#xff0c;请自行百度或小程序搜索&#xff1a;美诗计 元旦 元旦佳节…

Nginx(十五) proxy_pass和proxy_redirect指令的组合测试

Nginx反向代理配置文件参数详解请参考 Nginx(十三) 配置文件详解 - 反向代理&#xff08;超详细&#xff09; 测试1&#xff1a;proxy_redirect http://127.0.0.1:8080/three/ http://www.read*******l.cn:8688/four/; http {server {listen 8688;server_name www.read****…

Ps:亮度蒙版 - 混合颜色带方法

所谓“亮度蒙版”&#xff0c;就是根据图像的明暗程度进行选区并建立蒙版&#xff0c;这样便于对图像上进行分级调色。 Photoshop 支持众多的第三方亮度蒙版插件。如&#xff0c;TKActions、Lumenzia、ADP Pro、Raya Pro、LIM、EasyPanel、Introducing InstaMask等等。如此多的…

【C语言】Windows上用GTK写GUI程序

要使用GTK开发一个Windows图形用户界面程序&#xff0c;需要首先设置GTK开发环境。这通常包括安装GTK库和它的依赖&#xff0c;以及配置编译器和工具链。可以选择使用纯C语言和GTK库或者使用支持GTK绑定的其他语言&#xff0c;如Python、C或Rust。 1. 安装GTK开发库 在Window…

JVM 常用知识和面试题

1. 什么是JVM内存结构&#xff1f; jvm将虚拟机分为5大区域&#xff0c;程序计数器、虚拟机栈、本地方法栈、java堆、方法区&#xff1b; 程序计数器&#xff1a;线程私有的&#xff0c;是一块很小的内存空间&#xff0c;作为当前线程的行号指示器&#xff0c;用于记录当前虚拟…