〔当m>n时,每个进程最多可以请求(m+n-1)/n个该类资源〕
3-15
解答:
这是进程之间的同步问题。
M2、M3和M4必须在接收到M1的消息后才能运行。
同理,M6必须在M2和M3之后运行,M7必须在M4,M5之后运行,M8必须在M3、M7之后运行。
如何保证呢?
需设置相应的信号量来保证:
S12,S13,S14,用来制约M2、M3和M4的运行;S26,S36,用来制约M6的运行;S47,S57,用来制约M7的运行;S38,S78用来制约M8的运行。
各进程的制约关系描述如下。
S12,S13,S14,S26,S36,S47,S57,S38,S78:
semaphore;
S12:
=0;S13:
=0;S14:
=0;S26:
=0;S36:
=0;S47:
=0;S57:
=0;S38:
=0;S78:
=0;
COBEGIN
PROCESSM1:
PROCESSM2:
BEGINBEGIN
V(S12);P(S12);
V(S13);V(S26);
V(S14);END
END
PROCESSM3:
PROCESSM4:
BEGINBEGIN
P(S13);P(S14);
V(S36);V(S47);
V(S38);END
END
PROCESSM5:
PROCESSM6:
BEGINBEGIN
V(S57);P(S26);
ENDP(S36);
END
PROCESSM7:
PROCESSM8
BEGINBEGIN
P(S47);P(S38);
P(S57);P(S78);
V(S78);END
END
COEND
3-16.叉子是临界资源,在一段时间内只允许一个哲学家使用。
一个信号量表示一把叉子,五个信号量构成信号量数组,这些信号量的初值为1。
intfork[0]=fork[1]=…=fork[4]=1;
第i个哲学家所执行的程序:
do{
P(mutex);
P(fork[i]);
P(fork[(i+1)mod5]);
V(mutex);
吃饭
V(fork[i]);
V(fork[(i+1)mod5]);
}while
(1);
3-17.
〔1〕公平竞争〔无写者时,读者仍遵循多个读者可以同时读〕
rmutex互斥共享readcount;rwmutex读写互斥,写写互斥;
读写进程在z上排队。
intrmutex=1,rwmutex=1,readcount=0;
reader:
begin
p(z);//读写进程在z上排队。
p(rmutex);
if(readcount=0)thenp(rwmutex);
endif
++readcount;
v(rmutex);
v(z);//无写者时,多个读者可以同时读.
readdata;
p(rmutex);
--readcount;
if(readcount=0thenv(rwmutex);
endif;
v(rmutex);
…
end
writer:
begin
p(z);//读写进程在z上排队。
p(rwmutex);
writedata;
v(rwmutex);
v(z);
…
end
〔2〕写者优先
intreadcount,writecount;
semaphorermutex=1,wmutex=1,rwmutex=1,z=1,x=1;
reader:
//当来了一个写进程时,通过p(x)禁止其后读进程读,直到写进程写完为止。
while
(1){
p(z);//其他读进程在z上排队
p(x);//一个读进程与一个写进程在x上竞争
p(rmutex);//读进程互斥访问readcount
++readcount;
if(readcount==1)p(rwmutex);
v(rmutex);
v(x);
v(z);
readdata;//临界区
p(rmutex);
--readcount;
if(readcount==0)v(rwmutex);
v(rmutex);
}
Writer:
while
(1){
p(wmutex);//写进程互斥访问writecount
++writecount;
if(writecount==1)p(x);//一个写进程与一个读进程在x上竞争
v(wmutex);
p(rwmutex);//其他写进程在rwmutex上排队
writedata;//临界区
v(rwmutex);
p(wmutex);
--writecount;
if(writecount==0)v(x);//写进程都写完时,通过v(x)允许读进程读
v(wmutex);
}
附加题:
读者优先,规定仅允许5个进程同时读,怎样修改程序?
解:
增加一个资源信号量s,初值为5。
ints=5;
Reader:
begin
P(rmutex);
readcount=readcount+1;
if(readcount==1)thenP(rwmutex);
V(rmutex);
P(s);
read_file();
V(s);
P(rmutex);
readcount=readcount-1;
if(readcount==0)thenV(rwmutex);
V(rmutex);
end
writer:
begin
p(rwmutex);
writedata;
v(rwmutex);
…
end
3-18.
ints1=0,s2=n;
顾客进程:
P(s2);
V(s1);
坐椅子等理发
理发师进程:
P(s1);
给顾客理发
V(s2)
3-19.〔2〕和〔4〕会发生死锁。
3-20.
P1/剩余
P2/剩余
P3/剩余
系统剩余
1
3/5
7
2
2/4
5
3
4〔不安全〕
4
5/3
3
5
2〔不安全〕
6
(5+3)/0
0(8)
7
4/3
4
8
(2+2)/2
2
9
〔1〕P1占有5个资源,剩余3个资源请求。
P2占有2个资源,剩余4个资源请求。
P3占有0个资源,剩余7个资源请求。
系统剩余3个资源。
〔2〕P1的请求最先满足。
进程完成序列:
P1,P2,P3。
3-21.
〔1〕
最大需求矩阵:
分配矩阵:
剩余请求矩阵:
Max=Allocation=Need=
剩余资源向量:
Available=(1502)
〔2〕当前系统是安全的。
判断系统是否安全,只要检查系统剩余资源向量能否对各进程的剩余请求向量找到一个进程完成序列,当按照这个序列为各进程分配资源时,各进程都能成功完成。
若能找到,则系统是安全的,否则,为不安全。
先找到p0,因为p0已满足最大资源请求,它可以完成,释放其占有的资源,使系统剩余资源向量为〔1514〕
之后,系统剩余资源向量〔1514〕,可满足进程p2,使p2可以完成,释放其占有的资源,使系统剩余资源向量为〔2868〕。
之后无论选哪一个进程都可成功完成。
故找到的进程完成序列可为:
p0,p2,p4,p3,p1;或p0,p2,p3,p1,p4等,故系统是安全的。
〔3〕因系统剩余可用向量为〔1502〕,p2的剩余请求向量为〔1002〕,即〔1502〕>〔1002〕。
故,当p2提出〔1001〕请求时,能满足。
进程完成序列:
p0,p2,p4,p3,p1
第4章习题答案
4-14内存有如下顺序排列的空闲块:
10K,40K,20K,18K,7K,9K,12K和15K,有如下的请求序列:
12K,10K,9K。
〔1〕若采用首次适应法:
●12K的请求:
将分配40K的空闲块,40K变为剩余的〔40-12〕K=28K,空闲队列变为:
10K,28K,20K,18K,7K,9K,12K和15K;
●10K的请求:
将分配10K的空闲块,空闲队列变为:
28K,20K,18K,7K,9K,12K和15K;
●9K的请求:
将分配28K的空闲块,空闲队列变为:
〔28-9〕=18K,20K,18K,7K,9K,12K和15K;
〔2〕若采用最佳适应法:
●12K的请求:
将分配12K的空闲块,空闲队列变为:
10K,40K,20K,18K,7K,9K和15K;
●10K的请求:
将分配10K的空闲块,空闲队列变为:
40K,20K,18K,7K,9K,12K和15K;
●9K的请求:
将分配9K的空闲块,空闲队列变为:
40K,20K,18K,7K,12K和15K;
〔3〕若采用最坏适应法:
●12K的请求,将分配40K的空闲块,空闲队列变为:
10K,28K,20K,18K,7K,9K和15K;
●10K的请求:
将分配28K的空闲块,空闲队列变为:
20K,18K,7K,9K,12K和15K;
●9K的请求:
将分配20K的空闲块,空闲队列变为:
10K,18K,11K,18K,7K,12K和15K。
4-15有如下图所示的页表中的虚地址与物理地址之间的关系,即该进程分得6个内存块。
页的大小为4096。
给出对应下面虚地址的物理地址:
(1)20;
(2)5100;(3)8300;(4)47000.
0
1
2
3
4
5
6
7
2
1
6
0
4
3
x
x
解:
〔1〕虚地址20变为页号0和页内偏移20
由页号查页表得0页对应内存块号为2,可计算得
物理地址=块号*页的大小+页内偏移=2*4096+20=8212
〔2〕虚地址5100变为页号1和页内偏移1004〔5100/4096〕
由页号查页表得1页对应内存块号为1,可计算得
物理地址=块号*页的大小+页内偏移=1*4096+1004=5100
〔3〕虚地址8300变为页号2和页内偏移108
由页号查页表得2页对应内存块号为6,可计算得
物理地址=块号*页的大小+页内偏移=6*4096+108=24684
〔4〕虚地址47000变为页号11和页内偏移1944
11>7页号越界
4-16一个作业在执行过程中,按如下顺序依次访问各页,作业分得四个主存块,问分别采用FIFO、LRU和OPT算法时,要产生多少次缺页中断?
设进程开始运行时,主存没有页面。
页访问串顺序为:
01723271032517
〔1〕FIFO
01723271032517
采用FIFO淘汰算法,产生9次缺页中断。
〔2〕LRU
01723271032517
采用LRU算法时,产生11次缺页中断。
4-17考虑如图所示的段表,给出如下所示的逻辑地址所对应的物理地址。
段始址
段的长度
219
600
2300
14
92
100
1326
580
1954
96
〔1〕0,430→219+430=649
〔2〕1,10→2300+10=2310
〔3〕2,500→500>100段内地址越界
〔4〕3,400→1326+400=1726
〔5〕4,112→112>96段内地址越界
4-18一台计算机含有65536字节的存储空间,这一空间被分成许多长度为4096字节的页。
有一程序,其代码段为32768字节,数据段为16386字节,栈段为15870字节。
试问该机器的主存空间适合这个作业吗?
如果每页改成512字节,适合吗?
答:
〔1〕
存储空间每块为4096个字节,共可分成16块。
程序代码段占32768/4096=8块,数据段占16386/4096=5块,栈段占15870/4096=4块,合计为8+5+4=17块,故该机器的主存空间不适合这个作业。
〔2〕
当存储空间每块为512个字节,共可分成128块。
程序代码段占32768/512=64块,数据段占16386/512=33块,栈段占15870/512=31块,合计为64+33+31=128块,故该机器的主存空间是适合这个作业的。
4-19逻辑地址中,用9位表示页号,用10位表示页内地址。
4-20〔1〕缺页中断50次;5000次
〔2〕缺页中断100次;10000次
4-210.9×(0.75×1+0.25×8)+0.10×(8+5000+8)+8
4-238192/4=2048
64=7+11+11+11+11+135级页表
第5章文件系统
5-9.文件存贮空间管理可采用成组自由块链表或位示图。
若一磁盘有B个盘块,其中有F个自由块。
若盘块号用D位表示。
试给出使用自由块链表比使用位示图占用更少的空间的条件。
当D为16时,给出满足条件的自由空间占整个空间的百分比。
解:
一磁盘有B个盘块,用位图表示要使用B位
现有F个自由块,若表示一个盘块需用D位。
则采用链表接连F个盘块,需要F个链指针,共占F*D位。
使用自由块链表比使用位示图占用更少的空间的条件是F*D
当D=16时,满足条件的自由空间占整个空间的百分比为
F/B<1/16=6.25%。
5-10.文件系统的执行速度依赖于缓冲池中找到盘块的比率。
假设盘块从缓冲池读出用1毫秒,从盘上读出用40毫秒。
从缓冲池找到盘块的比率为n,请给出一个公式计算读盘块的平均时间,并画出n从0到1.0的函数图像。
解:
读一个盘块的平均时间=n+40(1-n)=40-39n
5-13.
1574/256=6……38,因此,要访问文件的第7个记录内的38B处。
每个块放两个记录,所要访问的字节处在第4个逻辑块内,其对应的物理块号为4,应访问4号块内的第38个字节。
要访问4次磁盘才能将该字节的内容读出。
5-14.共需要4次磁盘操作
5-15.1GB=230,16KB=214,230/214=216,每个磁盘块号需要2个字节表示,即2B。
〔1〕10KB<16KB,所以,只占用1个磁盘块。
〔2〕1089KB/16KB=69需一个索引块和69个数据块,共70个盘块。
〔3〕129MB/16KB=8256,16KB/2B=8K〔个索引项〕<8256
所以,需2个一级索引表和一个1个二级索引表,8256个数据块。
共需8259个磁盘块。
第6章设备管理
6-6.下列工作各是在四层I/O软件的哪一层上实现的?
(1)对于读磁盘,计算柱面、磁头和扇区〔设备驱动〕
(2)维持最近所用块而设的高速缓冲〔独立于设备的软件层〕
(3)向设备寄存器写命令〔设备驱动〕
(4)查看是否允许用户使用设备〔独立于设备的软件层〕
(5)为了打印,把二进制整数转换成ASCII码〔用户进程〕
6-13.假设移动头磁盘有200个磁道(从0号到199号)。
目前正在处理143号磁道上的请求,而刚刚处理结束的请求是125号,如果下面给出的是按到达时间的先后排成的等待服务队列:
86,147,91,177,94,150,102,75,130。
那么,用下列各种磁盘调度算法来满足这些请求所需的总磁头移动量是多少?
(1)
FCFS:
1251