4 1 答:(1)在本题所给的进程状态转换图中.存在四种状态转换。当进程调度程序从就绪队 列中选取一个进程投入运行时引起转换1;正在执行的进程如因时间片用完而被暂停执行就会引起转换2;正在执行的进程因等待的事件尚未发生而无法执行(如进程请求完成I/O)则会引起转换3;当进程等待的事件发生时(如I/O完成)则会引起转换4。
(2)如果就绪队列非空,则一个进程的转换3会立即引起另一个进程的转换1。这是因为一个进程发生转换3意味着正在执行的进程由执行状态变为阻塞状态,这时处理机空闲,进程调度程序必然会从就绪队列中选取一个进程并将它投入运行,因此只要就绪队列非空,一个进程的转换3能立即引起另一个进程的转换1。 (3)所谓因果转换指的是有两个转换,一个转换的发生会引起另一个转换的发生,前一个转换称为因,后一个转换称为果,这两个转换称为因果转换。当然这种因果关系并不是什么时候都能发生,而是在一定条件下才会发生。
2 1:发生转换2时,就必然引起另一进程的转换1。因为当发生转换2时,正在执行的进程从执行状态变为就绪状态,进程调度程序必然会从就绪队列中选取一个进程投入运行,即发生转换1。 3 2: 某个进程的转换3决不可能引起另一进程发生转换2。这是因为当前执行进程从执行状态变为阻塞状态.不可能又从执行状态变为就绪状态。
4 1: 当处理机空闲且就绪队列为空时,某一进程的转换4就会引起该进程的转换1。因为此时处理机空闲,一旦某个进程发生转换4,就意味着有一个进程从阻塞状态变为就绪状态,因而调度程序就会将就绪队列中的此进程投入运行。
5.某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:
(1)用PV操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值以及信号量各种取值的含义。
(2)根据所定义的信号量,把应执行的P、V操作填入下面横线上,以保证进程能够正确地并发执行。
(3)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。
答:(1)定义一信号量S,初始值为20,其意义如下: S>0 S的值表示可继续进入售票厅的人数 S=0 表示售票厅中已有20名顾客(购票者) S<0 |S|的值为等待进入售票厅的人数
(2)根据所定义的信号量,把应执行的P、V操作填入下面横线上,以保证进程能够正确地并发执行。
COBEGIN PROCESS Pi(i=1,2,??)
begin; P(S)
进入售票厅; 购票; 退出;
V(S) end; COEND
(3) S的最大值为20;S的最小值为20-n
6.理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子.如果没有顾客,则理发师便在理发椅上睡觉.当一个顾客到来时,他必须先唤醒理发师.如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则离开。
解:定义信号量如下: Var
Sn: semaphore; {位子数目,初值为n}
S: semaphore; {理发师睡觉,初值为1}
mutex: semaphore; {初值为1} 用P、V操作实现如下: 顾客进程 i: P(Sn);{门外观望} P(mutex); 进门; V(mutex);
V(S); {if(sn==n-1) v(s); } 等候; 理发; V(Sn) P(mutex); 出门; V(mutex);
理发师进程 : Repeat P(S); P(mutex); 叫人理发; V(mutex);
理发; Until false;
7.试写出用加锁原语和开锁原语实现两个进程关于临界资源的操作的描述。
答:Program test begin
s:=0 (表示该资源可用) cobegin (1) A: begin ┇ 加锁原语; 临界区A; 开锁原语; ┇ end B: begin ┇ 加锁原语; 临界区B; 开锁原语; ┇ end conend end
8. 桌子上有一只盘子,每次只能放入一只水果。爸爸专向盘中放苹果,妈妈专向盘中放桔子,一个儿子专等吃盘中的桔子,一个女儿专等吃盘中的苹果。请利用P、V操作实现他们之间的同步。
解:在本题中,应设置三个信号量s、so、sa,信号量s表示盘子是否为空,其初值为1;信号量so表示盘中是否有桔子,其初值为0;信号量sa表示盘中是否有苹果,其初值为0。同步描述如下:
int s=1; int sa=0; int so=0; main ( ) {
cobegin father ( ); son ( );
daughter ( );
coend }
father ( ) { p(s);
将水果放入盘中; if(放入的是桔子) v(so); else v(sa); } son ( ) {
p(so);
从盘中取出桔子; v(s); 吃桔子; }
daughter ( ) {
p(sa);
从盘中取出苹果; v(s); 吃苹果; }
9.桌子上有一只盘子,最多可容纳两个水果,每次只能放人或取出一个水果。爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用Pv操作来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。
解:盘子为互斥资源,因可以放两个水果,empty初值为2;再设信号量mutex初值为1,控制对盘子的互斥访问;apple表示盘中苹果个数,表示盘中桔子个数,初值均为0。 parbegin Father: begin
L1: p(empty); P(mutex); 放苹果; V(mutex);
V(apple); Goto L1; End; Mother: begin L2: P(empty); P(mutex); 放桔子; V(mutex); V(orange); Goto L2; End; Daughter: begin L3: p(apple);
P(mutex); 取苹果; V(mutex); V(empty); Goto L3; End; Son: begin L4: P(orange);
P(mutex); 取桔子; V(mutex); V(empty); Goto L4; End; Parend
10.现为某临界资源设一把锁w,当w=1时,表示关锁,w=0时,表示锁已打开,试写出开锁和关锁的原语,并说明如何利用它们去控制对该临界资源的互斥访问?
解:① 开锁原语unlock(w)如下: unlock(w): w:=0 关锁原语lock(w)如下:
Lock(w): while w=1 do skip; w:=1; ② 可设临界段cs放在两者之间来实现互斥,即 Lock(w);
cs; unlock(w)