Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68980
  • 博文数量: 18
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 199
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 11:00
文章分类
文章存档

2011年(1)

2010年(1)

2009年(2)

2008年(14)

我的朋友

分类:

2008-09-24 20:47:43

记录型信号量

记录型信号量:需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接等待进程。两个数据项可描述为:

type semaphore=record

                            value:integer;

                            L:list of process;

                            end

                            1

相应地,wait(S)signal(S)操作可描述为:

procedure wait(S)

           var S:semaphore;

           begin

                 S.value:=S.value-1;

                 if S.value<0 then block(S,L)

           End

procedure signal(S)

           var S:semaphore;

           begin

                 S.value:=S.value+1;

                 if S.value0 then wakeup(S,L);

           end

在记录型信号量机制中,S.value的初值表示系统中某类资源的数目,因而又称为资源信号量,对它的每次wait操作,意味着进程请求一个单位的该资源,因此描述为S.value:=S.value-1;S.value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。可见,该机制遵循了“让权等待”准则。此时S.value的绝对值表示在该信号量链表中已阻塞进程的数目。对信号量的每次signal操作,表示执行进程释放一个单位资源,故S.value=S.value+1操作表示资源数目加1.若加1后仍是S.value0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应该调用wakeup原语,将S.L链表中的第一个等待进程唤醒。如果S.value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。

      以上内容摘之《计算机操作系统》,下面我谈谈对记录型信号量的认识:如上图1,你看上去是不是很像我们学习过的C语言定义的数据结构,它就是因此而得名的。只不过它是pascal语言书写的而已,那看下面两个方框,一个是wait,另一个是signal,是不是很像咱学的C语言啊。每次wait操作就是给进程分配一个单位的资源,每次signal操作就是进程释放一个单位资源。

      现在我们假设我的电脑有两台打印机,所以S.value的初值为2,表示系统打印机的数目,称为资源信号量。进程B请求打印,那么系统对它执行一次wait操作,执行S.value:=S.value-1语句后S.value1S.value的值变为1,表示有一个资源空闲。执行if语句,S.value不小于0,结束。然后又来了一个进程B请求打印,系统对它又执行一次wait操作,执行S.value:=S.value-1语句后S.value1S.value的值变为0,表示没有空闲的资源。执行if语句,S.value不小于0,结束。又来一个进程C请求打印,系统对它又执行一次wait操作,执行S.value:=S.value-1语句后S.value1S.value的值变为-1,表示有一个进程没有得到打印机资源。执行if语句,S.value小于0,执行block(S,L),进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。此时S.value的绝对值表示了在该信号量链表中已阻塞进程的数目。所以这个时候阻塞的进程为一个,即是进程C

      系统运行了一段时间后,A进程结束,在结束前执行了signal操作,当执行到S.value:=S.value+1语句时,S.value1,即S.value变为0.然后执行 if 语句,S.value小于等于0,执行wakeup(S,L),S.L链表中唤醒C进程。过了一会,B进程结束,同样执行signal操作,S.value变为1,表示有一个资源空闲,执行if语句,S.value不小于等于0,直接结束。接着C进程执行wait操作,S.value变为0。然后A进程结束,S.value变为1。紧接着C进程也结束了,S.value变为2S.value最终等于初值,等待其他的进程进行资源请求。

      上述只是我假设的一种的情况,便于对记录型信号量的理解。还有其他的情况,大家可以试着自己去分析。

阅读(10458) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

huangdamei2013-05-19 12:53:07

chinaunix网友:中间部分写错了,进程C得到资源后不会再进行WAIT操作,因为之前已经进行过此操作,只得得到资源而执行。

支持

回复 | 举报

huangdamei2013-05-19 12:52:59

倒数第二段应该写错了,进程C得到资源后不会再进行WAIT操作,因为之前已经进行过此操作,只得得到资源而执行

chinaunix网友2011-05-29 21:28:55

中间部分写错了,进程C得到资源后不会再进行WAIT操作,因为之前已经进行过此操作,只得得到资源而执行。

chinaunix网友2009-01-05 21:17:11

不错

chinaunix网友2008-09-24 23:19:57

理解基本到位,不错。