os 操作系统 习题 汤子瀛 第二三章 信号量机制 银行家 作业调度

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2、在本题中,三个并发进程R、M、P共 享了一个可循环使用的缓冲区B,进程R 负责从输入设备读字符并存入缓冲单元 中,进程M负责将读入字符中的空格符 改成“,”,进程P负责处理后字符的打 印输出。
为此,应设置四个信号mutex、 empty、full1、full2。 mutex用于实现对缓冲区的互斥访 问,其初值为1。 empty表示缓冲区中可用单元数目, 其初值为N。 full1表示已读入字符个数,其初值为0。 full2表示已处理字符个数,其初值为0。
8、有一单向行驶的公路桥,每次只允许一 辆汽车通过。当汽车到达桥头时,若桥 上无车,便可上桥,否则需等待,直到 桥上的汽车下桥为止。若每一辆汽车为 一个进程,请用P、V操作保证汽车按要 求过桥。
9、一个理发店由一个有N张椅子的等候室 和一个放有一张理发椅的理发室组成。 若没有要理发的顾客,则理发师就去睡 觉,若一个顾客走进理发店且所有的椅 子都被占用了,则该顾客就离开理发店, 若理发师正在为人理发,则该顾客就找 一张空椅子坐下等待,若理发师在睡觉, 则顾客就唤醒他。 试用信号量设计一个协调理发师和顾客 的程序。
信号量rm用于使查询用户互斥地 访问共享变量rcount,其初值为1。 信号量wm用于使订票用户互斥地 访问共享变量wcount,其初值为1。wk.baidu.com信号量rsem用于在订票者到达后 封锁后续查询者,其初值为1。
信号量wsem用于实现订票者与查询者的互 斥以及订票者与订票者的互斥,其初值为1。 信号量wait用于查询者排队(为了实现 订票者优先,rsem上不允许排长队,否则订票 者无法跳过这个队列,为此,只允许一个查询 者在rsem上排队,而所有其他查询者在等待 rsem之前,在信号量wait上排队),其初值为 1。 用户查询和订票的逻辑框图如下 :
为描述方便起见,还应设置三个 指针in、out1、out2。 in指向下一个可用缓冲单元。 out1指向下一个待处理字符。 out2指向下一个待输出字符。 它们并发执行的同步机制描述如下:
semaphore empty=N; semaphore full1=0; semaphore full2=0; semaphore mutex=1; char buffer[N];
semaphore fullb=0; semaphore sa=n; semaphore sb=n; main() {cobegin provider_A();//零件A供应商 provider_B();//零件B供应商 assembling_shop();//装配车间 coend}
provider_A() {while(true) {p(emptya); p(sa); p(mutex); 将零件A放入仓库; v(mutex); v(fulla); v(sb);}}
main() {cobegin P1(); P2(); P3(); P4(); P5(); P6(); coend}
P1() {…… v(b2); v(b3);} P2() {p(b2); …… v(b4); }
P3() {p(b3); …… v(b5);} P4() {p(b4); …… v(b6);}
查询者
P(wait) P(rsem)
P(rm)
rcount=rcount+1 N
rcount==1? Y P(wsem)
V(rm) V(rsem) V(wait)
在数据库中查询所需信息 P(rm) rcount=rcount-1 rcount==0? Y V(wsem) V(rm) N 用户查询的逻辑框图
进程M负责处理读入的字符,若发现读 入的字符中有空格符,则把它改成“,”。 进程P负责把处理后的字符取出并打印输出。
当缓冲区单元中的字符被进程P取出后,
则又可用来存放下一次读入的字符。请
用P、V操作为同步机制写出它们能正确 并发执行的程序。
3、设有六个进程P1、P2、P3、P4、P5、 P6,它们有如图所示的并发关系。试用 P、V操作实现这些进程间的同步。
在(2)中,由于每次最多允许m个进程进入该程序段, 因此可以将这1个程序段看成m个程序段,每个进程使 用1个程序段,应设置初值为m的信号量。当没有进程 进入该程序段时,信号量的值为m;当有1个进程进入 该程序段且没有进程等待进入该程序段时,信号量值 为m-1;当有1个进程进入该程序段且有1个进程等待 进入该程序段时,信号量值为m-2;最多可能有n-m个 进程等待进入该程序段。故信号量的初值为m,信号 量值的变化范围是m,m-1,……,-(n-m)。
P5() {p(b5); ……. v(b6);} P6() {p(b6); p(b6); …… }
4、本题是一个典型的“读者-写者”问题,查 询者是读者,订票者是写者,而且要求写者优 先。 为此,应设置五个信号量rsem、wsem、 rm、wm、wait,两个共享变量rcount、 wcount。 共享变量rcount,用于记录当前正在查询 的用户数,初值为0。 共享变量wcount,用于记录当前正在订票 的用户数,初值为0。
6、在(1)中,由于每次只允许一个进程进入该程序段, 因此可以将该程序段看成临界资源,应设置初值为1的 信号量。当没有进程进入该程序段时,信号量的值为1, 当有1个进程进入该程序段且没有进程等待进入该程序 段时,信号量值为0,当有1个进程进入该程序段且有1 个进程等待进入该程序段时,信号量值为-1,最多可 能有n-1个进程等待进入该程序段。故信号量的初值为 1,信号量的变化范围是1,0,-1,……,-(n-1)。
3、在本题中,设置五个信号量b2、b3、 b4、b5、b6分别表示进程P2、P3、P4、 P5、P6是否可以开始执行,其初值均为 0。这六个进程的同步机制描述如下: semaphore b2=0; semaphore b3=0; semaphore b4=0; semaphore b5=0; semaphore b6=0;
provider_B() {while() {p(emptyb); p(sb); p(mutex); 将零件B放入仓库; v(mutex); v(fullb); v(sa);}}
assembling_shop() {while(true) {p(fulla); p(fullb); p(mutex); 装配零件; v(mutex); v(emptya); v(emptyb);}}
练习及参考答案
练习:
1、我们为某临界区设置一把锁w,当w=1 时表示关锁,w=0时表示锁已打开。试 写出开锁原语和关锁原语,并利用它们 去实现互斥。
2、今有三个并发进程R、M、P,它们共享了一 个可循环使用的缓冲区B,缓冲区B共有N个单
元。
进程R负责从输入设备读信息,每读一
个字符后,把它存入到缓冲区B的一个单元中。
6、设有n个进程共享一个程序段,对于如下两种 情况: (1)如果每次只允许一个进程进入该程序段。 (2)如果每次最多允许m个进程(m<n)同时 进入该程序段。 试问:所采用的信号量初值是否相同? 信号量值的变化范围如何?
7、假定有一个信箱可以存放N封信,当信箱 不满时,发信者可把信件送入信箱,当信 箱中有信时,收信者可从信箱中取信。用 指针R、K分别表示可存信和取信的位置, 请用管程来管理这个信箱,使发信者和收 信者能正确工作。
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;} }
int in=0,out1=0,out2=0; main() {cobegin R(); M(); P(); coend}
R() {while(true) {char x; 读入一个字符到x; p(empty); p(mutex); buffer[in]=x; in=(in+1)%N; v(mutex); v(full1);}}
订票者
P(wm)
wcount=wcount+1
wcount==1? Y P(rsem)
V(wm) P(wsem)
N
更新数据库中的数据信息
V(wsem) P(wm) wcount=wcount-1
wcount==0? Y V(rsem) V(wm) N
用户订票的逻辑框图
5、本题中给出的两种零件数量关系为: A零件数量-B零件数量<=n B零件数量-A零件数量<=n A零件数量<=m B零件数量<=m 在本题中,我们可以设置七个信号量来控制 A、B产品的存放数量,它们分别是mutex、 emptya、emptyb、fulla、fullb、sa、sb。 mutex是互斥信号量,用于诸进程对仓库操 作的互斥,其初值为1。
10、一个数据采集系统,有数据采样进程 和数据处理进程及数据输出进程。采样 进程把采到的数据送入Buf1中,由数据
处理进程取出处理并于Buf2中,然后由
数据输出进程将其从Buf2中输出,试给
出三个进程同步的算法。
答案: 1、在同步机构中,常用一个变量来代表临界资源 的状态,并称它为锁。通常用0表示资源可用, 用1表示资源已被占用。 进程在使用临界资源之前必须完成下列动 作(即关锁操作): • 考察锁位的值(是0还是1) • 如果原来的值为0,将锁位置1(表示占用资源) • 如果原来的值是1(即资源已被占用),则返回 第一步再考察。
P1
P2
P3
P4
P5
P6
4、在一个飞机订票系统中,多个用户共享一个 数据库。多用户同时查询是可以接受的,但若
一个用户要订票需更新数据库时,其余所有用
户都不可以访问数据库。请画出用户查询与订
票的逻辑框图。要求:当一个用户订票而需要
更新数据库时,不能因不断有查询者的到来而 使他长期等待。
5、有一个仓库存放两种零件A和B,最大库容量 各为m个。 有一车间不断地取A和B进行装配,每次 各取一个。为避免零件锈蚀,遵循先入者先出 库的原则。有两组供应商分别不断地供应A和B (每次一个)。 为保证齐套和合理库存,当某种零件的数 量比另一种的数量多得超过n(n<m)个时, 暂停对数量大的零件的进货,集中补充数量少 的零件。试用P、V操作正确地实现之。
当往库中存放入一个A零件时,则 允许存入B零件的数量也增加1;当往库 中存放一个B零件时,则允许存入A零件 的数量也增加1。 零件的入库过程描述如下: semaphore mutex=1; semaphore emptya=m; semaphore emptyb=m; semaphore fulla=0;
当进程使用完资源后,应将锁位置0,称为开 锁操作。 在测试锁位的值和置锁位的值为1这两步之间, 锁位不得被其他进程所改变,这是应该绝 对保证的。因此使用原语来实现开锁和关 锁操作。 关锁原语和开锁原语分别用lock和unlock表示。 其算法描述如下:
Lock(int *w) {while(*w==1); *w=1;} Unlock(int *w) {*w=0;} 利用上锁原语和开锁原语实现互斥的算法描述如 下: Lock(w) 临界区 Unlock(w)
emptya表示仓库中还允许A零件入库 的数量,其初值为m; emptyb表示仓库中还允许B零件入库 的数量,其初值为m; fulla表示仓库中已有A零件的数量, 其初值为0; fullb表示仓库中已有B零件的数量, 其初值为0;
sa表示当前允许A零件比B零件多入库 的数量,即在当前库存量和B零件不入库的 情况下,还可以允许sa个A零件入库,其初 值为n; sb表示当前允许B零件比A零件多入库 的数量,即在当前库存量和A零件不入库的 情况下,还可以允许sb个B零件入库,其初 值为n。
相关文档
最新文档