进程 - 2

1.下列进程调度算法中,综合考虑进程等待时间和执行时间的是()

  • 时间片轮转调度算法
  • 短进程优先调度算法
  • 先来先服务调度算法
  • 高响应比优先调度算法

解析:
在高响应比优先调度算法中,选出响应比最高的进程投入执行,响应比R定义如下:响应比R=(等待时间+执行时间)/执行时间。它综合考虑了每个进程的等待时间和执行时间,对于同时到达的长进程和短进程,短进程会优先执行,以提高系统吞吐量;而长进程的响应比可以随等待时间的增加而提高,不会产生进程无法调度的情况。 .

2.某计算机系统中有8台打印机,由K个进程竞争使用,每个进程最多需要3台打印机。该系统可能会发生死锁的K的最小值是()

  • 2
  • 3
  • 4
  • 5

解析:
这种题用到组合数学中鸽巢原理的思想。考虑最极端情况,因为每个进程最多需要3台打印机,如果每个进程已经占有了2台打印机,那么只要还有多的打印机,总能满足一个进程达到3台的条件,然后顺利执行,所以将8台打印机分给K个进程,每个进程有2台打印机,这个情况就是极端情况,K为4 

3.下列选项中,导致创建新进程的操作是()。

Ⅰ.用户登录成功    Ⅱ.设备分配        Ⅲ.启动程序执行

  • 仅Ⅰ和Ⅱ
  • 仅Ⅱ和Ⅲ
  • 仅Ⅰ和Ⅲ
  • Ⅰ、Ⅱ和Ⅲ

解析:
引起进程创建的事件有:用户登录、作业调度、提供服务、应用请求等。Ⅰ.用户登录成功后,系统要为此创建一个用户管理的进程,包括用户桌面、环境等。所有的用户进程会在该进程下创建和管理。Ⅱ.设备分配是通过在系统中设置相应的数据结构实现的,不需要创建进程。Ⅲ.启动程序执行是典型的引起创建进程的事件。 

4.设与某资源关联的信号量初值为3,当前值为1。若M表示该资源的可用个数,N表示等待该资源的进程数,则M、N分别是(B)。

  • 0、1
  • 1、0
  • 1、2
  • 2、0

解析:
信号量表示相关资源的当前可用数量。当信号量K>0时,表示还有K个相关资源可用,所以该资源的可用个数是1。而当信号量K<0时,表示有|K|个进程在等待该资源。由于资源有剩余,可见没有其他进程等待使用该资源,故进程数为0。 

5.下列选项中,降低进程优先级的合理时机是(A)。

  • 进程的时间片用完
  • 进程刚完成I/O,进入就绪列队
  • 进程长期处于就绪列队中
  • 进程从就绪状态转为运行状态

解析:
进程时间片用完,可降低其优先级以让别的进程被调度进入执行状态。B选项中进程刚完成I/O,进入就绪队列等待被处理机调度,为了让其尽快处理I/O结果,故应提高优先权。C选项中进程长期处于就绪队列,为不至于产生饥饿现象,也应适当提高优先级。D选项中进程的优先级不应该在此时降低,而应在时间片用完后再降低。 

6.进程P0和P1的共享变量定义及其初值为:

boolean flag[2];

int turn=0;

flag[0]=FALSE;flag[1]=FALSE;

若进程P0和P1访问临界资源的类C伪代码实现如下:

则并发执行进程P0和P1时产生的情形是(D)。

  • 不能保证进程互斥进入临界区,会出现“饥饿”现象
  • 不能保证进程互斥进入临界区,不会出现“饥饿”现象
  • 能保证进程互斥进入临界区,会出现“饥饿”现象
  • 能保证进程互斥进入临界区,不会出现“饥饿”现象

解析:

这是皮特森算法的实际实现,保证进入临界区的进程合理安全。该算法为了防止两个进程为进入临界区而无限期等待,设置变量turn,表示不允许进入临界区的编号,每个进程在先设置自己标志后再设置turn标志,不允许另一个进程进入,这时,再同时检测另一个进程状态标志和不允许进入表示,这样可以保证当两个进程同时要求进入临界区时只允许一个进程进入临界区。保存的是较晚的一次赋值,则较晚的进程等待,较早的进程进入。先到先入,后到等待,从而完成临界区访问的要求。

