2022年操作系统作业答案 .pdf
1 第九题设有两个生产者进程A、B 和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售;销售者每次循环从仓库中取出一个产品进行销售。如果不允许同时入库, 也不允许边入库边出库; 而且要求生产和消费A 产品和 B 产品的件数都满足以下关系:-nA 的件数 B 的件数 m ,其中 n、m 是正整数。分析:生产者A、B 和消费者之间不能同时将产品入库和出库,故仓库是一个临界资源。生产的 A、B 产品必须满足:-nA 的件数 B 的件数 m ,如练习5 中,同样的方法管理,分别使用了信号量SAB 和 SBA;仓库的管理只要求出入库互斥,由于仓库无限大入库只需操作互斥就可以完成,出库要考虑有无产品,SA 对应于仓库中的A 产品量, SB 对应于仓库中的B 产品量;销售要满足: -nA 的件数 B 的件数 m ,用 difference 表示 A 的件数 B 的件数,即difference= A的件数 B 的件数 ;difference=-n 的时候,不能取产品B,只能取 A;difference=m 的时候,不能取产品A,只能取 B;-ndifferencem,即可以取产品A 也可以取产品B;答:为了互斥地入库和出库,需为仓库设置一初值为1 的互斥信号量mutex;为了使生产的产品件数满足-nA 的件数 B 的件数 m ,须设置两个同步的信号量,其中SAB 表示当前允许A 生产的产品数量,其初值为 m,SBA 表示当前允许B 生产的产品数量,其初值为n;另外,还需设置一个整数difference 表示所销售的A、B 产品数量之差,而为了同步生产者和销售者并使销售的A、B 产品的件数 -nA 的件数 B的件数 m ,还需要设置三个资源信号量,其中 S 对应于仓库中的总的产品量,SA 对应于仓库中的A 产品量, SB 对应于仓库中的B 产品量,它们的初值都为0. Semaphore SAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1; process A( ) while(1) /生产产品, -nA 的件数 B 的件数 m ,方法同第4 题wait(SAB); Produce a product A; signal(SBA); /入库操作,满足出入库操作互斥即可wait(mutex); add the product A to the storehouse; signal(mutex); signal(SA); /入库产品A 一件,所以给SA 增值signal(S); /入库产品一件,所以给S 增值, S 是仓库中全部产品的数量 process B( ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 while(1) /生产产品, -nA 的件数 B 的件数 m ,方法同第4 题wait(SBA); Produce a product B; signal(SAB); /入库操作,满足出入库操作互斥即可wait(mutex); add the product A to the storehouse; signal(mutex); signal(SB); /入库产品A 一件,所以给SA 增值signal(S); /入库产品一件,所以给S 增值, S 是仓库中全部产品的数量 process C( ) while(1) wait(S); /首先检查有无产品,无产品阻塞,有产品,下面操作将会取走一件产品,所以S 减 1if(difference=-n) wait(SA); / difference=m) wait(SB); / difference=m 时只能取 B 产品一件,无B 产品则需阻塞/出库操作,满足出入库操作互斥wait(mutex); take a product B from storehouse; signal(mutex); difference-; /取 B 产品一件, difference- else /-ndifferencem ,即可以取产品A 也可以取产品B,随意取一件产品出来,之后再根据取得产品是 A 还是 B 进行处理/出库操作,满足出入库操作互斥名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 3 wait(mutex); take a product A 或 B from storehouse; signal(mutex); if(product_type=A )/取的是产品A,则信号量SA 减 1,这里不可能发生没有A 产品,进程C 需要阻塞的情况wait(SA); difference+;/ 取 A 产品一件, difference+ else /取的是产品B,则信号量SB 减 1,这里不可能发生没有B 产品,进程C 需要阻塞的情况wait(SB); difference-;/取 B 产品一件, difference- Sell the product; main() cobegin A(); B(); C(); 例题 20 解答本题是一个有限缓冲区的生产者消费者问题,关键是找到缓冲区资源,以及谁是生产者、 谁是消费者。本题中烟草、纸和火柴应该看作是产品,桌子是缓冲区。问题是有几种产品。烟草、纸和火柴三种原料又不能简单地看成是三种产品,因为它们并不是以单独的形式被三个吸烟者进程所竞争的,而是以固定的组合被三个进程所申请的。因此可以考虑:设置三个信号量r、 s 和 t,分别代表三种原料组合,即r 表示烟草和纸, s表示纸和火柴,t 表示烟草和火柴,初值均为0;桌面上一次只能放一种组合,可以看作是放一个产品的缓冲区,设置信号量empty 初值为 1,控制经销商往桌子上放原料;对于三个吸烟者的申请动作也要加以判断,用三个变量smoker1 、smoker2 、smoker3 ,初值为false,当为 true 时,表示申请资源,得到资源后置为false 。四个进程循环往复,并发执行。经销商进程:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 4 吸烟者 1 进程:吸烟者 2 进程:吸烟者 3 进程:第一题 44. a、b 两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:当a、b之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab 段外等待; 当 ab 之间无车辆在行驶时,到达a点(或 b 点)的车辆可以进入ab 段,但不能从a 点和 b 点同时驶入;当某方向在ab 段驶出了 ab 段且暂无车辆进入ab 段时,应让另一方向等待的车辆进入ab 段行驶。现定义两个计数器CountE 和 CountW 分别记录东行和西行车辆进程数。用 PV 操作进行管理时的三个信号量为 S、SE、SW,程序结构如下:begin S, SE, SW: semaphore; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 5 CountE, CountW: Integer; CountE := _(1)_0_; CountW := _(2)_0_; S := _(3)_1_; SE := _(4)_1_; SW := _(5)1_; cobegin Process EASTi (i=1, 2, 3, )begin _(6)_P(SE)_; if CountE = 0 then_(7)P (S)_; CountE := CountE+1; _(8)_V (SE) _; pass(ab); _(9)_P(SE)_; CountE := CountE-1; if CountE = 0 then _(10)_V ( S)_; _(11)_V (SE)_; end; Process WESTj(j=1, 2, 3, )Begin _(12)_P(SW)_; if CountW = 0 then _(13)_P (S)_; CountW := CountW+1; _(14)_V (SW) _; pass(ba); _(15)_P(SW)_; CountW := CountW-1; if CountW = 0 then _(16)_V(S)_; _(17)_V(SW)_; end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - coend; end; 44. (1) 0 (2) 0 (3) 1 (4) 1 (5) 1 (6) P(SE) (7) P(S) (8) V(SE) (9) P(SE) (10) V(S) (11) V(SE) (12) P(SW) (13) P(S) (14) V(SW) (15) P(SW) (16) V(S) (17) V(SW) 3、如果有三个进程R、W1、W2 共享一个缓冲器B,而 B 中每次只能存放一个数。当缓冲器中无数时,进程R 可以将从输入设备上读入的数存放到缓冲器中。若存放到缓冲器中的是奇数,则允许进程W1 将其取出打印;若存放到缓冲器中的是偶数,则允许进程W2 将其取出打印。同时规定:进程R 必须等缓冲区中的数被取出打印后才能再存放一个数;进程 W1 或 W2 对每次存入缓冲器的数只能打印一次;W1 和 W2 都不能从空缓冲中取数。写出这三个并发进程能正确工作的程序。答: S 为互斥信号量 ,用来对缓冲器的互斥使用;SO 和 SE 为资源信号量 ,SO 表示是否允许进程W1 打印; SE 表示是否允许进程W2打印。semaphore S=1,SO=SE=0; buffer B; process R() int x; while(1) 从输入设备上读一个数; x=接收的数 ; wait(S); B=x; if B=奇数then signal(SO); else signal(SE); process W1() int y; while(1) wait(SO); y=B; signal(S); 打印 y 中数 ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - process W2() int z; while(1) wait(SE); z=B; signal(S); 打印 z 中数 ; main() cobegin R(); W1(); W2(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -