出版社:西安电子科技大学出版社
教材:计算机操作系统(第四版)
章节:二、进程的描述和控制
只写了考试部分…
信号量机制
1、整型信号量
经典的PV操作:
P(wait):申请资源
V(signal):释放资源
信号量的使用
- 信号量定义为一个整型量;
- 根据初始情况赋相应的值;
- 仅能通过两个原子操作来访问;
- P、V原语必须成对出现
注意:
- 整型信号量符合“有限等待”原则;
signal释放资源后,当CPU被分配给等待进程后,等待进程仍可继续执行,可以符合“有限等待”。 - 但整型信号量不符合“让权等待”原则;
整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试;
2、记录型信号量
新增加了
- 表示资源数目的整型变量value
Value>0,表示当前可用资源的数量;
Value≤0,其绝对值表示等待使用该资源的进程数,即在该信号量队列上排队的PCB的个数。 - 一个进程链表指针list(链接所有等待进程)
P(s)
{ s.value = s.value -1;
if (s.value < 0)
block(s.L);
} //P(s)
1)s.value初值表示某类资源数目;
2)s.value = s.value –1表示请求一个单位资源;
3)if (s.value < 0)表示该类资源分配完毕,请求进程调用block(s.L)自我阻塞
V(s)
{ s.value = s.value +1;
if (s.value <= 0)
wakeup(s.L);
} //V(s)
1)s.value<0时,其绝对值表示阻塞进程的数目;
2)s.value = s.value +1表示释放一个单位的资源;
3)if (s.value <= 0)表示尚有阻塞进程,当前执行wakeup(s.L)唤醒阻塞的第一个进程
实现进程互斥
1)互斥信号量
为每类临界资源设置一互斥信号量s,s的初值s.value=1,表示
①临界资源可用
②可用资源有1个
为临界资源设置一个阻塞队列,因请求该临界资源而阻塞的进程挂入阻塞队列
P(s)测试临界资源是否可用 | V(s)释放临界资源,唤醒阻塞进程 | |
---|---|---|
s.value=1 | 临界资源可用 | 没有阻塞进程 |
s.value=0 | 临界资源被占用 | 唤醒最后一个阻塞的进程 |
s.value<0 | s.value的绝对值为因等待临界资源而阻塞的进程数目 | s.value的绝对值为因等待临界资源而阻塞的进程数目 |
2)互斥的实现
- 将竞争该临界资源的各进程的临界区置于P(s)和V(s)之间
- P(s)和V(s)必须成对出现在同一进程中
- 用于独立进程对临界资源的互斥使用
资源请求
1)资源信号量
资源信号量实现对某类资源的请求和释放
初值s.value=n(n表示可用资源数目)
P操作:申请一个可用资源
V操作:释放一个可用资源
P(s)表示请求一个单位的资源:
s.value≥0:表示剩余资源数目
s.value<0: |s.value|表示因请求该资源而阻塞的进程数目
V(s)表示释放一个单位的资源:
s.value>0:表示可用资源数目,原进程继续执行
s.value≤0:|s.value|表示阻塞的进程数目,唤醒一个进程为其分配资源
2)同步信号量
初值s.value=0,表示同步事件尚未发生
P操作:测试同步事件是否发生
V操作:通知同步事件已经发生
同步事件发生后,由同步事件的执行者通过V(s)通知同步事件的等待者
同步事件的等待者在开始执行前,通过P(s)测试同步事件是否发生。