免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8456 | 回复: 14
打印 上一主题 下一主题

信号量 PV操作的一些疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-18 09:50 |只看该作者 |倒序浏览
在网上搜索到一些这方面的解释

PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:
    P(S):①将信号量S的值减1,即S = S - 1;
           ②如果s >= 0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
    V(S):①将信号量S的值加1,即S = S + 1;
           ②如果S > 0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通信。
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
    一般来说,信号量S >= 0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S <= 0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

对下面这句话不明白,我的理解是:S < 0 的时候表示可用资源都被占用了,那这个时候唤醒一个等待状态的进程,怎么能让它运行下去?

若S <= 0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。


多个进程要对同一文件进行读写,大家读的时候不限制,当某进程x要写该文件时候就要限制其它进程不能读写(阻塞),x写完后,大家继续工作,用信号量来实现是否妥当?希望大家给点意见,有经验的前辈能否讲解下这方面的知识,或者介绍点信号量编程方面的书和代码?

谢谢~~

论坛徽章:
0
2 [报告]
发表于 2007-06-18 10:04 |只看该作者
S小于0的时候,S的绝对值只是表示有几个进程被阻塞了
此时,如果一个进程释放了一个资源,
系统会从那些被阻塞的进程中选择一个继续执行
也就是说,有一个未被占用的资源就可以让一个阻塞的进程执行,
而不是S为正是才可以执行

另外,你说的那个文件读写问题是经典的读者和写者问题,当然可以很好的用信号量来实现了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2007-06-18 10:07 |只看该作者
〉〉而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S <= 0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
你要看到“而执行一个V操作意味着释放一个单位资源,因此S的值加1;”这句话。

你可以使用文件锁。

原理性的东西,操作系统的书就可以了,
具体系统上的实现怎么使用,可以参考《unix网络编程卷二:进程间通信》这本书。

论坛徽章:
0
4 [报告]
发表于 2007-06-18 10:11 |只看该作者
[quote]原帖由 while(1) 于 2007-6-18 09:50 发表
在网上搜索到一些这方面的解释


对下面这句话不明白,我的理解是:S < 0 的时候表示可用资源都被占用了,那这个时候唤醒一个等待状态的进程,怎么能让它运行下去?


我的理解是当一个进程x执行P操作想获取资源s时,发现S<0,则进程x挂起,操作系统唤醒一个等待状态的进程y,进程y应该是持有资源s的进程,并且是因为时间片用完才进行等待的,进程y结束工作后执行V操作,释放资源,这样进程x才能继续往下执行,不然就会引起死锁。

论坛徽章:
0
5 [报告]
发表于 2007-06-18 10:14 |只看该作者
原帖由 hdksky 于 2007-6-18 10:11 发表
[quote]原帖由 while(1) 于 2007-6-18 09:50 发表
在网上搜索到一些这方面的解释


对下面这句话不明白,我的理解是:S < 0 的时候表示可用资源都被占用了,那这个时候唤醒一个等待状态的进程,怎么 ...


这个问题跟死锁是不搭界的
仅仅是进程的同步与互斥而已

论坛徽章:
0
6 [报告]
发表于 2007-06-18 10:31 |只看该作者
原帖由 ypxing 于 2007-6-18 10:04 发表
S小于0的时候,S的绝对值只是表示有几个进程被阻塞了
此时,如果一个进程释放了一个资源,
系统会从那些被阻塞的进程中选择一个继续执行
也就是说,有一个未被占用的资源就可以让一个阻塞的进程执行,
而不是 ...

我现在的理解:
一个进程y先P操作,操作后发现S <= 0,然后阻塞; 这时候有另一进程x执行了V操作,操作后发现S < 0, 于是有可能唤醒y进程,让y进程执行下去。

不知道对否?

[ 本帖最后由 while(1) 于 2007-6-18 10:36 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-06-18 10:34 |只看该作者
你怎么用了两个y?

基本上是这个意思

原帖由 while(1) 于 2007-6-18 10:31 发表

我现在的理解:
一个进程y先P操作,操作后发现S <= 0,然后阻塞; 这时候有另一进程y执行了V操作,操作后发现S < 0, 于是有可能唤醒y进程,让y进程执行下去。

不知道对否?

论坛徽章:
0
8 [报告]
发表于 2007-06-18 10:36 |只看该作者
原帖由 lenovo 于 2007-6-18 10:07 发表
〉〉而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S <= 0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
你要看到“而执行一个V操作意味着释放一个单位资源,因 ...

也考虑过使用文件锁,但看到书上说,信号量的效率相对比较高,项目在程序效率上要求比较严格。

[ 本帖最后由 while(1) 于 2007-6-18 10:38 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-06-18 10:37 |只看该作者
原帖由 ypxing 于 2007-6-18 10:34 发表
你怎么用了两个y?

基本上是这个意思


笔误拉...

论坛徽章:
0
10 [报告]
发表于 2007-06-18 21:15 |只看该作者
其实我一直很好奇,那个p和v到底是哪两个词的缩写~~
因为有一次我写程序时,正好pv作为两个函数,不懂得怎么取函数名~~
=.=
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP