操作系统复习笔记(二)

1.问答题:有一个文件F,有A,B两组进程共享这个文件,同组的进程可以同时读文件F,但当有A组(或B组)的进程在读文件F时就不允许B组(或A组)的进程读,

解:定义两个计数器C1,C2,分别记录A组和B组中读文件的进程数,三个信号量S1,S2,SAB,其中S1用于通知A组进程已经有B组进程在读文件F了,S2用于通知B进程已经有A进程在读文件F了,SAB用于实现对共享变量C1和C2以及临界区的互斥访问.

None.gifbegin
None.gifvarS1,S2,SAB:semaphore
=1,1,1;
None.gifC1,C2:integer
=0,0;
None.gif
None.gifprocessA
-i(i=1,2dot.gif)
None.gifbegin
None.gifrepeat
None.gifP(SAB);
None.gifC1
=C1+1;
None.gif
if(C1=1)thenP(S2);
None.gifV(SAB);
None.gif读文件F;
None.gifP(SAB)
None.gifC1
=C1-1;
None.gif
if(C1==0)V(S2)
None.gifV(SAB)
None.gifuntil
false
None.gifend
None.gif
None.gif
None.gifprocessB
-i(i=1,2dot.gif)
None.gifbegin
None.gifrepeat
None.gifP(SAB);
None.gifC2
=C2+1;
None.gif
if(C2=1)thenP(S1);
None.gifV(SAB);
None.gif读文件F;
None.gifP(SAB)
None.gifC2
=C2-1;
None.gif
if(C2==0)V(S1)
None.gifV(SAB)
None.gifuntil
false
None.gifend
None.gifend
None.gif

2,应用题:get进程读数据到buffer1里,然后进程copy从buffer1里的数据复制到buffer2里,再由put进程取出buffer2里的数据去进行打印.

分析:这是两个阶段的生产-消费问题.第一阶段的生产者和消费者是get和copy,第二阶段的生产者和消费者是copy和put.为简单计,假设buffer1,buffer2都是单缓冲区,因此只要设4个信号量empty1,full1,empty2,full2,就可以了.

None.gifbegin
None.gifbuffer:integer
None.gifempty1,empty2,full1,full2,:semaphore
=1,1,0,0;
None.gifcobegin
None.gif
None.gifprocessGet
None.gifbegin
None.gifrepeat
None.gif读数据
None.gifp(empty1);
None.gif把数据放到buffer1里
None.gifv(full1);
None.gifuntil
false
None.gifend
None.gif
None.gifprocessCopy
None.gifbegin
None.gifrepeat
None.gifp(full1)
None.gif从buffer1里读出数据
None.gifv(empty1);
None.gifp(empty2)
None.gif把数据放到buffer2里
None.gifv(full2)
None.gifuntil
false
None.gifend
None.gif
None.gifprocessPut
None.gifbegin
None.gifrepeat
None.gifp(empty2)
None.gif从buffer2里读出数据
None.gifv(full2);
None.gif打印数据
None.gifuntil
false
None.gifend
None.gifcoend
None.gifend

3.输入进程输入数据到缓冲区buffer1中,计算进程从buffer1中读出数据进行计算,并把结果送入buffer2,然后打印进程从buffer2中读出结果进行打印.假设缓冲区大小分别为n1和n2.
None.gifbegin
None.gifbuffer:integer
None.gifempty1,empty2,full1,full2,mutex1,mutex2:semaphore
=n1,n2,0,0,1,1;
None.gifcobegin
None.gif
None.gifprocessInput
None.gifbegin
None.gifrepeat
None.gif输入数据
None.gifp(empty1);
None.gifp(mutex1);
None.gif把数据放到buffer1里
None.gifv(mutex1);
None.gifv(full1);
None.gifuntil
false
None.gifend
None.gif
None.gifprocessCompute
None.gifbegin
None.gifrepeat
None.gifp(full1)
None.gifp(mutex1);
None.gif从buffer1里读出数据
None.gifv(mutex1);
None.gifv(empty1);
None.gif
None.gifp(empty2)
None.gifp(mutex2);
None.gif把数据放到buffer2里
None.gifv(mutex2);
None.gifv(full2);
None.gifuntil
false
None.gifend
None.gif
None.gifprocessPrint
None.gifbegin
None.gifrepeat
None.gifp(empty2)
None.gifp(mutex2);
None.gif从buffer2里读出数据
None.gifv(full2);
None.gifv(full2);
None.gif打印数据
None.gifuntil
false
None.gifend
None.gifcoend
None.gifend

