当前位置: 技术问答>linux和unix
操作系统中PV操作的问题
来源: 互联网 发布时间:2015-07-29
本文导语: 这个问题我看了书,还是不太懂,谁能给我讲讲,越详细越好。 | 看看《操作系统:设计和实现》第二章,里面讲得很清楚了。 简单的说就是为了实现对资源的互斥访问。 举个例子: 你现...
这个问题我看了书,还是不太懂,谁能给我讲讲,越详细越好。
|
看看《操作系统:设计和实现》第二章,里面讲得很清楚了。
简单的说就是为了实现对资源的互斥访问。
举个例子:
你现在运行有多个进程(A,B,C,D...)
这多个进程都要对某一个文件(F)进行访问,
文件F不能被2个以上的进程同时写,以免冲突。
一个办法就是设置一个全局变量GLOBAL,值为1,进程可以访问,值为0,进程不能访问,
这样当一个进程要访问此文件时候,测试global的值,
要是为1,则访问文件,且将global值设为0,退出时候设为1。
这个办法的一个问题在于当进程A测试到global值为1,把值更改为0之前,
发生了进程切换,此时,另外一个进程测到global值为1,然后访问文件,
当进程切换为进程A时,由于已测试过global的值,因此A进程讲也对文件F进行访问。
就造成了冲突。
解决办法就是PV操作,PV操作保证了测试、修改俩个操作的原子性,
即当测试到global值为1且修改为0之间,不会发生进程切换。
因此对一个互斥资源进行semaphore P/V即可实现资源的占有、释放的原子性操作
简单的说就是为了实现对资源的互斥访问。
举个例子:
你现在运行有多个进程(A,B,C,D...)
这多个进程都要对某一个文件(F)进行访问,
文件F不能被2个以上的进程同时写,以免冲突。
一个办法就是设置一个全局变量GLOBAL,值为1,进程可以访问,值为0,进程不能访问,
这样当一个进程要访问此文件时候,测试global的值,
要是为1,则访问文件,且将global值设为0,退出时候设为1。
这个办法的一个问题在于当进程A测试到global值为1,把值更改为0之前,
发生了进程切换,此时,另外一个进程测到global值为1,然后访问文件,
当进程切换为进程A时,由于已测试过global的值,因此A进程讲也对文件F进行访问。
就造成了冲突。
解决办法就是PV操作,PV操作保证了测试、修改俩个操作的原子性,
即当测试到global值为1且修改为0之间,不会发生进程切换。
因此对一个互斥资源进行semaphore P/V即可实现资源的占有、释放的原子性操作
|
PV操作是基于信号量的原子操作,由学界泰斗Dijstra提出,PV好象分别是荷兰语中两个单词的首字母。现代一般用wait和signal,linux内核中用down和up.
P.V操作的对象是一个整型变量,物理意义上初始化为计算机系统中某种资源的数目。
当由于P操作变为负数时代表了在该资源上睡眠等待的进程数。
需要说明的是,这种互斥机制一般不适用于分布式系统。
操作系统教材中都会有详细描述。
P.V操作的对象是一个整型变量,物理意义上初始化为计算机系统中某种资源的数目。
当由于P操作变为负数时代表了在该资源上睡眠等待的进程数。
需要说明的是,这种互斥机制一般不适用于分布式系统。
操作系统教材中都会有详细描述。
|
基本上可以看成,P是申请资源,V是释放资源。都是原子操作,执行中不会被打断而调度到其他进程。