其实这里可以想象为两个人进门,每个人进门前都会和对方客套一句“你走先”。如果进门时没别人,就当和空气说句废话,然后大步登门入室;如果两人同时进门,就互相请先,但各自只客套一次,所以先客套的人请完对方,就等着对方请自己,然后光明正大地进门。

7.下列选项中,满足短任务优先且不会发生饥饿现象的调度算法是()。

  • 先来先服务
  • 高响应比优先
  • 时间片轮转
  • 非抢占式短任务优先

解析:
高响应比优先算法是一种综合考虑任务长度和等待时间的调度算法,响应比=(等待时间+执行时间)/执行时间。高响应比优先算法在等待时间相同的情况下,作业执行时间越短则响应比越高,满足短任务优先。随着长任务的等待时间增加,响应比也会变大,执行机会也就增大,所以不会发生饥饿现象。先来先服务和时间片轮转不符合短任务优先,非抢占式短任务优先会产生饥饿现象。 

8.在支持多线程的系统中,进程P创建的若干个线程不能共享的是()。

  • 进程P的代码段
  • 进程P中打开的文件
  • 进程P的全局变量
  • 进程P中某线程的栈指针

解析:
进程是资源分配的基本单位,线程是处理机调度的基本单位。因此,进程的代码段、进程打开的文件、进程的全局变量等都是进程的资源,唯有进程中某线程的栈指针是属于线程的,属于进程的资源可以共享,属于线程的栈是独享的,对其他线程透明。 

9.某时刻进程的资源使用情况如下表所示。

进程

已分配资源

尚需分配

可用资源

R1

R2

R3

R1

R2

R3

R1

R2

R3

P1

2

0

0

0

0

1

0

2

1

P2

1

2

0

1

3

2

P3

0

1

1

1

3

1

P4

0

0

1

2

0

0

此时的安全序列是()。

  • P1,P2,P3,P4
  • P1,P3,P2,P4
  • P1,P4,P3,P2
  • 不存在的

解析:
本题应采用排除法,逐个代入分析。当剩余资源分配给P1,待P1执行完后,可用资源数为(2,2,1),此时仅能满足P4的需求,排除AB;接着分配给P4,待P4执行完后,可用资源数为(2,2,2),此时已无法满足任何进程的需求,排除C。此外,本题还可以使用银行家算法求解(对于选择题来说,显得过于复杂) 

10.有两个并发执行的进程P1和P2,共享初值为1的变量x。P1对x加1,P2对x减1。加1和减1操作的指令序列分别如下所示。

//加1操作                               //减1操作

load  R1,x    //取x到寄存器R1中        load  R2,x

inc  R1                                    dec  R2

store  x,R1   //将R1的内容存入x        store  x,R2

两个操作完成后,x的值(C)。

  • 可能为-1或3
  • 只能为1
  • 可能为0、1或2
  • 可能为-1、0、1或2

解析:
将P1中3条语句依次编号为1、2、3;P2中3条语句依次编号为4、5、6。则依次执行1、2、3、4、5、6得结果1,依次执行1、2、4、5、6、3得结果2,执行4、5、1、2、3、6得结果0。结果-1不可能得出。 

 11.假设5个进程P0、P1、P2、P3、P4共享三类资源R1、R2、R3,这些资源总数分别为18、6、22。T0时刻的资源分配情况如下表所示,此时存在的一个安全序列是()。

进程

已分配资源

资源最大需求

R1

R2

R3

R1

R2

R3

P0

3

2

3

5

5

10

P1

4

0

3

5

3

6

P2

4

0

5

4

0

11

P3

2

0

4

4

2

5

P4

3

1

4

4

2

4

  • P0, P2, P4, P1, P3
  • P1, P0, P3, P4, P2
  • P2, P1, P0, P3, P4
  • P3, P4, P2, P1, P0

解析:首先求得各进程的需求矩阵Need与可利用资源矢量Available:

进程

Need

R1

R2

R3

P0

2

3

7

P1

1

3

3

 

P2

0

0

6

 

P3

2

2

1

Available

R1

R2

R3

P4

1

1

0

2

3

3

