【操作系统】(四):信号量机制与管程
信号量机制
整型信号量
记录型信号量
为了防止忙等,将整型信号量改成一个队列?(记录型信号量)
AND型信号量
并发进程A,B访问共享数据D,E,设信号量Dmutex,Emutex,初值是1
就死锁了
AND,把进程资源一次性全部给进程,
else:把进程放到一个队列中,等待相应资源的释放
信号量集
在进程申请资源的时候,要判断是否大于可分配的下限值t,否则不发。
这样就可以拓充and,不再只-1,判断也是>=t
格式:
t:下限值(1)
d:每次要用到的(-1)
S
w
a
i
t
(
S
1
,
t
1
,
d
1
,
.
.
.
,
S
n
,
t
n
,
d
n
)
;
S
s
i
g
n
a
l
(
S
1
,
d
1
,
.
.
.
,
S
n
,
d
n
)
;
Swait(S_1,t_1,d_1,...,S_n,t_n,d_n);\\Ssignal(S_1,d_1,...,S_n,d_n);
Swait(S1,t1,d1,...,Sn,tn,dn);Ssignal(S1,d1,...,Sn,dn);
信号量的应用
进程互斥
mutex:互斥信号量,初值=1
wait和signal同时出现(P,V)
Pa:P(mutex);
critical section;
V(mutex);
实现前驱关系
用信号量来搞互斥顺序:
设两个并发进程
P
1
,
P
2
P_1,P_2
P1,P2,
P
1
P_1
P1有语句
S
1
S_1
S1,
P
2
P_2
P2有语句
S
2
S_2
S2,设一个公用信号量
S
S
S,赋予初值0,
V
(
S
)
V(S)
V(S)(+1)操作放在
S
1
S_1
S1后面,在
S
2
S_2
S2前加
P
(
S
)
P(S)
P(S)操作:
p1:
S
1
S_1
S1;V(S)
p2: P(S);
S
2
S_2
S2
多个前后驱关系就多个信号量,初值都是0,vvv,ppp
管程机制
管程定义
资源管理模块,负责进程之间的互斥
组成:
一个进程访问管程,其他进程都要阻塞在外面
特性:
管程和进程:
- 都定义了数据结构,一个是私有数据结构PCB,一个是公共数据结构消息队列
- 都存在对各自数据结构上的操作,进程是由顺序程序执行,管程主要是进行同步操作和初始化
- 进程是实现系统的并发,管程是解决共享资源互斥使用
- 进程通过调用管程中的过程来操作,是主动的,管程是被动的
- 进程可以并发,管程不能与调用者并发
- 进程动态性,不断创建销毁,管程是资源管理模块,来调用的
条件变量
说明进程阻塞的原因