第2章 进程管理练习答案 下载本文

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

end

6.试从多个方面比较线程和进程 从四个方面:

(1) 调度:在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进

程。而在引入线程的os中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位。使传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。(2)并发性:在引入线程的os中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。(3)拥有资源:不论是传统的操作系统,还是设有线程的操作系统,进程都是拥有资源的一个独立单位。一般地说,线程不拥有系统资源,但它可以访问期隶属进程的资源。(4)系统开销:创建或撤销进程时,系统都要为之分配或回收资源。而线程切换只需保存和设置少量寄存器的内容。因此,进程切换的开销远大于线程切换的开销。

7.汽车司机与售票员之间必须协同工作。假定某辆公共汽车上有一名司机与两名售票员,汽车当前正在始发站停车上客,写出它们的同步过程(用管程或信号量机制均可)(哈尔滨工业大学2000)

var run1 run2,stop1,stop2:semaphore:=0,0,0,0; begin parbegin

driver:begin repeat

p(run1); p(run2); 开车; 停车; v(stop1); v(stop2); until false end

seller1:begin repeat 上乘客;

关车门; v(run1); 售车票; p(stop1); 开车门; 下乘客;

until false end

seller2:begin

repeat

上乘客;

6 / 13

关车门; v(run2); 售车票; p(stop2); 开车门; 下乘客;

until false end parend end

分析:司机必须等到两个售票员都完成关车门后(两次p操作)才能开车,同样到站后应让两个售票员都知道(两次v操作)

8.今有三个并发进程R、M、P,它们共享了一个可循环使用的缓冲区B,缓冲区B共有N个单元。进程R负责从输入设备读信息,每读一个字符后,把它存入到缓冲区B的一个单元中;进程M负责处理读入的字符,若发现读入的字符中有空格,则把它改成“,”;进程P负责把处理后的字符取出并打印输出。当缓冲区单元中的字符被进程P取出后,则又可用来存放下一次读入的字符。请用PV操作为同步机制写出它们能正确并发执行的程序。

设置四个信号量:

mutex:用于实现对缓冲区的互斥访问,初值为1; empty:表示缓冲区中可用单元数目,初值为N; full1:表示已读入字符个数,初值为0; full2:表示已处理字符个数,初值为0。 相应地设置in,out1,out2. Semaphore mutex=1; Semaphore empty=N; Semaphore full1=0; Semaphore full2=0; Char bhffer[N];

Int in=0,out1=out2=0; Main() {

cobegin R(); M(); P(); Coend } R() {

while(true) {

char x;

读入一个字符到x; p(empty);

7 / 13

p(mutex); buffer[in]=x; in=(in+1)%N; v(mutex); v(full1); } } M() {

char x; while(true) { p(full1); p(mutex);

x=buffer[out1]; if(x==” “) {

x=”,”;

buffer[out1]=x; }

out1=(out1+1) % N; v(mutex); v(full2); } } P() {

char x; while(true) {

p(full2) p(mutex); x=buffer[out2]

out2=(out2+1) % N; v(mutex); v(empty); 输出字符x; } }

9.一个数据采集系统,有数据采样进程和数据处理进程及数据输出进程。采样进程把采到的数据送到buf1中,由数据处理进程取出处理并存入buf2中,然后由数据输出进程将其从buf2中输出,试给出实现三个进程同步的算法。

empty1=empty2=1; full1=full2=0;

8 / 13

A() {

while(true) {

采集一个数据; p(empty1);

将数据存入buf1; v(full1); } } B() {

while(true) {

p(full1);

从buf1中取出数据; v(empty1); 处理数据; p(empty2);

将处理结果存入buf2; v(full2); } } C() {

while(true) {

p(full2);

从buf2中取出结果; v(empty2); 打印输出; } }

10.超市可容纳50人同时购物,入口处有篮子,每个顾客可拿一只篮子入内购物,出口处结账,并归还篮子(出入口禁止多人同时通过)

分析:(1)购物者进超市需要互斥,超市是临界资源(设信号量S=50)

(2) 入口拿篮子以及结账互斥。设mutex=1

购物者i进程: P(S); P(mutex); 从入口拿篮子 V(mutex); 选购商品; P(mutex);

9 / 13

出口结账 V(mutex); 离开超市 V(S);

以上为出入口合一的情况。若出入口分开,如何实现? 设两个互斥信号量:mutex1=1; mutex2=1

若设置一个信号量会怎样?(如果一个结账的话其他顾客无法进入超市)

11.桌上有一个只能盛得下一个水果的空盘子,爸爸放水果,儿子专吃桔子,女儿专吃苹果。 分析:

(1)设互斥信号量empty=1 (2)设同步信号量orange=0 (3) 设同步信号量apple=0 爸爸:(生产者) P(empty);

将水果放入盘中;

若放入的是桔子,则V(orange) 否则V(apple);

儿子(消费者1) P(orange); 取桔子 V(empty); 吃桔子

女儿(消费者2)类似于进程 12.和尚吃水问题

寺庙里住着一群老和尚和一群小和尚,小和尚负责挑水喝。庙里有5个水桶和一个大缸,大缸可盛8桶水。大缸每次只允许一个人使用。请写出他们之间的同步问题。 资源信号量:s1=5;表示水桶的数量 s2=8;表示缸空的数量(水桶) s3=0;表示缸满的数量(水桶)

互斥信号量:mutex=1;用于互斥的使用大缸 小和尚: P(s1); 取水桶; 挑水; P(s2); P(mutex); 往水缸倒水; V(mutex); V(s3); V(s1); 老和尚: P(s3); P(mutex); 吃水;

10 / 13