作者:广东在线游戏网日期:
返回目录:游戏解答
其实很简单呢,信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作。
一般情况是这样进行zhidao临界访问或互斥访问的:
设信号量值为1,
当一个进程1运行时,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个。这时信号量值为0。系统中规定当信号量值为0时,必须等待,直到信号量值不为零才能继续操作。
这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞。这样就达到了进程1排他访问。
当进程1运行结束后,专释放资源,进行V操作。资源数重新加1,这时信号量的值变为1.
这时进程2发现资源数不为0,信号量能进属行P操作了,立即执行P操作。信号量值又变为0.此时进程2占有资源,排他访问资源。
这就是信号量来控制互斥的原理。
希望能帮助到你,如果帮助到你,请采纳为意见。
•整型信号量
–是一个整百型量,通过度2个原子操知作wait(s)和signal(s)来访问道。
Wait(s):
while s<= 0 do no-op
s:=s-1;
Signal(s): s:=s+1;
在wait原子操作中,当s<= 0时,就立刻循版环回去继续判断S的值是权否小于等于0
初值应该是3.
每有一处进程进入,就减1.当三个进程进入,第4个进程想要进入时,再执行P操作就会变为负值,从而阻塞后继进程进入。
《Operating Systems Design and Implementation》中Andrew S. Tanenbaum对信号量的描述和以前看过的教材有区别。但其核心思想是类似的。
以前的书上(包括网上不少帖子)636f7079e79fa5e98193365是这么叙述的:
―――――――――――――――――――――――――――――――――――――
信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。
Dijkstra同时提出了对信号量操作的PV原语。
P原语操作的动作是:
(1)S减1;
(2)若S减1后仍大于或等于零,则进程继续执行;
(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的动作是:
(1)S加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。
―――――――――――――――――――――――――――――――――――――
说明:要保证PV是原子操作,对于操作系统,只须在操作过程中关中断即可。
Andrew S. Tanenbaum对信号量的定义有所不同,其PV操作也有区别。
―――――――――――――――――――――――――――――――――――――
信号量是一个整数,其值不小于0。它表示被积累下来的唤醒操作数。
P原语操作的动作是:
(1) 检查S是否大于0。
(2) 若S>0,则S = S – 1;否则,执行P操作的进程将睡眠,并且此时P操作并未结束。
V原语操作的动作是:
(1)S = S + 1。
(2)如果一个或多个进程在该信号量上睡眠,无法完成先前的P操作,则有系统选择其中一个并允许它完成P操作。