挑战408——操作系统(10)——信号量与PV操作

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

处理同步和互斥的问题,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制
信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步和互斥的。
根据信号量的数据类型不同,我们将信号量分为整型信号量和记录型信号量

整型信号量

整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当用整型信号量用于互斥的时候,S被初始化为1,表示临界资源不能被多个进程同时访问。wait,signal操作代表表示如下:

//整型信号量
int s;
wait(s){
	while(s < 0){
//若s的初值为1,下面的语句就会使s = 0,表示可用此时没有可用资源数
//所以此刻申请该资源进程就会阻塞,也就是不允许多个进程同时使用
//这就是为什么用于互斥的时候,互斥信号量要设置为1
		s = s - 1;
	}
}//相当于p操作,进程申请一个资源

而对于signal操作:

signal(s){
	s = s + 1;
}//与wait操作相反,表明这个时候释放一个资源
记录型信号量

但是当多个进程需要访问该资源的时候,如何解决呢?
记录型信号量中,包括一个整型的数值S,代表可用的资源数和一个进程链表queue,用于链接所有等待该资源的进程,定义其数据结构如下:

struct semaphore{
	int value;//代表可用的资源数
	struct PCB *queue;//用于链接所有等待该资源的进程
}

信号量只能通过两个原语操作(P,和V)来访问它们,而PV对应的代码操作如下:

/P操作的代码表示
void wait(semaphore s){
	s.value = s.value - 1;//可用资源数减一
//若可用资源数小于0,阻塞该进程,并投入等待队列(注意不是就绪队列)
	if(s.value < 0) block(s.queue);
}


//V操作的代码表示
void signal(semaphore s){
	s.value = s.value + 1;//可用资源数加一
	//若此时s.value <=0,表明在等待队列中有等待该资源的进程被阻塞
	//故将其从等待队列中唤醒,并投入到就绪队列中
	if(s.value <= 0) wakeup(s.queue);
}

显然我们可以得出这样一个结论:P操作意味着释放一个资源,V操作意味着释放一个资源。当s.value <= 0时,其|s.value <= 0|的值代表的是等待队列中等待该资源的进程数。如s.value = -8,那么表示等待队列中有8个进程正在等待这个临界资源,s.value = 0,则表示资源刚好使用完毕。

利用信号量解决互斥问题

看一个程序段:

//程序P1
{
	R1 = COUNT;
	R1 = 1;
	COUNT = R1;
}

//程序P2
{
	R2 = COUNT;
	R2 = 1;
	COUNT = R2;
}

假设两段程序共享一个变量COUNT,那么如果程序并发执行,则可能出现两种结果,COUNT = 6或者COUNT = 7;(就不分析了),但是结果肯定是唯一的。造成这个原因我们之前说过,就是因为P1在访问临界资源count的时候,P2也在访问,导致前后的值不一致。所以解决的方法就是当其中一个进程在访问的时候,将这个变量保护起来。我们就用信号量机制来表示一下;
下面的代码是我假设执行顺序是P1 -> P2.,过程看我的注释。反过来的分析是一样的

semaphore mutex = 1;//设置初始互斥信号量为1

//程序P1
{
	P(mutex);//申请一个资源,此时mutex -=1(即 = 0)
//下面的三句代码是P1的临界区	
	R1 = COUNT;
	R1 = 1;
	COUNT = R1;
	//释放一个资源,此时mutex += 1,即恢复1
	v(mutex);
}

//程序P2
{
	//申请一个资源,此时如果P1在使用,那么mutex = 0进程阻塞
	//下面的代码都不执行。知道mutex的值大于0为止()即P1释放
	//相应资源的时候
	P(mutex);
	//P2的临界区
	R2 = COUNT;
	R2 = 1;
	COUNT = R2;
	//释放资源
	V(mutex);
}

这样,无论按什么样的执行顺序,COUNT的结果都是7,实现了可再现性。
注意,在解决互斥问题的时候,申请(P)的资源最后一定要释放(V)出来,否则后序的进程不能执行

信号量解决同步问题

同步,是指进程间要按照一定的顺序进行。有些程序并不满足并发的条件(比如我们前面举过的例子),因为后面的进程推进必须依赖前面进程的结果。因此必要的时候要控制进程的先后执行顺序。
我们通常用前驱图来表示进程间的同步关系。如下图:
在这里插入图片描述
显然,我们知道P2,P3可以并发执行,但是P2和P4却不可以。我们用PV操作来描述这一过程(我们一开始设置信号量S1 = S2 = S3 = 0)

分析:
对于P1,它是进程的起始,一定要先于P2,P3,P4执行,而P2,P3并发执行,都要用到P1所提供的资源。所以P1才会先执行代码,然后释放两个资源供P2,P4使用.这里有个问题,就是为什么设置信号量为0?因为我们第一步要V(s1),初始值为0,V一下就加1,这个时候才有资源给P2去申请(P)。
对于P2,它先向P1申请到要的资源后,进入临界区运行,然后释放资源给P4继续运行。
对于P3,P4,他们都顺利申请到了想要的资源,但是不再释放资源了,因为已经没有了后续需要使用资源的进程了。
所以,我们可以得出结论,PV操作是成对出现的,有对某个资源的P操作,就一定要对某个资源的V操作

