信号量是荷兰的计算机科学家Dijkstra65年提出的(精)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对应
V(S)
unlock (S)
本书原来使用 P 、 V 操作来称呼此两操作, 但由于信号量和信号量上的同步原语以及后面要 讨论的管程均已成为并行程序语言的组成部分,
所以改用程序语言中的习惯称呼,以及国际上较
流行的称呼为Wait和Signal操作。
3. 当进程必须在信号量S上等待时,就将该进程的状态 变为等待状态(或活动阻塞状态),并将该进程插入与 此信号量有关的等待队列中,而后让出处理机给其 它就绪进程。 两种等待方式下的wait和signal操作: (1) “ 忙等待”执行方式:
[例2] 几个进程共同执行时互斥
var mutex=1; share sempahore;
begin P1: begin P(mutex); cs V(mutes); ncs end P2: begin P(mutex); cs V(mutex); ncs end end
[注]:
(i) 由mutex=1可知信号量起相 当于一把锁的作用,限制 一次仅一个进程进入cs。
wait(s): while S0 do skip; S: = S–1; signal(s): S: = S+1; 这种形式的P,V操作,完全也可用硬件指令来形式。
(2) “ 阻塞等待”执行分式: 等待进程放入与此信号量 S 有关的阻塞队列, 需要有该队列的头指针,因此要把信号量定义进一 步进行扩充,其数据结构形式由“ 忙等待 ” 方式 中的整形变量,扩充成为记录形式: type Semaphore = record value : integer; L: pointer to PCB end
§4.3 信号量 (P,V操作)
1. 信号量是荷兰的计算机科学家Dijkstra65年提出 的,也是最早的同步方法。 所谓信号量:是一个仅能由同步原语对其进行操作的整型 变量。 Dijkstra将这两个同步原语命名为“ P操作”,“ V操
作”。
发信 号
等待(看字母) 荷兰语
信号量
二元信号量:允许取值为“ 0”与“ 1”,主要用 作互斥变量。 一般信号量:允许取值为非负整数,主要用于进 程间的一般同步问题。
Wakeup (id);
{把该进程id的状态转换或活动就绪状态,并根据id进程的
优先数高低决定是否需要抢占现行进程的处理机}
end
阻塞等待的同步原语一般适用于单处理器系
统,忙等待的同步原语一般适用于多处理器系统。 因为在单处理器系统中使用忙等待方式将造成处 理器时间较大的浪费。而在多处理器系统中忙等 待方式造成的处理器时间的浪费,由于临界段通
信号量作为进程的阻塞和唤醒机构
当一个进程等待某事件时,最好将它自己阻 塞在某个信号量上以等待事件的完成。
通常可分为两种情况: (1) 在资源分配和释放情况中,进程所等待的事件是 其所要求的资源被其它进程释放出来成为可用。 (2) 在进程间相互协同的情况下,使进程等待某事件 来控制其执行顺序,此时进程所等待的事件主要 是等待相关的协作进程完成某个操作。
2. P,V操作
P,V操作是对信号量进行的原语操作。 Dijkstra对这两个原语操作定义如下: P(S):当信号量S大于0时,将S值减1,否则进程等待, 直到其它进程对S进行V操作V(S)。
V(S):将信号量S的值加1。
P,V操作的功能描述见下图:
入口 S–1 S S0 入口
S+1 S
wait(s): S.value: = S. value 1; if S. value < 0 (说明 S原 0或<1,无资源) then begin Insert (*, S. L);
{把调用者进程*的进程控制块PC B插入信号量 S的等待队列L中}
Block (*);
{把调用者进程变为阻塞,并调用进程调度程序 以便选一新的就绪进程到处理机上运行}
S0
>0
S0
返回
0
从该信号量的等待 队列中取出首元素
入就绪队列
<0
入信号量等待队列
置“ 等待”状态
置“ 就绪”状态 转进程调度 P 返回 V
P,V操作可用软件(或固件)和硬件来执行。无 论P操作和V操作,它们的执行都必须是一个 不可被 中断的整体。 [ 0时,S为可用资源量;
(ii) P(mutex)将使对mutex排成 等待队列 P Runing (iii) 在一个P进入cs时,必须 是唯一,但在cs外,所有P 可并行。 mutex P' P''
二、利用信号量实现同步 一类是保证一组合作进程按逻 辑需要的执行次序执行。
一般同步问题有
另类保证共享缓冲区(共享数 据)的合作进程的同步。 进程的同步可以通过共享变量的办法来实现。 共享变量可以是信号灯或事件装置,这些同步机 构常限制存贮一个或几个字的信息。
S = 0时,可用资源量正好用完; S < 0时,|S|为等待资源的队列长度,即还欠资源数 (在信号量上等待的进程数)
例:S = 4 S=0 S = –2
P1 P2
•P(S):表示请求分配一个资源 V(S):表示释放资源 (2) P(S)
S为二元信号量
S > 0 立即可得
S 0 要排队
Lock (S)
常很短而可以忍受。而且忙等待方式可以减少进
程间开关的开销。
§4.4 同步机构应用
一、利用信号量实现互斥
将临界资源量看作为1,取信号量mutex,用P, V互斥。
[例1] 二人共同存款
var mutex: Share Semaphore; count: integer;
PA
S PB F
begin muter: = 1; {共享资源只有1个} cobegin PA: begin var N: integer; P(mutex); N: =count; N: =N+1; count: =N; V(mutex); end PB: begin var M: integer; P(mutex); M: = count; M: =M+1; count: =M; V(mutex); end; coend end
end
signal(s): S. value: = S.value + 1
if S. value 0 (说明: S. Value原–1,处在等待队列中) then begin Remove (S. L, id);
{在信号量S的阻塞队列L中,选一进程移出队列,并把进
程标识号(PCB)送入id中}
相关文档
最新文档