比较Need,Available可以发现,初始时进程P1与P3可满足需求,排除A、C。尝试给P1分配资源,则P1完成后Available将变为(6,3,6),无法满足P0的需求,排除B。尝试给P3分配资源,则P3完成后Available将变为(4,3,7),该向量能满足其他所有进程的需求。所以,以P3开头的所有序列都是安全序列。

12一个多道批处理系统中仅有P1 和 P2 两个作业, P2 比 P1 晚 5ms 到达。它们的计算和I/O 操作顺序如下:
P1:计算 60ms, I/O 80ms,计算 20ms

P2:计算 120ms, I/O 40ms,计算 40ms
若不考虑调度和切换时间,则完成两个作业需要的时间最少是(B)。

  • 240ms
  • 260ms
  • 340ms
  • 360ms

解析: 

0~60ms          P1计算
60~180ms      P2计算,P1 I/O
180~220ms    P2 I/O,P1 计算
220~260ms    P2计算

13.若某单处理器多进程系统中有多个就绪态进程,则下列关于处理机调度的叙述中,错误的是()。

  • 在进程结束时能进行处理机调度
  • 创建新进程后能进行处理机调度
  • 在进程处于临界区时不能进行处理机调度
  • 在系统调用完成并返回用户态时能进行处理机调度

解析:
选项A、B、D显然是可以进行处理机调度的情况。对于C,当进程处于临界区时,说明进程正在占用处理机,只要不破坏临界资源的使用规则,是不会影响处理机调度的。比如,通常访问的临界资源可能是慢速的外设(如打印机),如果在进程访问打印机时,不能进行处理机调度,那么系统的性能将是非常差的。 

 14.下列关于进程和线程的叙述中,正确的是(A)。

  • 不管系统是否支持线程,进程都是资源分配的基本单位
  • 线程是资源分配的基本单位,进程是调度的基本单位
  • 系统级线程和用户级线程的切换都需要内核的支持
  • 同一进程中的各个线程拥有各自不同的地址空间

解析:
在引入线程后,进程依然还是资源分配的基本单位,线程是调度的基本单位,同一进程中的各个线程共享进程的地址空间。在用户级线程中,有关线程管理的所有工作都由应用程序完成,无需内核的干预,内核意识不到线程的存在。 

15.某系统正在执行三个进程 P1、 P2 和 P3, 各进程的计算( CPU)时间和 I/O 时间比例如下表所示。

进程

计算时间

I/O时间

P1

90%

10%

P2

50%

50%

P3

15%

85%

为提高系统资源利用率,合理的进程优先级设置应为(B)。

  • P1>P2>P3
  • P3>P2>P1
  • P2>P1=P3
  • P1>P2=P3

 解析:计算进程会占用大量的cpu时间,而i/o大的会占用较少的cpu资源,相当于短作业,所以应该优先权更高。

16.下列关于银行家算法的叙述中,正确的是(B)。

  • 银行家算法可以预防死锁
  • 当系统处于安全状态时, 系统中一定无死锁进程
  • 当系统处于不安全状态时, 系统中一定会出现死锁进程
  • 银行家算法破坏了死锁必要条件中的“ 请求和保持” 条件

 解析:

死锁的必要条件有:

1、互斥条件(任一时刻一个资源仅为一个进程独占)

2、占有且等待条件

3、不剥夺条件(任一进程不呢从其他资源处抢夺资源)

4、循环等待条件(存在一个循环等待链)

死锁的发生必定有上述四个条件的同时成立,同理,只要破坏四个条件中的任何一个就可预防死锁的发生

A-->“死锁的预防”是破坏四个必要条件的任何一个;“死锁的避免”是掌握系统中并发进程的状态和与这些进程有关的资源动态申请情况,做出合理选择,避免死锁的发生,“银行家算法”属于“死锁的避免”

C-->“不安全状态”并不一定导致死锁的发生

D-->“银行家算法”属于死锁的避免,没有破坏死锁发生的四个必要条件中的任何一个

17.下列调度算法中,不可能导致饥饿现象的是 

  • 时间片轮转
  • 静态优先数调度
  • 非抢占式短作业优先
  • 抢占式短作业优先

