一、信号量的定义
?交通灯的作用是什么?我们如何通过交通灯的指示来判断是否能通过?
信号量,也叫信号灯,是一个确定的二元组(S,Q),其中S是个具有非负初值的整型变量,且S的值只能由定义在信号量上的P操作原语和V操作原语来改变,而Q是个初始状态为空的队列。
记录型信号量是一个记录型的数据结构,包含两个数据项,一个是计数值域,另一个是等待该信号量的进程队列首指针域。记录型信号量结构可以描述如下:
typedef struct semaphore
{
int S;
PCB *Q;
};
二、P、V操作原语
P原语操作过程:
1.S减1;
2.若S减1后仍大于或等于零,则调用P原语的进程继续执行;
3.若S减1后小于零,则该进程被阻塞到与该信号相对应的队列Q中,然后转进程调度。
V原语操作过程:
1.S加1;
2.若相加后的S大于零,则进程继续执行;
3.若相加后的S小于或等于零,则从该信号的等待队列Q中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
试分析该订票系统如何实现了互斥?若为前例(栈)用P、V操作实现互斥,该如何改写程序?
对售票例的修改。设s初值=1。
-
Procedure p1
begin
………………
P(s)
x ←read(file)
if(x>0) then
begin
x ←x-1
writeln(x,file)
end
V(s)
………………
end;
-
Procedure p2
begin
………………
P(s)
x ←read(file)
if(x>0) then
begin
x ←x-1
writeln(x,file)
end
V(s)
………………
end;
栈的P、V实现互斥。设s初值=1。(方法同上)
用P、V操作实现互斥的一般形式
设信号量s初值为1
甲进程:
其它代码;
P(s);
甲进程的临界区;
V(s);
其它代码;
乙进程:
其它代码;
P(s);
乙进程的临界区;
V(s);
其它代码;
5544

被折叠的 条评论
为什么被折叠?



