2、记录型信号量 设s为一个记录型数据结构,其中一个分量为整 形量 value,另一个分量为信号量队列 queue,这 时P操作原语和V操作原语的定义修改如下: P(s);将信号量s减去,若结果小于0 则调用P(s)的进程被置成等待信号量s的状态 V(s):将信号量s加1,若结果不大于0, 则释放一个等待信号量s的进程 记录型信号量和P操作、V操作可表示成如下 的数据结构和不可中断过程:
2、记录型信号量 ⚫ 设s为一个记录型数据结构,其中一个分量为整 形量value,另一个分量为信号量队列queue, 这 时P操作原语和V操作原语的定义修改如下: ⚫ ⚫ P(s);将信号量s减去l,若结果小于0, 则调用P(s)的进程被置成等待信号量s的状态。 ⚫ ⚫ V(s):将信号量s加1,若结果不大于0, 则释放一个等待信号量s的进程。 ⚫ 记录型信号量和P操作、V操作可表示成如下 的数据结构和不可中断过程:
记录型傖号量与P操作 type semaphore record val ue: Integer j queue: list of process; en procedure P(var s: semaphore) b egIn 去1* ifs< 0 then W(s);/*若信号量小于0,则调用P(s)的进 程被置成等待信号量s的状态*/ end procedure V(var s: semaphore) beg in /*把信号量加1*/ ifs<=0 then r(s);/*若信号量小于等于0,则释放 个等待信号量s的进程*/ end
记录型信号量与PV操作 type semaphore = record value:integer; queue: list of process; end procedure P(var s:semaphore); begin s := s – 1; /* 把信号量减去1 */ if s < 0 then W(s); /* 若信号量小于0,则调用P(s)的进 程被置成等待信号量s的状态 */ end; procedure V(var s:semaphore); begin s := s + 1; /* 把信号量加1 */ if s <= 0 then R(s); /* 若信号量小于等于0,则释放 一个等待信号量s的进程 */ end;
记录型信号量与PV操作 ●推论1:若信号量s为正值。则该值等于在封 锁选程之前对信号量s可施行的P操作数、亦 菩于S所代表的实际还可以使用的物理资源数 推论2若信号量s为负值,则其绝对值等于 登记排列在颃信号量s队列之中等待的选程个 数、亦即恰好等于对信号量S实施P操作而被 封锁起来并进入信号量s队列的进程数 ●推论3:通常,P操作意味着请求一个资源。V 操作意味着释放一个资源。在一定条件下,P 操作代表挂起选程操作。而V操作代表唤醒被 挂起程的操作
记录型信号量与PV操作 ⚫ 推论1:若信号量s为正值,则该值等于在封 锁进程之前对信号量s可施行的P操作数、亦 等于s所代表的实际还可以使用的物理资源数 ⚫ 推论2:若信号量s为负值,则其绝对值等于 登记排列在该信号量s队列之中等待的进程个 数、亦即恰好等于对信号量s实施P操作而被 封锁起来并进入信号量s队列的进程数 ⚫ 推论3:通常,P操作意味着请求一个资源,V 操作意味着释放一个资源。在一定条件下,P 操作代表挂起进程操作,而V操作代表唤醒被 挂起进程的操作