解析:
采用静态优先级调度时,当系统总是出现优先级高的任务时,优先级低的任务会总是得不到处理机而产生饥饿现象;而短任务优先调度不管是抢占式或是非抢占的,当系统总是出现新来的短任务时,长任务会总是得不到处理机,产生饥饿现象,因此B、C、D都错误,选A

18.某系统有n台互斥使用的同类设备,三个并发进程分别需要3、4、5台设备,可确保系统不发生死锁的设备数n最小为 

  • 9
  • 10
  • 11
  • 12

 解析:
三个并发进程分别需要3、4、5台设备,当系统只有(3-1)+(4-1)+(5-1)=9台设备时,第一个进程分配2台,第二个进程分配3台,第三个进程分配4台。这种情况下,三个进程均无法继续执行下去,发生死锁。当系统中再增加1台设备,也就是总共10台设备时,这最后1台设备分配给任意一个进程都可以顺利执行完成,因此保证系统不发生死锁的最小设备数为10。

19.一个进程的读磁盘操作完成后,操作系统针对该进程必做的是 

  • 修改进程状态为就绪态
  • 降低进程优先级
  • 给进程分配用户内存空间
  • 增加进程时间片大小

解析:

进程申请读磁盘操作的时候,因为要等待I/O操作完成,会把自身阻塞,此时进程就变为了阻塞状态,当I/O操作完成后,进程得到了想要的资源,就会从阻塞态转换到就绪态(这是操作系统的行为)。而降低进程优先级、分配用户内存空间和增加进程的时间片大小都不一定会发生,选A

20.下列关于管道(Pipe)通信的叙述中,正确的是()?

  • 进程对管道进行读操作和写操作都可能被阻塞
  • 一个管道只能有一个进程或一个写进程对其操作
  • 一个管道可实现双向数据传输
  • 管道的容量仅受磁盘容量大小限制

解析:
A.正确,因为管道为空,读操作会被阻塞;管道满了,写操作会被阻塞
B.可以有多个进程对其读;也可以有多个进程写,只不过不能同时写。并且题目没有说“同时”,B不对
C.匿名管道只能单向;命名管道可以双向;所以C过于绝对
D.管道是内存中的,所以D不对 

详:
管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。它类似于通信中半双工信道的进程通信机制,一个管道可以实现双向 的数据传输,而同一个时刻只能最多有一个方向的传输,不能两个方向同时进行。管道的容 量大小通常为内存上的一页,它的大小并不是受磁盘容量大小的限制。当管道满时,进程在 写管道会被阻塞,而当管道空时,进程读管道会被阻塞,选A,而C不能同时进行双向传输

21.处理外部中断时,应该由操作系统保存的是()。

  • 程序计数器(PC)的内容
  • 通用寄存器的内容
  • 块表(TLB)中的内容
  • Cache 中的内容

解析:外部中断处理过程, PC 值由中断隐指令自动保存,而通用寄存器内容由操作系统保存 

 详:
外部中断处理过程首先要保护现场,使得中断处理完之后能够恢复程序的执行状态继续执行。保护现场有两个含义:(1)由中断隐指令保存程序的断点(程序计数器)(2)由中断服务程序保存通用寄存器和状态寄存器的内容,中断服务程序是操作系统的一部分。

22.下列选项中,会导致进程从执行态变为就绪态的事件是

  • 执行P(wait)操作
  • 申请内存失败
  • 启动I/O设备
  • 被高优先级进程抢占

 解析:P(wait)操作表示进程请求某一资源,A、B和C都因为请求某一资源会进入阻塞态,而D只是被剥夺了处理机资源,进入就绪态,一旦得到处理机即可运行

23.若系统 S1 采用死锁避免方法,S2 采用死锁检测方法。下列叙述中,正确的是 (B)。

Ⅰ.S1 会限制用户申请资源的顺序,而 S2 不会

Ⅱ.S1 需要进程运行所需资源总量信息,而 S2 不需要

Ⅲ.S1 不会给可能导致死锁的进程分配资源,而 S2 会
解析:

死锁的处理采用三种策略:死锁预防、死锁避免、死锁检测和解除。

死锁预防,采用破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。其中之一的“破坏循环等待条件”,一般采用顺序资源分配法,首先给系统的资源编号,规定每个进程必须按编号递增的顺序请求资源,也就是限制了用户申请资源的顺序,故 Ⅰ的前半句属于死锁预防的范畴。

