习题参考答案 下载本文

内容发布更新时间 : 2024/4/29 0:25:25星期一 下面是文章的全部内容请认真阅读。

习题1.4

程序A 程序B 程序C CPU 20ms IO2 30ms IO1 20ms IO2 30ms CPU 30ms IO2 20ms CPU 30ms CPU 30ms CPU 20ms IO1 20ms IO1 20ms IO2 30ms CPU 30ms CPU 50ms IO1 40ms IO1 30ms 60 70 90 100 110 130 140 150 170 180 0 20 30 单位:ms 程序A CPU X 程序B CPU Y 程序C I/O1 I/O2

假定在具有2个CPU为X和Y的多机系统中,以多道程序设计方式,按如下条件执行上述3个程序,条件如下:

(1)X和Y运算速度相同,整个系统可以同时执行2个程序,并且在并行处理程序时速度也不下降。

(2)X的优先级比Y高,即当X、Y均能执行程序时,由X去执行。

(3)当多个程序同时请求CPU或I/O设备时,按程序A、B、C的次序分配所请求的资源。

(4)除非请求输入输出,否则执行中的程序不会被打断,也不会把控制转给别的CPU。而且因输入输出而中断的程序再重新执行时,不一定仍在同一CPU上执行。

(5)控制程序的介入时间可忽略不计。 (6)程序A、B、C同时开始执行。 求:(1)程序A、B、C同时开始执行到执行完毕为止的时间。(2)X和Y的使用时间。 由上图可以看出

(1)A 170ms B 150ms C 180ms (2)X的使用时间 120ms Y的使用时间 90ms

习题3.4

1)引起各种状态转换的典型原因有哪些?

运行态→就绪态 时间片到或被更高优先级的进程抢占 就绪态→运行态 被调度

运行态→阻塞态 等待某一事件的发生而事件未发生 阻塞态→就绪态 等待的事件已发生

2)当观察系统中某些进程时,能够看到某一进程的一次状态转换能引起另一个进程的一次状态转换。在什么情况下,当一个进程发生转换3时能立即引起另一个进程发生转换2?

就绪队列中只有一个进程

3)如图3.15,说明是否会发生下述因果转换: 2→1 会,在抢占式调度的情况下,更高优先级的进程到达,或时间片到 3→2 会,一个正在运行的进程因等待某一事件的发生而转入阻塞态,而就绪队列中有进程在等待运行 4→1 不会

(3)挂起状态和阻塞状态有何区别?在具有挂起操作的系统中,进程的状态有哪些?如何变迁?

被挂起进程处于静止状态,不能参与竞争CPU,直到被激活,但被挂起进程可能并不缺少资源;而阻塞进程是由于等待某一事件的发生,处于缺乏资源的状态。

(4)在创建一个进程时需要完成的主要工作是什么?在撤消一个进程时需要完成的主要工作又是什么?

创建进程的主要工作是为被创建进程创建一个PCB,并填入相应的初始值。并把该进程插入就绪队列。

撤消该进程的所有子孙进程。在撤消的过程中,被撤消进程的所有系统资源(内存、外设)应全部释放出来归还给系统,并将它们从所有队列中移出。如果被撤消进程正在处理器上运行,则要调用进程调度程序将处理器分配给其它进程。

习题4.5

5.应用题

(1)有三个并发进程R、W1和W2,共享两个各可存放一个数的缓冲区B1、B2。进程R每次从输入设备读入一个数,若读入的是奇数,则将它存入B1中,若读入的是偶数,将它存入B2中;当B1中有数,由进程W1将其打印输出;当B2中有数,进程W2将其打印输出。试编写保证三者正确工作的程序。

struct semaphone B1_Empty, B1_Full, B2_Empty, B2_Full; B1_Empty.value=1; B1_Full.value=0; B2_Empty.value=1; B2_Full.value=0; void R( ) { int a; While(1)

{ read a number a; if (a%2) { wait(B1_Empty);

put a in B1;

signal(B1_Full);

} else

{ wait(B2_Empty);

put a in B2; signal(B2_Full); }

} }

void W1( ) { while(1) { wait(B1_Full); print a number from B1; signal(B1_Empty); } }

void W2( ) { while(1) { wait(B2_Full); print a number from B2; signal(B2_Empty); } }

void main( )

{ parbegin(R, W1, W2); }

(4)桌上有一空盘,可放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子;儿子专等吃盘中的桔子;女儿专等吃盘中的苹果。规定一次只能放一只水果,试写出爸爸、儿子、女儿正确同步的程序。

struct semaphone plate, apple, orange; plate.value=1; apple.value=0; orange.value=0; void father( ) { while(1)

{ prepare an apple or orange; wait(plate); put the apple or orange in plate;

}

if(放入的是Apple) signal(apple); //如果放的是苹果 else signal(orange); //如果放的是桔子

}

void son( )

{ while(1) { wait(orange); get an orange from the plate; signal(plate); } } void daughter( ) { while(1) { wait(apple); get an apple from the plate; signal(plate); } } Void main( ) {

parbegin(father, son, daughter); }

互斥与同步区别:互斥是为了保证资源一次只能由一个进程使用;而同步是为了实现进程通信,即传递资源当前的状态是否适合另一个进程进行使用。

(5)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用prodcuce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述(2009年全国硕士研究生入学考试题)。

定义信号量full_odd控制P1与P2之间的同步;full_even控制P1与P3之间的同步;empty控制生产者与消费者之间的同步(是否可生产);mutex控制进程间互斥使用缓冲区。

struct semaphone full_odd, full_even, mutex, empty; full_odd.value=0; full_even.value=0; mutex.value=1; empty.value=N; void P1( ) { int x; while(1)

{ x=produce( ); wait(empty); wait(mutex); put( );

}

if(x%2==0) signal(full_even); else signal(full_odd); signal(mutex);

} void P2( ) { wait(full_odd); wait(mutex); getodd( ); countodd( )=countodd( )+1; signal(empty); signal(mutex); } void P3( ) { wait(full_even); wait(mutex); geteven( ); counteven( )=counteven( )+1; signal(empty); signal(mutex); } void main( ) { parbegin(P1( ), P2( ), P3( )); }

习题5.3 3.6

1 时间片轮转调度算法:这是一种常用于分时系统的调度算法,它只能适用于一般实时信息处理系统,而不能用于实时要求严格的实时控制系统。

2 非抢占的优先级调度算法:常用于多道批处理系统的调度算法,也可用于实时要求不太严格的实时控制系统。

3 基于时钟中断抢占的优先级调度算法:用于大多数的实时系统中。

4 立即抢占的优先级调度算法:这种算法适用于实时要求比较严格的实时控制系统。

4.应用题

(1)考虑5个进程P1、P2、P3、P4、P5,它们的创建时间、运行时间及优先数如下表所示。规定进程的优先数越小,优先级越高。试描述在采用下述几种调度算法时各个进程运行过程,并计算采用每种算法时的进程平均周转时间。假设忽略进程的调度时间。

1)先来先服务调度算法;

2)时间片轮转调度算法(时间片为1ms); 3)非剥夺式优先级调度算法; 4)剥夺式优先级调度算法。 进程 P1 创建时间 0 运行时间(ms) 3 优先数 3