操作系统原理离线作业已完成 联系客服

发布时间 : 星期一 文章操作系统原理离线作业已完成更新完毕开始阅读70ae0da39ec3d5bbfc0a7414

答:a.时间片是1毫秒:不论是哪个进程被调度,这个调度都会为每一次的上下文切换花费一个0.1毫秒的上下文切换。CPU的利用率是1/1.1*100=92%。

b.时间片是10毫秒:这I/O限制任务会在使用完1毫秒时间片后进行一次上下文切换。这个时间片要求在所有的进程间都走一遍,因此,10*1.1+10.1(因为每个I / O限定任务执行为1毫秒,然后承担上下文切换的任务,而CPU限制任务的执行10毫秒在承担一个上下文切换之前) 。因此,CPU的利用率是20、21.1*100=94%。

6.01在生产者和消费者问题中,信号量mutex,empty,full的作用是什么?如果对调生产者进程中的两个wait操作和两个signal操作,则可能发生什么情况?

信号量mutex的作用是保证各生产者进程和消费者进程对缓冲池的互斥访问。信号量empty和full均是资源信号量,它们分别对应于缓冲池中的空闲缓冲区和缓冲池中的产品,生产者需要通过wait(empty)来申请使用空闲缓冲区,而消费者需要通过wait(full)才能取得缓冲中的产品,可见,这两个信号量起着同步生产者和消费者的作用,它们保证生产者不会将产品存放到满缓冲区中,而消费者不会从空缓冲区中取产品。

在生产者—消费者问题中,如果将两个wait操作,即wait(full)和wait(mutex)互换位置,或者wait(empty)和wait(mutex)互换位置,都可能引起死锁。考虑系统中缓冲区全满时,若一生产者进程先执行了wait(mutex)操作并获得成功,当再执行wait(empty)操作时,它将因失败而进入阻塞状态,它期待消费者执行signal(empty)来唤醒自己,在此之前,它不可能执行signal(mutex)操作,从而使企图通过wait(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态,系统进入死锁状态。类似地,消费者进程若先执行wait(mutex),后执行wait(full)同样可能造成死锁。

signal(full)和signal(mutex)互换位置,或者signal(empty)和signal(mutex)互换位置,则不会引

起死锁,其影响只是使某个临界资源的释放略为推迟一些。

6.02 一组合作进程,执行顺序如下图。请用wait、signal操作实现进程间的同步操作。

P2 P4 P6 P1 P5 P3 各进程的执行顺序

如图示并发进程之间的前趋关系,为了使上述进程同步,可设置8个信号量a、b、c、d、e、f、g、h,它们的初值均为0,而相应的进程可描述

P1 为(其中“…”表示进程原来的代码):

b a main( )

cobegin{

P3 P2 d e

f c P1( ) { …; signal(a); signal(b); }

P2( ){ wait(a); …; signal(c); signal(d); }

P4 P5 P3( ){ wait(b); …; signal(e); signal(f); }

g h P4( ){ wait(c); wait(e); …; signal(g); }

P6 P5( ){ wait(d); wait(f); …; signal(h); }

P6( ){ wait(g); wait(h); …; }

合作进程的前趋图

}coend

6.03在生产者和消费者问题中,多个生产者进程(Producer Process)和多个消费者进程

(Consumer Process)共享一个大小为8的缓冲区,他们的信号量和共享变量设置如下: int nextc=0, nextp=0, buf[8]; semaphore full; empty; mutex;

生产者进程和消费者进程问题的算法描述如下: Producer Process: Consumer Process: int itemp; int itemc; while(1){ while(1){ 1 itemp = rand(); // Generate a number 1 wait(full); 2 wait(empty); 2 wait(mutex); 3 wait(mutex); 3 itemc=buf[nextc]; 4 buf[nextp]=itemp; 4 nextc=(nextc+1)%8; 5 nextp=(nextp+1)%8; 5 signal(mutex); 6 signal(mutex); 6 signal(empty); 7 signal(full); 7 cout << itemc << endl; } }

(1)生产者进程和消费者进程的临界区是哪些? (2)信号量full、empty和mutex的初值是多少?

(3)如果对调生产者进程中的两个P操作即第2行和第3行,以及对调消费者进程中的两个P操作即第1行和第2行,如下所示。可能发生什么情况? Producer Process Consumer Process … … 1 itemp = rand(); // Generate a number 1 wait(mutex); 2 wait(mutex); 2 wait(full); 3 wait(empty); 3 itemc=buf[nextc]; … …

(4)上面的生产者和消费者同步算法有一个缺点,在有空缓冲区时,当消费者进程正在临界区时,生产者进程必须等待,反之亦然。您如何可以解决这个问题,以提高生产者和消费者进程之间并发?写出新的生产者进程和消费者进程的同步算法。

(1)生产者进程的临界区是第4行和第5行;消费者进程的临界区是第3行和第4行。 (2)信号量full、empty和mutex的初值分别是:

empty = 8 , full = 0 , mutex = 1 。

(3)系统可能会产生死锁。例如,生产者进程得到信号量mutex,但是没有空缓冲区即empty≤0时,此时生产者进程阻塞;而消费者进程又无法得到信号量mutex,此时消费者进程也阻塞,系统产生了死锁。

(4)增加一个信号量mutex1,初值为1,其算法如下:

Producer Process Consumer Process int itemp; int itemc; while(1){ while(1){ 1 itemp = rand(); // Generate a number 1 wait(full);

2 3 4 5 6 7

wait(empty); wait(mutex1); buf[nextp]=itemp; nextp=(nextp+1)%8; signal(mutex1); signal(full); }

4 5 7 2 wait(mutex);

3 itemc=buf[nextc]; nextc=(nextc+1)%8; signal(mutex); 6 signal(empty); cout << itemc << endl; }

6.04有2个合作的进程P1、P2 。他们从一台输入设备读入数据, P1进程读入数据a,P2进程读入数据b。输入设备是一台独享设备 。两个进程做如下计算:

P1: x = a + b P2: y = a * b

计算完成后结果的x、y由进程P1输出。用信号量实现P1、P2同步算法。

P1 输出设备 Input(a)

输入设备 P2 Input(b) 设置三个信号:s1表示数据a是否读入,s2表示数据b是否读入,s3表示数据y=a*b计算是否完成。P1和P2两个进程的同步算法如下: semaphore s1=0, s2=0, s3=0; main() cobegin{ P1: P2: { {

input (a) ; wait(s1); signal(s1); input (b); wait(s2); signal(s2); x=a+b; y=a*b; wait(s3) ; signal(s3); Print (x,y,z); } } }coend

7.1 假设有如下图所示的交通死锁情况:

(1) 说明产生死锁的4个必要条件在此处成立。 (2) 给出一个避免死锁的简单规则。

(1)在此处,产生死锁的四个必要条件如下:

1) 互斥条件。每个车道的每段道路只能被一辆车占用。

2) 请求与保持条件。每个车队占用了一个车道,并请求前方的车道,即使需等待

前方车道上的车队驶离,它仍将持有已占用的车道。

3) 不抢占(剥夺)条件。在前方的车道被其它车队占用时,因为是单车道,而其