银行家算法是最著名的死锁避免算法,其中的最大需求矩阵 MAX 定义了每一个进程对 m 类资源的最大需求量,系统在执行安全性算法中都会检查此次资源试分配后,系统是否处于安全状态,若不安全则将本次的试探分配作废。在死锁的检测和解除中,在系统为进程分配资源时不采取任何措施,但提供死锁的检测和解除的手段,故 Ⅱ、Ⅲ正确

24.系统中有3个不同的临界资源R1、R2和R3,被4个进程p1、p2、p3及p4共享。各进程对资源的需求为:p1申请R1和R2,p2申请R2和R3,p3申请R1和R3,p4申请R2。若系统出现死锁,则处于死锁状态的进程数至少是

  • 1
  • 2
  • 3
  • 4

 解析:C,没什么花里胡哨

25.使用TSL(Test and Set Lock)指令实现进程互斥的伪代码如下所示。

do{
……
 while(TSL(&lock)) ;
 critical section;
 lock=FALSE;
……
} while(TRUE);

下列与该实现机制相关的叙述中,正确的是

  • 退出临界区的进程负责唤醒阻塞态进程
  • 等待进入临界区的进程不会主动放弃CPU
  • 上述伪代码满足“让权等待”的同步准则
  • while(TSL(&lock))语句应在关中断状态下执行

解析:自旋锁--Test and Set Clock机制分析

由上面的一大段分析可知,A项表述的是信号量机制这些进程较长时才有的状态,即进程无法访问临界资源时要去睡眠,在TSL里,都是短进程,都是精力充沛的,忙则等待的类型。因此,没人睡,自然也不存在唤醒。
C项让权等待与B项表达的东西是相反的。让权是什么意思?有必要特别说明。让权等待是一种策略,但是对象可以是CPU也可以是临界资源。这要看具体语境。这里,针对临界资源的访问,让权等待是指:当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。我们需要形成一种概念是,进程是程序的动态执行过程,忙则等待资源时,必然是在运行的进程,是有CPU在背后力挺的,睡眠就是说没有资源赶紧滚,别占着CPU!

想一想进程调度的三大基本形态:就绪态,运行态,阻塞态三态之间的互相转化。

因此,C项错,B项对,忙则等待就是要占着CPU,所幸的是进程不长,否则递归调用一定产生死锁。

D项是很细致的考察,前面专门提过,TSL是多处理器下的进程并发问题,只有在中断机制下采用PSW,关中断/开中断方式来进行进程的并发控制

 26.
进程P1和P2均包含并发执行的线程,部分伪代码描述如下所示。

下列选项中,需要互斥执行的操作是

  • a =1与a = 2
  • a = x与b = x
  • x += 1与x += 2
  • x += 1与x += 3

解析:

P1中对a进行赋值,并不影响最终的结果,故a=1与a=2不需要互斥执行;a=x与b=x执行先后不影响a与b的结果,无需互斥执行;x+=1与x+=2执行先后会影响x的结果,需要互斥执行;P1中的x和P2中的x是不同范围中的x,互不影响,不需要互斥执行;

27.下列关于管程的叙述中,错误的是 

  • 管程只能用于实现进程的互斥
  • 管程是由编程语言支持的进程同步机制
  • 任何时候只能有一个进程在管程中执行
  • 管程中定义的变量只能被管程内的过程访问

解析:

管程是由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程。管程不仅能实现进程间的互斥,而且能实现进程间的同步,故A错误、B正确;管程具有特性:①局部于管程的数据只能被局部于管程内的过程所访问;②一个进程只有通过调用管程内的过程才能进入管程访问共享数据;③每次仅允许一个进程在管程内执行某个内部过程,故C和D正确。

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

解析:

斥资源:缓冲区只能互斥访问,因此设置互斥信号量mutex。

同步问题:P1、P2因为奇数的放置与取用而同步,设同步信号量odd;P1、P3因为偶数的放置与取用而同步,设置同步信号量even;P1、P2、P3因为共享缓冲区,设同步信号量empty,初值为N。程序如下:

