操作系统之进程管理4

来源:互联网 发布:js是什么防水材料 编辑:程序博客网 时间:2024/05/22 10:23

进程的两种制约关系

间接制约:进程间由于共享某种系统资源,而形成的相互制约。

比如系统中只有一个打印机资源,A、B两个进程都想用该资源,此时A、B两个进程就形成间接制约关系。

直接制约:进程间由于合作而形成的相互制约。

比如A进程的进行需要B进程的结果,此时A、B两个进程就形成直接制约关系。

临界资源
一次仅允许一个进程使用的共享资源 如:打印机、磁带机、表格
临界区
在每个进程中访问临界资源的那段程序
进程必须互斥进入临界区
访问临界区的循环进程描述
进入区——>检查临界资源是否能访问
临界区
退出区——>将临界区标志为未访问
剩余区
同步机制遵循的原则
①空闲让进——>只要系统资源没人使用,系统就要派一个资源去使用它
②忙则等待——>临界资源只能有一个进程使用,其他想使用该资源的必须处于等待状态
③有限等待——>任何进程的等待都是有限度的,需要给进程分配一个等待时间。
④让权等待——>当一个进程(正在占有CPU的)不能进入临界区,就要放弃CPU
使用信号量机制协调多个进程之间的同步关系
信号量
信号量是一种数据结构
信号量的值与相应资源的使用情况有关
信号量的值仅由P、V操作改变;
整型信号量
整型数
P操作(wait)等待原语
V操作(signal)释放原语
Wait(S):
while S<=0 do no-op(do no-op并不代表什么都不做,该进程在一直检测S的值);
S:=S-1;
Signal(S):
S:S+1;
wait(s)和signal(S)是原子操作。
只要信号量S<=0就不断检测S的值,不满足让权等待。
记录型信号量
记录型结构,包含两个数据项
type semaphore = record
value:integer;
L:list of process;(链表,存放进程的PCD链表)
end
S.value为资源信号量其初值:某类资源的数目(S.value>0时,代表系统中可用资源的实体数,S.value<0时,它的绝对值代表等待该资源的进程个数)
wait操作:申请一个单位资源
Procedure wait(s)
Var S:semaphore;
begin
S.value:=S.value-1;
If S.value<0 then block(s,L)

end

对于每一次的wait操作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源减少一个,因此S.value:=S.value-1;;当S.value<0时,表示该类资源已分配完毕,因此应调用block原语进行自我阻塞,放弃处理机,并插入到信号量链表S->list中。

比如系统中有5个打印机资源,只要来一个进程就给该进程分配一个打印机资源,value值也会减少1,来了5个进程之后,此时value的值为0,当再来一个进程时,value=-1,小于0,进入阻塞队列。再来一个进程,value=-2,还是进入阻塞队列,此时value的绝对值就是代表因等待该资源而阻塞的进程数。

signal操作:释放一个单位资源
Procedure signal(s)
Var S:semaphore;
begin
S.value:=S.value+1;
If S.value<=0 then wakeup(s,L)

end

S.value++操作表示资源数目加1.若加1后仍是S.value<=0,则表示该信号量链表中仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将S->list链表中的第一个等待进程唤醒。

还是上面那个例子,现在有5个打印机资源,有三个进程使用了该资源,还剩2个资源,此时value=2,当一个进程使用完后释放该资源,value+1等于3,说明还有三个空闲资源;如果value=-2,说明因等待该资源而阻塞的进程有两个,此时一个进程释放了该资源,value值加一,value=-1,小于0,就会去唤醒因等待该资源而阻塞的队列。

S.value>=0:表示系统中可用的资源数量
S.value<0:其绝对值表示已阻塞的进程数量

S.value初值为1时:只允许一个进程访问临界资源,是互斥信号量

记录型信号量虽然满足同步机制的规则,但是针对的只是一个资源,当多个进程需要访问多个临界资源时就可能会出现问题了。

进程A和B都需要访问共享资源D和E,即

process A: process B:

wait(Dmutex) wait(Emutex)

wait(Emutex) wait(Dmutex)

若进程A和B按下述次序交替执行wait操作:

process A:wait(Dmutex);于是Dmutex=0;

process B: wait(Emutex),于是Emutex=0;

process A:wait(Emutex);于是Emutex=-1 A阻塞

process B:wait(Dmutex);于是Dmytex=-1 B阻塞

最后进程A和B就将处于僵持状态。在无外力作用下,两者都将无法从僵持状态中解脱出来。我们称此时的进程A和B已进入死锁状态。显然,当进程同时要求的共享资源越多是,发生进程死锁的可能性也就越大。再这样的背景下,就引入了AND型信号量。

AND型信号量
基本思想:将进程在整个运行中需要的所有资源,一次性全部分配给进程,待进程使用完后一起释放。
在wait中加入AND条件,又称AND同步或同时wait操作:Swait
Swait(S1,S2,...Sn)
If S1>=1 and Sn>=1 then
for i:=1 to n do
Si:=Si-1;
endfor
else
当发现第一个Si<1就把该进程放入等待队列,并将其程序计数器置于Swait操作的开始位置
endif
Ssignal(S1,S2,...Sn)
for i:=1 to n do
Si:=Si+1;
将所有等待Si的进程由等待队列去除放入到就绪队列

Endfor;

 信号量集

只是对AND型信号量的扩充,对进程申请的所有资源以及每类资源不同的资源需求量做了规定而已。所以就不多叙述了,下面只给出一般“信号量集”的集中特殊情况:

①Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d个资源。当现有资源少于d时,不予分配。

②Swait(S,1,1)。此时的信号量集以蜕化为一般的记录型信号量(S>=1)时。

③Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S>=1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。