它车队又不会后退,所以无法从其它车队处抢占车道。 4) 环路等待条件。向东行驶的车队等待向北行驶的车队让出车道,向北行驶的车

队等待向西行驶的车队让出车道,向西行驶的车队等待向南行驶的车队让出车道,而向南行驶的车队则等待向东行驶的车队让出车道。故存在一循环等待链。

(2)增加一个约束条件:只有前方两个路口都空闲时,才能占用第一个路口。或者,可在十字路口设置一交通信号灯,并使南北方向的两个车队和东西方向的两个车队互斥地使用十字路口,便可避免交通死锁。

7.11设有一系统在某时刻的资源分配情况如下: 进程号 已分配资源 最大请求资源 剩余资源 A B C D A B C D A B C D P0 0 0 1 2 0 0 1 2 1 5 2 0 P1 1 0 0 0 1 7 5 0 P2 1 3 5 4 2 3 5 6 P3 0 6 3 2 0 6 5 2 P4 0 0 1 4 0 6 5 6 请问:

(1)系统中各进程尚需资源数各是多少? (2)当前系统安全吗?

(3) 如果此时进程P1提出资源请求(0,4,2,0),系统能分配给它吗?

(1)尚需资源数矩阵如下:

Need = Max – Allocation Need P0 P1 P2 P3 P4

(2)系统是安全的,因为可以找到一个安全序列: (3)如P1申请(0,4,2,0),则: Request1(0,4,2,0) <=need1(0,7,5,0) Request1(0,4,2,0) <= available(1,5,2,0) 新的状态为

Allocation Max Need Available P0 0 0 1 2 0 0 1 2 0 0 0 0 1 1 0 0

A 0 0 1 0 0 B 0 7 0 0 6 C 0 5 0 2 4 D 0 0 2 0 2