semaphore mutex=1;
semaphore odd=0,even=0;
semaphore empty=N;
main()
cobegin{
    Process P1()
    while(True)
    {
        x=produce();                //生成一个数
        P(empty);                //判断缓冲区是否有空单元
        P(mutex);                //缓冲区是否被占用
        Put();
        V(mutex);                //释放缓冲区
        if(x%2==0)
            V(even);                //如果是偶数,向P3发出信号
        else
            V(odd);                //如果是奇数,向P2发出信号
    }
    Process P2()
    while(True)
    {
        P(odd);                    //收到P1发来的信号,已产生一个奇数
        P(mutex);                //缓冲区是否被占用
        getodd();
        V(mutex);                 //释放缓冲区
        V(empty);                //向P1发信号,多出一个空单元
        countodd();
    }
    Process P3()
    while(True)
    {
        P(even);                    //收到P1发来的信号,已产生一个偶数
        P(mutext);                //缓冲区是否被占用
        geteven();
        V(mutex);                //释放缓冲区
        V(empty);                //向P1发信号,多出一个空单元
        counteven();
    }
}coend

29.某银行提供1个服务窗口和10个供顾客等待的座位。顾客到达银行时,若有空座位,则到取号机上领取一个号,等待叫号。取号机每次仅允许一位顾客使用。当营业员空闲时,通过叫号选取一位顾客,并为其服务。顾客和营业员的活动过程描述如下:

cobegin
{
    process  顾客i
    {
        从取号机获取一个号码;
        等待叫号;
        获取服务;
    }
    process  营业员
    {
        while(TRUE)
        {
 
    叫号;
 
    为客户服务;
 
    }
 
    }
 
    }coend

请添加必要的信号量和P、V(或wait()、signal())操作,实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。

解析:
1)互斥资源:取号机(一次只一位顾客领号),因此设一个互斥信号量mutex。

2)同步问题:顾客需要获得空座位等待叫号,当营业员空闲时,将选取一位顾客并为其服务。空座位的有、无影响等待顾客数量,顾客的有、无决定了营业员是否能开始服务,故分别设置信号量empty和full来实现这一同步关系。另外,顾客获得空座位后,需要等待叫号和被服务。这样,顾客与营业员就服务何时开始又构成了一个同步关系,定义信号量service来完成这一同步过程。

semaphore empty=10;            //空座位的数量
semaphore mutex=1;             //互斥使用取号机
semaphore full=0;            //已占座位的数量
semaphore service=0;        //等待叫号
process顾客i{
    P(empty);                 //等空位
    P(mutex);                 //申请使用取号机
    从取号机上取号;
    V(mutex);                 //取号完毕
    V(full);                    //通知营业员有新顾客
    P(service);                //等待营业员叫号
    接受服务;
}
process营业员{
    while(True){
        P(full);             //没有顾客则休息
        V(empty);            //离开座位
        V(service);            //叫号
        为顾客服务;
    }
}

30.某博物馆最多可容纳500人同时参观,有一个出入口,该出入口一次仅允许一个人通过。参观者的活动描述如下:

cobegin

参观者进程i:

{

进门;

参观;

出门;

}

coend

请添加必要的信号量和P、V(或wait()、signal())操作,以实现上述过程中的互斥与同步。要求写出完整的过程,说明信号量的含义并赋初值。
 

解答:

出入口一次仅允许一个人通过,设置互斥信号量mutex,初值为1。博物馆最多可同时容纳500个人,故设置信号量empty,初值为500。

Semaphore empty=500;             //博物馆可以容纳的最多人数

Semaphore mutex =1;              //用于出入口资源的控制

cobegin

参观者进程i:

{

P(empty);

P(mutex);

进门;

V(mutex);

参观;

P(mutex);

出门;

V(mutex);

V(empty);

}

coend

【评分说明】①信号量初值给1分,说明含义给1分,两个信号量的初值和含义共4分。

② 对mutex的P、V操作正确给2分。

③ 对empty的P、V操作正确给1分。

④ 其他答案,参照①~③的标准给分。

31.系统中有多个生产者进程和消费者进程,共享用一个可以存 1000 个产品的缓冲区(初始为空),当缓冲区为未满时,生产者进程可以放入一件其生产的产品,否则等待;当缓冲区为未空时, 消费者进程可以取走一件产品, 否则等待。 要求一个消费者进程从缓冲区连续取出 10件产品后,其他消费者进程才可以取产品,请用信号量 P, V( wait , signed )操作实现进程间的互斥和同步,要求写出完整的过程;并指出所用信号量的含义和初值。 

