【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作

【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作本篇帖子继续上篇。有兴趣可以点击链接进行查看以前写过的文章。【系统架构设计师】第一章:操作系统(1.2.2)参考教材:《系统架构设计师考试全程指导(第二版)》《系统架构设计师教程》1.2.2信号量与pv操作pv操作指的是两个:p操作和v操作。有时候我们的进程在工作的时候,需要同时配合来干多件事情。比如,我们规定一个进程用来写入数据,另一个进程用来读取数据。很显然,这连个进程是不能互相干扰的…

大家好,又见面了,我是你们的朋友全栈君。

本篇帖子继续上篇。有兴趣可以点击链接进行查看以前写过的文章。
【系统架构设计师】第一章:操作系统(1.2.2)
参考教材:
《系统架构设计师考试全程指导(第二版)》
《系统架构设计师教程》

1.2.2 信号量与pv操作

pv操作指的是两个:p操作和v操作。

有时候我们的进程在工作的时候,需要同时配合来干多件事情。比如,我们规定一个进程用来写入数据,另一个进程用来读取数据。

很显然,这连个进程是不能互相干扰的,因此我们就需要提前对系统进行一下告知:使用这些资源的权力我先占用了,其他人不要进来。

系统得知以后,如果有其他进程要写入数据或者读取数据,就会被系统安排成等待态。
等我们的进程使用资源完成以后,在告知系统,其他进程可以使用这些资源。

告知系统不要让其他进程操作这片内存的操作,就是p操作。
告知系统此进程已使用内存完毕,就是v操作。

我们因此可以得出使用pv操作的目的:
为了解决不同进程的互斥(都需要共享独占性资源时)和同步(完成异步的两个进程的协作)问题,需要使用pv操作。

想想看,如果是你,你会怎么用代码的方式解决呢?

我这里用的是c语言的方式。

首先,我们要有一个变量s。
在pv操作中被称为信号量,表现形式是一个整数s和一个队列。你可以姑且认为这是个整形变量。
当s>=0,代表某个资源的可用数;
当s<0,其绝对值代表阻塞队列中等待该资源的进程数。

其次是p操作。
根据我们开始所说,p操作就是告知系统这片资源已经被使用,因此只要在本来的资源数上减1即可。不过我们要考虑一种情况,就是当可用资源为0或负数的时候,那么就要让程序进入等待。
所以我们可以得出:

if((s=s-1)<0){ 
   
	printf("执行p操作的进程进入等待");
}

最后是v操作。
这个同理,减一换成加一即可。

if((s=s+1)<=0){ 
   
	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
}

互斥实例

说了这么多,先来个实例,比如,对两个进程进行互斥控制。
我这里给了两个程序。
这两个程序是同时运行的,并且变量s是共享的,且初值为1。为了省事,这里我就简写了,省去了main之类的格式。

我对p和v进行了一些小的修改,这样更符合c语言的标准。

p:

if((s=s-1)<0){ 
   
	printf("执行p操作的进程进入等待");
	return 0;
}
else{ 
   
	return 1;
}

v:

if((s=s+1)<=0){ 
   
	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
	return 0;
}
else{ 
   
	return 1;
}

进程A

while(1){ 
   
	if(p(s)){ 
   
		printf("操作一下");
	}
	v(s)
}

进程B

while(1){ 
   
	if(p(s)){ 
   
		printf("操作二下");
	}
	v(s)
}

仔细分析。
我们这里先说明一个前提,即使我们的程序同时运行,由于某些特殊的原因,是不可能真正的同时启动的,稍微会有一些误差,比如某个进程会晚0.00000000001秒。我们这里就假设A进程是比较快的那个。

第一次循环时,A先执行了p,然后s自减,输出了“操作一下”。

此可我们的B启动,也执行了p,注意此可A还没有执行V,也就是说s还没有自增。由于我们的s已经从1自减到了0,再次执行,s=-1,if不成立,什么都不输出。

当A执行完成v操作以后,我们的B已经到了第二轮,此可if成立,所以输出了“操作二下”。

以此类推,你会发现,A和B永远都时一个执行,另一个就跳过。这样,我们就使用pv操作对进程的互斥。

同步实例

同步也是类似的操作。直接上例程。不过这次比较特殊,需要用到两个信号量,s1=1和s2=1。
p:

if((s=s-1)<0){ 
   
	printf("执行p操作的进程进入等待");
	return 0;
}
else{ 
   
	return 1;
}

v:

if((s=s+1)<=0){ 
   
	printf("从阻塞队列中唤醒一个其他处于阻塞态的进程");
	return 0;
}
else{ 
   
	return 1;
}

进程A

while(1){ 
   
	if(p(s1)){ 
   
		printf("操作一下");
	}
	v(s2)
}

进程B

while(1){ 
   
	if(p(s2)){ 
   
		printf("操作二下");
	}
	v(s1)
}

仔细分析。

这个其实A和B无论是否同时运行都行。

假设我们的A先运行,执行第一遍的时候没什么问题,正常输出“操作一下”。

但是当执行第二遍的时候,你会发现,A不会输出了,因为我们的s1从开始循环第二遍的0变成了-1,所以此刻if时不成立的。

而当我们运行B的时候,B执行v(s2),最终将p增到1,A才会继续走。

这样,我们就完成了进程之间的同步。

本篇内容主要介绍的是pv操作的一些细节。
下一节已更新。
【系统架构设计师】第一章:操作系统(1.2.3)死锁问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159780.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 修改ntp服务器地址,修改ntp服务器地址

    修改ntp服务器地址,修改ntp服务器地址修改ntp服务器地址内容精选换一换修改子网名称、DNS服务器地址等。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。本小节的操作步骤指导以此入口为例。已解耦:在进入“网络>虚拟私有云”后,在左侧导航栏直接选择“子网”,可对子网进行操作。登录管理控制台。在管理控制台左上角单击,选择区域和项目网关创建成功以后,…

    2022年6月14日
    29
  • ppt导出pdf后非矢量图图片失真的解决办法

    ppt导出pdf后非矢量图图片失真的解决办法背景明明有了高清的图片,为什么导入PPT后图像反而模糊了?导出pdf后图片更是惨不忍睹?今天为了解决这个问题,我又折腾了一会儿。准备AdobeAcrobatproPPTPhotoZoom获得高清图片一般用别的软件导出图片可以调节格式分辨率,采用矢量图或者分辨率高的位图就可以,然而从网上获取的图片就没办法了。这时候你需要一款经久不衰的神器,PhotoZoom。他界面是这样的,可以方便的

    2022年6月5日
    115
  • 安防摄像头已分别接入乐橙云、萤石云,如何实现私有云平台的统一管理与向上级联?

    安防摄像头已分别接入乐橙云、萤石云,如何实现私有云平台的统一管理与向上级联?一、背景分析科技创新对社会发展的重要性不言而喻。对于安防行业来说,人工智能和5G等新技术的应用,已经成为推动智能安防发展的一块关键踏板。从技术维度来看,人工智能、云计算、大数据、物联网等技术在安防视频监控领域产生了较多的交汇与融合。新技术打破了传统安防产业以硬件为主的局面,带来了软件定义的摄像机、云平台等概念。芯片技术不断进步,AI算力成本有所降低;深度学习算法及相关框架、开源软件的成熟使得AI算法普惠化;GB/T28181、ONVIF等行业标准的成熟,降低了视频图像数据互联互通的难度;H.265/

    2022年6月9日
    86
  • pytchram企业版的激活码【在线注册码/序列号/破解码】

    pytchram企业版的激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    27
  • MobSF 框架安装使用部署

    MobSF 框架安装使用部署1.MobSF简介#MobSF是MobileSecurityFramework的缩写,这是一款智能化的开源移动应用(Android、IOS、Windows)测试框架,可以对应用进行动态、静态分析,现在只支持Android动态分析。支持对APK、IPA文件及源码压缩包进行审计分析,可以对Android和IOS安全进行分析。MobSF还可以通过APIFuzzer功能,对WebAPI的安全检测,可以对应用收集信息、分析安全头部信息、识别移动API的具体漏洞,如XXE、SSRF、路径遍历,IDOR以及

    2022年5月31日
    35
  • gawk

    gawk简介awk报告生成器,作用格式化文本输出:awk分为awk.nawk.gawk。但是linux上的awk为gawk基本用法gawk[options]'program'

    2022年8月3日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号