进程——PV操作
在多道程序设计中,由于多个进程可以并发执行,故进程间必然存在资源共享和相互合作的问题。
一、同步互斥
进程通信是指各个进程交换信息的过程。
1、同步
同步是合作进程间的直接制约问题。
进程间的同步是指进程间完成一项任务时直接发生相互作用的关系。
下面来讲一个搬运工的实例:
甲从A仓库取出数据,运到中转站;
乙从中转站取出数据,运到B仓库;
乙取数据时,必须是甲完成了向中转站送数据的操作;
否则,乙会停下来等待甲的操作完成完成。他们共同完成这一件事情,我们将它就叫做同步。
PS:计算机内,多个进程可以并发执行,每个进程都以各自独立、不可预知的速度前进推进,但是在临界区上,需要协调合作进程间的关系。
2、互斥
互斥是申请临界资源进程间的间接制约问题。
进程互斥是指系统中各进程互斥使用临界资源。
例如:打印机、共享变量等临界资源。在多道程序系统环境中,多进程可以共享各类资源,但有些资源一次只能供一个进程使用。
二、信号量
定义——一个整型变量,根据控制对象的不同被赋予不同的值。
分类:公用信号量和私用信号量。
公用信号量——实现进程间的互斥,初值为1或资源的数目。
私用信号量——实现进程间的同步,初值为0或某个正整数。
信号量的物理意义:
S>=0,表示某资源的可用数;
S<0,则其绝对值表示阻塞队列中等待该资源的进程数。
三、P操作
定义:
S:=S-1
若S>=0,则执行P操作的进程继续执行;
若S<0,则置该进程为阻塞状态(因为无可以用资源),并将其插入阻塞队列。
操作过程:
Procedure(Var S:Semaphore);
Begin
S:=S-1;
if S<0 thenW(S){
执行P操作的进程插入等待队列
}
End;
Semphore表示所定义的变量是信号量。
四、V操作
定义:
S:=S+1
若S>0,则执行V操作的进程继续执行;
若S<=0,则从阻塞状态唤醒一个进程,并将其插入就绪队列,然后执行V操作的进程继续执行。
操作过程:
Procedure V(Var S:Semaphore);
Begin
S:=S+1;
IfS<=0 then R(S){
从阻塞队列中唤醒一个进程
}
End;
PV操作实现进程的互斥:
信号量mutex的初值为1,当进入临界区时执行P操作;退出临界区时执行V操作:
P(mutex)
临界区
V(mutex)
PS:PV操作实现进程同步互斥的过程中,P操作表示申请一个资源,V操作表示释放一个资源。
难点:理解PV操作其实就跟了解一个人一样。现实中,大部分在大部分时候都是自私的,PV操作也是一样,总是站在自己的角度想问题。P操作的信号量,指的是缓冲区还有几个空格子可以盛放资源,而V操作的信号量指的是缓冲区有多少个资源,能够供自己使用。
五、例子
例子1——交通流量统计程序
例子2——生产者消费者
生产者进程P1不断生产产品送入缓冲区,消费者进程P2不断从缓冲区取出产品消费。为了实现P1与p2进程间的同步问题,需要设置一个信号量s1,初值为1,表示缓冲区空,可以将产品送入缓冲区;设置另一个信号量s2,初值为0,表示缓冲区有产品。其同步过程如下:
例子3——生产者消费者
上题中,如果S1的初始值为0,S2初始值不变(为0),其同步过程为:
例子4——2008年上半年例题
五、总结
PV操作是操作系统只是里面比较重要的知识,掌握PV操作的重点,我认为是PV操作信号量的角度是站在两个完全相反的角度上的,理解了这一点,别的我们都可以据此推出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?