解析:

本题是一个生产者-消费者的变型,本题是多个生产者-多个消费者类型,生产者和消费者之间并不互斥访问缓冲区,但生产者和生产者之间, 消费者和消费者之间要互斥访问缓冲区,并且本题的消费者一次需要取走 10 件产品,如果没有它会等待,而不是等到有了 10件产品后, 才进行取走操作。

本题的缓冲区B 可描述为

buffer array [1000];
(1)生产者之间设互斥信号量 mutex1, 消费者之间设互斥信号量 metex2。
(2)上述进程的同步问题,需设置 3 个信号量,其中 empty 对应空闲的缓冲单元,初值为1000; full 对应缓冲区中待取走的产品数,初值为 0;另外,还需定义 2 个整型变量 in、 out,分别用来指示下一个可存放产品的缓冲单元、下一个取走的缓冲单元,它们的初值均为 0。

过程如下:

buffer array [1000]; //存放产品的缓冲区
buffer nextp; //用于临时存放生产者生产的产品
buffer nextc [10]; //用于临时存放消费者取出的产品
semaphore empty = 1000; //空缓冲区的数目
semaphore full = 0; //满缓冲区的数目
semaphore mutex1 = 1; //用于生产者之间的互斥
semaphore mutex2 = 1; //用于消费者之间的互斥
int in = 0; //指示生产者的存位置
int out = 0; //指示消费者的取位置
Producer() //生产者进程
{
     Produce an item put in nextp; //生产一个产品,存在临时缓冲区
     P(empty); //申请一个空缓冲区
     P(mutex1); //生产者申请使用缓冲区
     array[in]=nextp; //将产品存入缓冲区
     in = (in+1)%1000; //指针后移
     V(mutex1); //生产者缓冲区使用完毕,释放互斥信号量
     V(full);} //增加一个满缓冲区
}
Consumer() //消费者进程
{
     P(mutex2); //消费者申请使用缓冲区
     for(int i = 0;i<10;i++) //一个消费者进程需从缓冲区连续取走 10 件产品
     {
         P(full); //申请一个满缓冲区
         nextc[i] = array[out]; //将产品取出,存于临时缓冲区
         out = (out+1)%1000; //指针后移
         V(empty); //增加一个空缓冲区
     }
     V(mutex2); //消费者缓冲区使用完毕,释放互斥信号量
     Consume the items in nextc; //消费掉这 10 个产品
}

32.有A、B两人通过信箱进行辩论,每个人都从自己的信箱中取得对方的问题。将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中。假设A的信箱最多放M个邮件,B的信箱最多放 N个邮件。初始时A的信箱中有x个邮件(0<x<M),B的信箱中有y个(0<y<N)。辩论者每取出一个邮件,邮件数减1。A和B两人的操作过程描述如下:

CoBegin

A{

while(TRUE){

从A的信箱中取出一个邮件;

回答问题并提出一个新问题;

将新邮件放入B的信箱;

}

}

B{

while(TRUE){

从B的信箱中取出一个邮件;

回答问题并提出一个新问题;

将新邮件放入A的信箱;

}

}

CoEnd

当信箱不为空时,辩论者才能从信箱中取邮件,否则等待。当信箱不满时,辩论者才能将新邮件放入信箱,否则等待。请添加必要的信号量和P、V(或wait、signal)操作,以实现上述过程的同步。要求写出完整过程,并说明信号量的含义和初值。

解答:

semaphore Full_A = x;           //Full_A表示A的信箱中的邮件数量

semaphore Empty_A = M-x;        //Empty_A表示A的信箱中还可存放的邮件数量

semaphore Full_B = y;           //Full_B表示B的信箱中的邮件数量

semaphore Empty_B = N-y;        //Empty_B表示B的信箱中还可存放的邮件数量

semaphore mutex_A = 1;          //mutex_A用于A的信箱互斥

semaphore mutex_B = 1;          //mutex_B用于B的信箱互斥

Cobegin