4.过桥问题.
(1)桥每次只能有一辆车通过,
(2)不允许两车交会,但允许同方向的多辆车依次通过

解:(1)

None.gifbegin
None.gifmutex:semaphore
=1;
None.gifcobegin
None.gifprocessScar//南边来的车
None.gifbegin
None.gifcome;
None.gifp(mutex);
None.gif过桥;
None.gifv(mutex);
None.gifgo;
None.gifend
None.gif
None.gifprocessNcar//北边来的车
None.gifbegin
None.gifcome;
None.gifp(mutex);
None.gif过桥;
None.gifv(mutex);
None.gifgo;
None.gifend
None.gifcoend
None.gifend

(2)
None.gifbegi
None.gifvarSmutex
=1,Nmutex=1,mutex=1:semaphore;
None.gifSCarCount
=0,NCarCount=0:integer;
None.gifcobegin
None.gifprocessScari(i
=1,2dot.gif)
None.gifbegin
None.gifp(Smutex);
None.gif
if(SCarCount=0)thenp(mutex);
None.gifSCarCount
=SCarCount+1;
None.gifv(Smutex);
None.gif过桥;
None.gifp(Smutex);
None.gifSCarCount
=SCarCount-1;
None.gif
if(SCarCount=0)thenv(mutex);
None.gifv(Smutex);
None.gifend
None.gif
None.gifprocessNcarj(j
=1,2dot.gif)
None.gifbegin
None.gifp(Nmutex);
None.gif
if(NCarCount=0)thenp(mutex);
None.gifNCarCount
=NCarCount+1;
None.gifv(Nmutex);
None.gif过桥;
None.gifp(Nmutex);
None.gifNCarCount
=NCarCount-1;
None.gif
if(NCarCount=0)thenv(mutex);
None.gifv(Nmutex);
None.gifend
None.gifcoend
None.gifend
None.gif

5.在管道通信机制中,用信号量描述读进程和写进程访问管道文件的过程,假设管道文件大小为10KB.
分析:在UNIX系统中,利用一个打开的共享文件来连接两个相互通信的进程,这个共享文件叫管道.作为管道输入的发送进程,以字符流的形式将信息送入管道,而作为管道输出的接收进程,从管道中获取信息.管道通信机制要提供三方面的协调能力:(1)互斥.当一个进程对管道进行读/写操作时,另一个进程必须等待.(2) 同步.当写进程把数据写入管道后便去睡眠等待,直到输出进程取走数据后唤醒它.若一次写入的数据超过缓冲区剩余空间的大小,当缓冲区满时,写进程必须阻塞,并唤醒读进程。(3)对方是否存在.只有确定对方存在时,才能够进行通信.
本题只需要考虑互斥,同步问题。由于只有一对进程访问管道,因此不需要设置互斥信号量,只要设置两个同步信号量empty,full.分别表示管道可写和可读.

None.gifbegin
None.gifpipe:array[
0dot.gif9]ofkilobytes;
None.gifts
=10,length,in=0,out=0:integer;
None.gifempty,full:semaphore
=1,0;
None.gifcobegin
None.gifprocessPipeWriter
None.gifbegin
None.gifrepeat
None.gif产生数据;
None.gifp(empty);
None.giflength
=datalength;
None.gif
while(length>0andts>0)
None.gifbegin
None.gifpipe[in]
=dataof1KB;
None.gifin
=(in+1)modn;
None.gifts
=ts-1;
None.giflength
=length-1;
None.gifend
None.gifv(full);
None.gifend
None.gifprocessConsumer
None.gifbegin
None.gifrepeat;
None.gifp(full);
None.gif从缓冲区取出一件物品;
None.gifout
=(out+1)modn;
None.gifts
=ts+1;
None.gifv(empty);
None.gifend
None.gifcoend
None.gifend
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值