操作系统——信号量机制(PV操作 学习PV时,不要一头钻到代码里,要注意理解信号量背后的含义,一个信号量对应一种资源,信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量。 P就是wait操作,等待资源,V就是++操作,释放资源 首先我们要明白S1、S2、S3的含义,S1就是盘子里的资源情况,起始一个水果,为1;S2为儿子所拥有资源情况(橘子),初始他没有拿到水果,故初始时S2=0;S3为女儿的拥有资源情况(苹果)。 ①由于目S1为1,所以这一空先请求资源,让孩子们吃水果,所以P 阅读详情

相关推荐

#PV操作#408系列

【知识回顾】PV操作 生产者-消费者问 【问】多个生产者进程和多个消费者进程共享一个初值为空、大小为n的缓冲区(临界资源)。 只有缓冲区没满,生产者才能放东西进缓冲区,否则等待; 只有缓冲区不空,消费者才能从缓冲区取东西,否则等待。 【分析】 【第一步:关系分析】生产者和消费者对缓冲区互斥访问是互斥关系;只有生产者生产后消费者才能消费,所以生产者和消费者也是同步关系。 【第二步:信号量设置】 mutex:互斥信号量,控制互斥访问缓冲区,初值=1; full:同步信号量,表示当前缓冲区的

发现问题,并解决问题,批判性思维 3878

一个P,V操作的习

目:在一个盒子里,混装了数量相等的黑白围棋子。现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1 和P2 ,其中P1 拣白子;P2 拣黑子。规定每个进程每次只拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣。试写出两进程P1 和P2 能并发正确执行的程序。

yangkuiwu的博客 1万+

操作系统信号量练习

信号量练习信号量练习信号量练习信号量练习信号量练习

408王道操作系统强化——PV解构

1.解思路 2.生产者 - 消费者 3.理发师 4.读者 - 写者 5.哲学家进餐 6.读者 - 写者(写优先) 7.读者 - 写者(读写公平)

JiangNan_1002的博客 1万+

PV操作经典例

进程同步——PV操作

道阻且长 心态要好 1万+

macosx 不允许无名信号量_挑战408——操作系统10)——信号量PV操作

处理同步互斥的问,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制。 信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步互斥的。 根据信号量的数据类型不,我们将信号量分为整型信号量和记录型信号量。整型信号量整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当用...

weixin_32380501的博客 140

试利用记录型信号量pv操作写出_挑战408——操作系统10)——信号量PV操作...

处理同步互斥的问,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制。 信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步互斥的。 根据信号量的数据类型不,我们将信号量分为整型信号量和记录型信号量。整型信号量整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当用...

weixin_39849800的博客 582

27考研408操作系统强化指南:核心考点、PV操作内存管理实战

操作系统是计算机系统的核心,负责管理硬件资源并为应用程序提供运行环境。其核心原理包括进程管理、内存分配、文件系统和I/O控制,通过抽象和虚拟化技术,实现了多任务并发、内存高效利用和数据持久化存储。理解这些原理对于构建稳定、高效的软件系统至关重要,尤其在需要处理高并发、资源调度和性能优化的场景下,如服务器开发、嵌入式系统和分布式计算。在考研408的强化复习中,**进程同步互斥PV操作)** 和 **虚拟内存页面置换** 是两大核心难点高频考点。本文聚焦于如何将抽象的操作系统概念转化为具体的解能力,针

weixin_30715523的博客 475

挑战408——操作系统(9)——进程同步互斥

操作系统中的并发进程有些是独立的有些需要相互协作,独立的进程在系统中执行不影响其他进程,也不被其他进程影响(因为他们没有共需要一起用到的资源)。而另外一些进程则需要其他进程共享数据,以完成一项共的任务。 因此,为了保证操作系统的正常活动,使得程序的执行具有可再现性,保证执行结果的正确性。操作系统必须为这种协作的进程提供某种机制。 进程间的协作关系分为:互斥同步,通信。(实习面试的时候,有个...

redAnt的博客 1618

挑战408——操作系统(11)——多角度看生产者消费者问

对于信号量的使用,主要是如何选择信号量和如何安排pv操作在程序中的位置。下面来分析一下经典的生产者消费者问。教材的说法有点过于笼统了,我就用自己的语言来重新描述一遍。 生产者——消费者问描述:有两组进程共享一个环形的缓冲池,其中的一组进程称为生产者,另一组进程称为消费者。缓冲池由若干个大小相等的缓冲区组成,每一个缓冲区都可以容纳一个产品。生产者进程不断的将生产的产品放入到缓冲池中,消费者...

redAnt的博客 927

挑战408——操作系统(16)——进程管理刷(2)

本节刷内容:进程管理 库来源:408,王道教材,百度文库 涉及的知识点: 进程线程 进程状态转换 进程控制 进程通信 进程调度 补充知识点 抽屉原理 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合...

redAnt的博客 1379

挑战408——操作系统(13)——死锁(deadlock)

死锁,可以定义为一组竞争系统资源或者相互通信的进程,相互的“永久性“”的阻塞,若无外力作用,这组进程将永远没有办法继续执行。很遗憾,目前这种问没有一种有效的通用解决方案。 这里对于死锁的定义理解要注意死锁的对象——一组进程,相互竞争。如果是一个进程可能长期或者永久性得不到执行,那么这个进程是处于饥饿状态而不是死锁。时,饥饿 ≠死锁!,饥饿现象只是死锁的一种结果,就是说由于死锁的出现,导致了死锁...

redAnt的博客 839

挑战408——操作系统(12)——进程通信,管程介绍

PS:这部分内容考的比较少,了解实例就好 进程间的通信,要解决的问进程之间信息的交流问。根据交流信息量的大小,我们将通信分为低级通信和高级通信两种。 低级通信中,进程中只能传递状态跟整数值,比如我们刚刚提到的PV操作。 高级通信中,进程能传递任意数量的数据,传递的信息大。 下面主要谈一些高级通信机制。 进程通信的类型 高级进程之间的通信机制主要分为三种: 共享存储器系统,消息传递系统,管道通...

redAnt的博客 1255

操作系统核心原理考研实战:从进程管理到文件系统的深度解析

操作系统作为计算机系统的核心软件,其核心目标是高效、公平地管理硬件资源并为上层应用提供稳定环境。其基本原理围绕进程管理、内存管理、文件系统和I/O管理等核心模块展开,通过系统调用实现用户态内核态的交互。在工程实践中,深刻理解这些原理对于解决诸如“句柄数不足”等资源管理问至关重要。例如,**句柄数不足**通常源于进程打开文件描述符达到上限,这直接关联到操作系统的文件管理和进程资源限制机制。另一个常见问是**SSH爆破**攻击,这涉及到操作系统的安全审计访问控制,通过分析认证日志和配置防火墙策略进行应急

weixin_34099526的博客 325

操作系统核心逻辑:资源调度抽象如何构建稳定高效的计算机世界

操作系统是计算机系统的核心软件,其根本使命在于管理抽象硬件资源。从原理上看,它通过进程管理、内存管理、文件系统和I/O设备管理等核心机制,将有限的物理CPU、内存、磁盘等资源,高效、安全地虚拟化为上层应用可用的无限逻辑资源。这一系列抽象技术(如虚拟内存、进程、文件)的价值在于,它们为应用程序构建了一个稳定、易用且相互隔离的执行环境,极大地提升了开发效率和系统利用率。在应用场景上,无论是个人电脑、服务器还是嵌入式设备,操作系统的资源调度抽象能力都是支撑其稳定运行和并发处理多任务的基础。本文以国防科技大学经

weixin_34364071的博客 310

北邮网安考研指南:803专业课深度解析备考策略

计算机学科基础综合是计算机网络安全领域的核心课程,它涵盖了数据结构、计算机组成原理、操作系统和计算机网络等基础理论。理解这些原理是掌握现代网络安全技术的关键,其技术价值在于构建解决复杂工程问的系统化思维。在考研选拔中,这类课程是评估学生专业潜力的重要标尺,尤其对于北京邮电大学网络空间安全学院这类顶尖院校,其自命科目803计算机学科基础综合,更是深度考察学生融会贯通和解决实际问的能力。该科目不仅要求掌握经典算法和系统设计,更注重在通信网络等具体应用场景下的灵活运用。对于有志于在网络安全领域深造的学生而

weixin_34174322的博客 357

PV操作详解(附详细例解析和总结)

PV操作详解 写在前面:本文主要讲解PV操作信息量结合,实现进程同步互斥 文章目录PV操作详解1. PV操作定义2. 信号量的应用3. 经典问分析3.1 课上例3.2 课下习分析4. 补充 1. PV操作定义 信号量是一类特殊的变量,程序对其访问都是原子 操作,且只允许对它进行P(信号变量)和V(信号变量) 操作。 • 二元信号量:取值仅为“0”或“1”,主要用作实现互斥; • 一般信号量:初值为可用物理资源的总数,用于进程间的协作同步 一个信号量可能被初始化为一个非负整数. semWa

不要被失望的瞬间击败 8万+

408操作系统知识点(查漏补缺)

知识点大部分来自于王道课后习中易出错知识及薄弱内容,有问的地方欢迎朋友们指出,一起讨论学习。

innocence的博客 2698

操作系统——信号量机制(练习

操作系统——信号量机制(练习

huayu8086的博客 3776
上一篇: 挑战408——操作系统(9)——进程的同步与互斥
下一篇: 挑战408——操作系统(11)——多角度看生产者消费者问题
gzhosp_redAnt
博客等级 码龄10年 702粉丝 269原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值