A{

while(TRUE){

P(Full_A);

P(mutex_A);

从A的信箱中取出一个邮件;

V(mutex_A);

V(Empty_A);

回答问题并提出一个新问题;

P(Empty_B);

P(mutex_B);

将新邮件放入B的信箱;

V(mutex_B);

V(Full_B);

}

}

B{

while(TRUE){

P(Full_B);

P(mutex_B);

从B的信箱中取出一个邮件;

V(mutex_B);

V(Empty_B);

回答问题并提出一个新问题;

P(Empty_A);

P(mutex_A);

将新邮件放入A的信箱;

V(mutex_A);

V(Full_A);

}

}

【评分说明】

1)每对信号量的定义及初值正确,给分。

2)每个互斥信号量的P、V操作使用正确,各给分。

3)每个同步信号量的P、V操作使用正确,各给分。

4)其他答案酌情给分。

33.某进程调度程序采用基于优先数(priority)的调度策略,即选择优先数最小的进程运行,进程创建时由用户指定一个nice作为静态优先数。为了动态调整优先数,引入运行时间cpuTime和等待时间waitTime,初值均为0。进程处于执行态时,cpuTime定时加1,且waitTime置0;进程处于就绪态时,cpuTime置0,waitTime定时加1。请回答下列问题。

(1)若调度程序只将nice的值作为进程的优先数,即priority=nice,则可能会出现饥饿现象,为什么?

(2)使用nice、cpuTime和waitTime设计一种动态优先数计算方法,以避免产生饥饿现象,并说明waitTime的作用

解析:

(1)由于采用了静态优先数,当就绪队列中总有优先数较小的进程时,优先数较大的进程一直没有机会运行,因而会出现饥饿现象。(2分)

(2)优先数priority的计算公式为:

priority=nice+k1×cpuTime-k2×waitTime,其中k1>0,k2>0,用来分别调整cpuTime和waitTime在priority中所占的比例。(3分)waitTime可使长时间等待的进程优先数减少,从而避免出现饥饿现象。(1分)

【评分说明】

①公式中包含nice给1分,利用cpuTime增大优先数给1分,利用waitTime减少优先数给1分;部分正确,酌情给分。

②若考生给出包含nice、cpuTime和waitTime的其他合理的优先数计算方法,同样给分。

34.在一单道批处理系统中,一组作业的提交时间和运行时间如表17—1所示。试计算以下3种作业调度算法的平均周转时间T和平均带权周转时间W。 (1)先来先服务; (2)短作业优先; (3)响应比高者优先。

解析:作业周转时间=作业完成时间-作业提交时间

           带权周转时间=周转时间/服务时间

 :

 

 

响应比=(等待时间+要求服务时间)/要求服务时间

 

 35.桌上有一空盘,允许存放最多两个水果。爸爸可向盘中放苹果或橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘子不满时,一次只能放一只水果;当盘子不空时,一次只能取一只水果;父亲放水果时,儿子女儿不能取;儿子女儿去水果时,父亲不能放。

(1) 请分析,本例中临界资源是什么?

(2) 下面是用P、V操作实现的爸爸、儿子、女儿三个进程的同步,请完成程序中空行部分。

Semaphore mutex=____;//定义互斥信号量

int empty=_____,apple=______,orange=________;//定义同步信号量Father://父亲进程

While(1) {

________;

________;

Put an apple or orange;

If (fruit ==apple)

________:

Else

________;

}

Daughter://女儿进程

While(1){

_________;

_________;

Fetch an apple;

_________;

_________;

}

Son://儿子进程

While(1){

_________;

_________;

Fetch an orange;

_________;

_________;

}

  •  

解析:(1) 临界资源是盘子

(2) 

Semaphore mutex=1;//定义互斥信号量

int empty=2,apple=0,orange=0;//定义同步信号量

Father://父亲进程

While(1)

{

P(empty);

P(mutex);

Put an apple or orange;

if(fruit==apple)

V(apple);

else

V(orange);

}

Daughter://女儿进程

While(1)

{

P(apple);

P(mutex);

Fetch an apple;

V(mutex);

V(empty);

}

Son://儿子进程

While(1)

{

P(orange);

P(mutex);

Fetch an orange;

V(mutex);

V(empty);

}

36. 

 

 

猜你喜欢

转载自blog.csdn.net/u011587070/article/details/82852194