电子科大操作系统期末复习之经典大题

244 阅读10分钟

博客原文:uestcwxy.love/2023/06/17/…

1

用四种方法解决哲学家就餐问题

semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore num = 4;

void philosopher(int i) {
    while (true) {
        wait(num);
        wait(chopstick[i]);
        wait(chopstick[(i + 1) % 5]);

        // 进行进餐操作

        signal(chopstick[i]);
        signal(chopstick[(i + 1) % 5]);
        signal(num);

        // 进行思考操作
    }
}
semaphore chopstick[5] = {1, 1, 1, 1, 1};

void philosopher(int i) {
    while (true) {
        if(i%2==1){
    wait(chopstick[i]);        //等左侧的筷子
    wait(chopstick[(i+1) % 5]);//等右侧的筷子
    }
    else{
    wait(chopstick[(i+1)%5]); //等待右侧的筷子
    wait(chopstick[i]);        //等左侧的筷子     
    }
         …
        eat
         …
    signal(chopstick[i]);    //放下左侧
    signal(chopstick[(i+1) % 5]);//放下右侧
         …
        think
         …
    }
}
semaphore chopstick[5] = {1, 1, 1, 1, 1};

do {
    // ...

    think;

    Sswait(chopstick[(i + 1) % 5], chopstick[i]);

    // Eat

    Ssignal(chopstick[(i + 1) % 5], chopstick[i]);

} while (TRUE);
//通过互斥信号量 mutex 对 eat之前取左右两侧筷子的操作进行保护,可以防止死锁的出现

semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore mutex = 1;

void philosopher(int i) {
    while (true) {
        wait(mutex);
        wait(chopstick[i]);
        wait(chopstick[(i + 1) % 5]);
		signal(mutex)
        // 进行进餐操作

        signal(chopstick[i]);
        signal(chopstick[(i + 1) % 5]);

        // 进行思考操作
    }
}

2

假定系统有3个并发进程get 、copy 和put共享缓冲器B1和B2。进程get负责从输入设备上读信息,每读出一条记录后放到B1中。进程copy从缓冲器B1中取出一条记录拷贝后存入B2。进程put取出B2中的记录打印输出。B1和B2每次只能存放一条记录。要求3个进程协调完成任务,使打印出来的与读入的记录个数、次序完全一样。请用记录型信号量写出并发程序。

设置4个信号量,其中empty1对应空闲的缓冲区1,其初值为1;full1对应缓冲区1中的记录,其初值为0; empty2对应空闲的缓冲区2,其初值为1;full2对应缓冲区2中的记录,其初值为0。相应进程描述为:

get( ){				
	while(ture){
		从输入设备读入一条记录;
		P(empty1);
		将记录存入缓冲区1V(full1);
	}
}

copy( ){				
	while(true){
		P(full1);
		从缓冲区1中取出一条记录;
		V(empty1);
		P(empty2);
		将取出的记录存入缓冲区2V(full2);
		}
}

put( ){				
	while(1){
		 P(full2);
		从缓冲区2中取出一条记录;
		 V(empty2);
		将取出的记录打印出来;
	}
}

Main( ){
     parbegin(get,copy,put);
}

3

这是一个从键盘输入到打印机输出的数据处理流图,其中键盘输入进程通过缓冲区buf1 把输入数据传送给计算进程,计算进程把处理结果通过缓冲buf2 传送给打印进程。buf1 和buf2 为临界资源,试写出键盘输入进程,计算进程及打印进程间的同步算法。(10分)

输入进程→ buf1 →计算进程→ buf2 →打印进程

解答:从键盘输入到打印机输出的数据传送过程,可以看作是由键盘输入进程到计算进程,以及由计算进程到打印输出进程这两个数据传送进程所组成。其中,对键盘输入进程而言,计算进程是消费者进程;而对打印输出进程而言,计算进程又是生产者进程。据此可将它们之间的同步问题描述如下:

var:mutex1,mutex2,empty1,empty2,full1,full2:=1,1,1,1,0,0;

IP:begin
repeat
P(empty1);
P(mutex1);
input a charcter from keyboard;
Add to buffer;
V(mutex1);
V(full1);
until false
end

CP:begin
repeat
P(full1);
P(mutex1);
Take a charactor form buffer1;
Add to ch1;
V(mutex1);
V(empty1);
P(empty2);
P(mutex2);
Take a charactor form ch1;
Add to buffer2;
V(mutex2);
V(full2);
until false
end

OP:begin
repeat
p(full2);
P(mutex2);
Take a charactor from buffer2;
Add to printer controler;
start printer;
V(mutex2);
V(empty2);
until false
end

4

一台计算机有10台磁带机被n个进程竞争,每个进程最多需要3台磁带机,那么n最多为(4)时,系统没有死锁的危险?

补充:关于死锁的公式:当一个系统有N个并发进程,每个进程都需要M个同类资源,那么最少需要多少资源才能避免死锁的出现? (M-1)*N+1 注:每个进程分配M-1个资源,然后再加上一个资源,该资源无论给哪个进程都可以保证当前系统不会出现死锁。

5

在银行家算法中,若出现下述的资源分配情况:

ProcessMaxAllocationAvailable
P00 0 4 40 0 3 21 6 2 2
P12 7 5 01 0 0 0
P23 6 10 101 3 5 4
P30 9 8 40 3 3 2
P40 6 6 100 0 1 4

1)该状态是否安全?

2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?

3)如果系统立即满足P2的上述请求,系统是否立即进入死锁状态?

解:

1)利用安全性算法对上面的状态进行分析(如下表所示),找到了一个安全序列{P0,P3,P4,P1,P2}或{P0,P3,P1,P4, P2},故系统是安全的。

2)P2发出请求向量Request(1,2,2,2)后,系统按照银行家算法进行检查:Request2(1,2,2,2)≤Need2(2,3,5,6); Request2(1,2,2,2)≤Available(1,6,2,2);系统先假定可为P2分配资源,并修改Available,Allocation2和Need2向量:Availabe=(0,4,0,0)Allocation2=(2,5,7,6)Need2=(1,1,3,4) ,进行安全性检查:此时对所有进程,条件Needi≦ Available(0,4,0,0)都不成立,即Available不能满足任何进程的请求,故系统进入不安全状态。因此,当进程P2提出请求Request(1,2,2,2)后,系统不能将资源分配给它。

3)系统立即满足进程P2的请求(1,2,2,2)后,并没有马上进入死锁状态。因为,此时上述进程并没有申请新的资源,并未因得不到资源而进入阻塞状态。只有当上述进程提出新的请求,并导致所有没执行完的多个进程因得不到资源而阻塞时,系统才进入死锁状态。

6

已知某分页系统,用户空间有64个页面,主存容量为32KB,页面大小为1KB,对一个4页大的作业,其0、1、2、3页分别被分配到主存的2、4、6、7块中。

(1)将十进制的逻辑地址1023、2500、3500、4500转换成物理地址?

(2)以十进制的逻辑地址1023为例画出地址变换过程图?

逻辑地址位数 64*1K=2^16 16位

物理地址位数 32K=2^15 15位

每个块大小:1KB

①逻辑地址1023:1023/1K,得页号为0,页内地址为1023,查页表找到对应的物理块号为2,故物理地址为2×1K+1023=3071

②逻辑地址2500:2500/1K,得页号为2,页内地址为452,查页表找到对应的物理块号为6,故物理地址为6×1K+452=6596

③逻辑地址3500:3500/1K,得页号为3,页内地址为428,查页表找到对应的物理块号为7,故物理地址为7×1K+428=7596

④逻辑地址4500:4500/1K,得页号为4,页内地址为404,因页号大于页表长度,故产生越界中断。

7

对访问串:1,2,3,4,1,2,5,1,2,3,4,5,指出在驻留集大小分别为3,4时,使用FIFO和LRU替换算法的缺页次数。结果说明了什么?

首先采用FIFO,当m=3时,缺页次数=9,当m=4时,缺页次数=10。采用LRU算法,当m=3时,缺页次数=10;当m=4时,缺页次数=8。结果说明:FIFO有Belady奇异现象,即不满足驻留集增大,缺页次数一定减小的规律;另外在m=3时,LRU的缺页次数比FIFO要多,所以LRU算法并不总优于FIFO,还要看当前访问串的特点。

8

一台计算机有四个页框,装入时间、上次引用时间、它们的R(读)与M(修改)位如下表所示(时间单位:嘀嗒),请问NRU、FIFO、LRU算法将替换哪一页?

装入时间上次引用时间RM
012627900
123026010
212027211
316028011

FIFO算法在需要淘汰某一页时,淘汰最先进入内存的页。在题述条件下,第2页是最先进入内存的页。故FIFO算法将淘汰第2页。

LRU算法在需要淘汰某一页时,淘汰最近最久未使用的页面。在题述条件下,第1页是最近最久未使用的页面。故LRU算法将淘汰第1页。

NRU算法在需要淘汰某一页时,从那些最近一个时期内未被访问的页中任选一页淘汰。在题述条件下,只有第0页是最近一个时期内未被访问的页。故NRU算法将淘汰第0页。

9

一个磁盘系统,平均寻道时间为12ms,转速为10000转/分,每个磁道有18个扇区,每个扇区512个字节。请问要读取一个扇区所花的时间是多少?

TS = 12ms

TR = 1/2r = 60÷10000×0.5 = 3ms (因为不知道扇区具体在哪按半圈算)

TA=b/rN = 512÷[(10000/60) ×(18×512)]= 0.33ms

TT = TS + TR + TA =12 + 3 + 0.33 = 15.33ms

答:读取一个扇区所花的时间是15.33ms。

10

假定盘块的大小为1KB,硬盘的大小为500MB,采用显示链接分配方式时,其FAT需占用多少存储空间(FAT表项占2.5个字节)?如果文件A占用硬盘的11, 12 , 16, 14四个盘块,试画出文件A中各盘块在FAT表中的链接情况.

11

存放在某个磁盘上的文件系统,对于采用混合索引分配方式,其 FCB 中共有 13 项地址项,第 0~9 个地址项为直接地址,第 10 个地址项为一次间接地址,第 11 个地址项为二次 间接地址,第 12 个地址项为三次间接地址。如果每个盘块的大小为 512 字节,盘块号需要 3 个字节来描述,则每个盘块最多存放 170 个盘块地址。 (1) 该文件系统允许的最大长度是多少? (2) 将文件的字节偏移量 5000、15000、150000 转换为物理块号和块内偏移量。 (3) 假设某文件的索引结点已在内存中,但其他信息均在外存,为了访问该文件中某个位置的内容,最多需要几次访 问磁盘?

(1) 该文件系统中一个文件的最大长度可达:

10+170+170×170+170×170×170=4942080 块,共 4942080×512 字节 = 2471040KB

(2) 5000/512 得到商为 9, 余数为 392, 即字节偏移量 5000 对应的逻辑块号为 9, 块内偏移量为 392。由于 9<10, 故可直接从该文件的 FCB 的第 9 个地址项处得到物理盘块号,块内偏移量为 392。

15000/512 得到商为 29, 余数为 152, 即字节偏移量 15000 对应的逻辑块号为 29, 块内偏移量为 152。由于 10<29< 10+170, 而 29-10=19, 故可从 FCB 的第 10 个地址项,即一次间址项中得到一次间址块的地址;并从一次间址块的第 19 项 (即该块的第 57~59 这 3 个字节) 中获得对应的物理盘块号,块内偏移量为 152。

150000/512得商为292,余数为496。即逻辑块号为292,块内偏移为496。由于10+170≤292,故可从FCB的第11个地址项,即二次间址项中获得第1个一次间址块;并从该一次间址块的112项中获得对应的物理盘块号,块内偏移为496。(150000/512 得到商为 292, 余数为 496, 即字节偏移量 150000 对应的逻辑块号为 292, 块内偏移量为 496。由于 10+170<292< 10+170+170×170, 而 292-(10+170)=112,112/170 得到商为 0, 余数为 112, 故可从 FCB 的第 11 个地址项,即二次间址项中得到二次间址块的地址,并从二次间址块的第 0 项中获得一个一次间址块的地址,再从这一次间址块的第 112 项中获得对应的物理盘块号,块内偏移量为 496。)

(3) 由于文件的 FCB 己在内存,为了访问文件中某个位置的内容,最少需要 1 次访问磁盘 (即可通过直接地址直接读文件盘块),最多需要 4 次访问磁盘 (第一次是读三次间址块,第二次是读二次间址块,第三次是读一次间址块,第四次是读文件盘块)。

12

1)分配过程线形检索得:i1=2,j1=2; i2=3,j2=6。计算空闲盘块号: b1=i1×16+j1+1=2×16+2+1=35

b2=i2×16+j2+1=3×16+6+1=55修改位示图:

令map[2,2]=map[3,6]=1,并将对应块35,55分配出去。

2)释放过程计算出第300块所对应的二进制行号i和j

i=(300-1)/16=18

j= (300-1)% 16=11

修改位示图: 令map[18,11]=0。

(注意行号和列号不是从1开始编号)

13

设正在处理器上执行的一个进程的页表如下表所示,表中的虚页号和物理块号是十进制数,起始页号(块号)均为0。所有的地址均是存储器字节地址。页的大小为1024字节。(10分)

① 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。

② 下列虚地址对应于什么物理地址:5499,2221。

虚页号状态位访问位修改位物理块号
01104
11117
2000-
31002
4000-
51010

  1. 首先,虚地址被分为两部分:页号和页内偏移量。
  2. 系统会检查快表(TLB),看看虚拟页号是否在快表中。如果在,快表会返回相应的物理页框号。
  3. 如果虚拟页号不在快表中,系统会查询页表,找到相应的物理页框号。如果该虚拟页没有分配物理页框,则会发生缺页中断,由操作系统负责分配物理页框并更新页表。
  4. 一旦找到物理页框号,系统会将其与虚地址的页内偏移量组合起来,形成物理内存地址。

虚地址(虚页号,页内地址)物理地址 (物理块号,块内地址)
5499=1024*5+379(5,379)(0,379)
2221=1024*2+173(2,173)(不在内存)

14

请求分页管理系统中,假设某进程的页表内容如下表所示。

进程页框(Page Frame)号有效位(存在位)
0101H1
10
2254H1

页面大小为4KB,一次内存的访问时间是100ns,一次快表(TLB)的访问时间是10ns,处理一次缺页的平均时间为108ns(已含更新TLB和页表的时间),进程的驻留集大小固定为2,采用最近最少使用置换算法(LRU)和局部淘汰策略。假设

①TLB初始为空;

②地址转换时先访问TLB,若TLB未命中,再访问页表

(忽略访问页表之后的TLB更新时间);

③有效位为0表示页面不在内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。设有虚地址访问序列2362H、1565H、25A5H,请问:

(1) 依次访问上述三个虚地址,各需多少时间?

(2) 基于上述访问序列,虚地址1565H的 物理地址是多少?请说明理由。

1)由于页面大小为4KB=212KB,故逻辑地址末尾12位表示页内偏移W,前4位表示页号P。

对于逻辑地址2362H,其表示的页号为2,访问次序依次为:访问TLB未命中(10ns); 访问页表命中2号页面,并将页表项副本放入TLB(100ns),得到物理地址,访问内存(100ns)。

故逻辑地址2362H的访问时间为:EAT=10+100+100=210ns; 对于逻辑地址1565H,其表示的页号为1,访问次序依次为,访问TLB未命中(10ns);访问页表未命中(100ns);发生缺页中断(108ns);访问TLB命中1号页面(10ns);得到物理地址访问内存(100ns)。此时驻留集已满(0号页面和2号页面)

故逻辑地址1565H的访问时间为: EAT=108+2×(100+10)=328ns。 对于逻辑地址25A5H,其表示的页号为2,访问次序依次为:访问TLB命中二号页面(10ns);得到物理地址访问内存(100ns)。

故逻辑地址25A5H的访问时间为:EAT=a+t=10+100=110ns; 2) 访问逻辑地址1565H时由于驻留集已满(0号页面和2号页面)。故应从页表中淘汰一个页面,根据LRU算法,2号页面刚被使用过,故淘汰0号页面,将1号页面调入获得内存块号101H。则地址由内存块号和页内偏移量拼接得到物理地址为:101565H。

15

设系统有三种类型的资源,数量为(4,2,2),系统中有进程A,B,C按如下顺序请求资源:

进程A申请(3,2,1)

进程B申请(1,0,1)

进程A申请(0,1,0)

进程C申请(2,0,0)

请你给出一和防止死锁的资源剥夺分配策略,完成上述请求序列,并列出资源分配过程,指明哪些进程需要等待,哪些资源被剥夺。(10分)

解:(10分)

① 分配策略为:当进程Pi申请ri类资源时,检查ri中有无可分配的资源:有则分配给Pi;否则将Pi占有的资源全部释放而进入等待状态。(Pi等待原占有的所有资源和新申请的资源)

② 资源分配过程: 剩余资源

进程A:(3,2,1) (1,0,1)

进程B:(1,0,1) (0,0,0)

进程A:(0,1,0)(不满足) (3,2,1)

A的所有资源被剥夺,A处于等待

进程C:(2,0,0) (1,2,1)

C,B完成之后,A可完成。

16

设公共汽车上,司机和售票员的活动分别是:

司机的活动:启动车辆;正常行车;到站停车。

售票员的活动:关车门;售票;开车门。

在汽车不断的到站、停站、行驶过程中,试用信号量和P,V操作实现司机和售票员的同步。

Semaphore run=0; //是否允许司机启动汽车
Semaphore stop=0; //是否允许售票员开门
main()
{
    cobegin
        driver();
    	busman();
    coend
}
driver()
{
    while(TRUE)
    {
        p(run);
        启动公交车,开车,到站停车;
        V(stop);
    }
}
busman()
{
    while(TRUE)
    {	
        关车门
        V(run);
        售票;
        P(stop);
        开车门,上下乘客
    }
}

17

某虚拟存储器的用户编程空间共 32 个页面,每页为 1KB ,内存为 16KB 。假定某时刻一用户进程的页表中已调入内存的页面的页号和物理块号的对照表如下:

( 1 )此时,指令中逻辑地址至少需要多少位?

(2)逻辑地址0A 5C(十六进制)所对应的物理地址是什么(用十六进制表示)?给出计算过程。

页式存储管理的逻辑地址分为两部分:页号和页内地址。由已知条件“用户编程空间共32个页面”,可知页号部分占5位;由“每页为1KB”,1K=210,可知内页地址占10位,则指令中逻辑地址至少需要15位。 逻辑地址0A5C(H)所对应的二进制表示形式是:000 1010 0101 1100 ,根据上面的分析,10 0101 1100 为页内地址,编码 “000 10” 为页号,表示该逻辑地址对应的页号为2。查页表,得到物理块号是4(十进制),即物理块地址为:01 00 ,拼接页内地址10 0101 1100,得01 0010 0101 1100,即125C(H)。

18

进程A1、A2、…Anl通过m个缓冲区向进程B1、B2、…Bn2不断地发送消息。发送和接收工作遵循如下规则:

(1)每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小与消息长度一样。

(2)对于每一个消息,B1、B2、…Bn2都需各接收一次,读入自己的数据区内。

(3)m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。 试用wait、signal操作描述它们的同步关系。

每个缓冲区只要写一次但要读n2次,因此,可以看成n2组缓冲区,每个发送者要同时写n2个缓冲区,而每个接收者只要读它自己的缓冲区。

mutex=1; //多进程互斥使用缓冲区
empty[0,1,……n2]={m,m,……m};
full[0,1,…..n2]={0,0,……0};
 
while(1)//写进程
{
for(i = 0; i< n2; i++){
	P(empty[i]);
	}
P(mutex);
消息放入缓冲区;
V(mutex);
for(i = 0; i< n2; i++){
	V(full[i]);
	}
}
 
 
while(1)//读进程
{
P(full[i]);
P(mutex);
读取缓冲区;
V(mutex);
V(empty[i]);
}

19

一个进程的大小为5个页面,为它分配了4个物理块。当前每个块的情况如下表所示(都为十进制数,且从0开始计数)。当虚页4发生缺页时,使用下列的页面置换算法,哪一个物理块将被换出?并解释原因。

页号块号加载时间访问时间访问位R修改位M
206016101
1113016000
022616210
332016311

(1) FIFO算法;

(2) LRU算法;

(3) CLOCK算法;

(4) 当页面的访问串为:“4,0,0,0,2,4,2,1,0,3,2”的OPT算法。

解:(1) 换出第3号虚页,因为它加载的时间最早;

(2) 换出第1号虚页,因为它最近最久没被访问;

(3) 换出第1号虚页,因为它最近既没被访问,又没被修改;

(4) 换出第3号虚页,因为它离访问点最远。

20

设某程序大小为460字,并且它有下面的存储访问序列:

10,11,104,170,73,309,185,245,246,434,458,364

设页面大小是100字,请给出该访问序列的页面走向.又设该程序基本可用内存是200字,采用先进先出置换算法(FIFO),求出其缺页率.如果采用最佳置换算法(OPT),其缺页率又是多少?(注:缺页率=缺页次数/访问页面总数)

根据已知条件页面大小是100字,将页面访问序列简化为:

0,0,1,1,0,3,1,2,2,4,4,3 (2分)

又因为该程序基本可用内存是200字,可知内存块数为2.

采用先进先出置换算法(FIFO),总共有6次缺页,缺页率为6/12=50%

采用最佳置换算法(OPT),总共有5次缺页,缺页率为5/12=41.7%

21

有一个大学只有一个澡堂,门口上有一块牌子,如果有一个男生进去洗澡,他就会把牌子转到“男”字样,这样只有男生会进去,女生就不会进去了;如果澡堂没人,一个女生先进了澡堂,她就会把牌子转到“女”字样,那么女生就可以进去了;请用PV操作描述这个事件,避免男女生同时出现在澡堂。

Semphore  boymutex=1, girlmutex=1,mutex=1;
int boycount=0;  
int girlcount=0;
Parbegin 

Boy()
begin
  repeat
    wait(boymutex); 
    if boycount ==0 then wait(mutex);
	boycount = boycount +1; 
    signal(boymutex); 
    洗澡;
    wait(boymutex); 
    boycount = boycount -1;
	if boycount ==0 then signal(mutex);
signal(boymutex);
until false;
end;

Girl()
begin 
  repeat 
    wait(girlmutex); 
	if girlcount ==0 then wait(mutex);
	girlcount = girlcount +1; 
    signal(girlmutex); 
    洗澡;
    wait(girlmutex); 
    girlcount = girlcount -1;
	if girlcount ==0 then signal(mutex);
	signal(girlmutex);
until false;
end;
Parend

22

若程序PA和PB单独执行时分别用TA=1小时,TB=1.5小时,其中处理器工作时间 TA=18分钟 T=27分钟,如果采用多道程序设计方法,让PA、PB并行工作,假定处理器利率达到50%,另加15分钟系统开销,请问系统效率能提高多少?

答:单道系统下程序一个执行完再执行另一个,所以CPU执行PA和PB加起来的时间为 60+90=150分钟

多道系统下PA和PB同时在内存中,当一个程序开始I/O时,OS调用另一个执行,所以它们只占用了CPU时间18+27=45分钟

又因为CPU利用率为50%,除了执行PA和PB,还需要维持OS的运行;另一方面在PA和PB间切换也花了15分钟, 因此实际的CPU运行时间为(18+27)/50%+15=90+15=105分钟

所以系统效率提高:[(60+90)-(90+15)]/(60+90)=30%

23

某单处理器系统中采用多道程序设计,现有10个进程存在,则处于“运行”,“阻塞”、“就绪”状态的进程数量最小和最大值分别可能是多少?

答:在一个单处理器系统中,采用多道程序设计,现有10个进程存在。在任何时刻,只能有一个进程处于“运行”状态,因为只有一个处理器。处于“阻塞”状态的进程数量最小值为0,最大值为10,因为所有进程都可能在等待某些事件发生。处于“就绪”状态的进程数量最小值为0,最大值为9,因为除了正在运行的进程外,其他所有进程都可能处于就绪状态。因此,在这个系统中,处于“运行”状态的进程数量最小值和最大值都是1;处于“阻塞”状态的进程数量最小值为0,最大值为10;处于“就绪”状态的进程数量最小值为0,最大值为9。

24

桌上有一空盘,只允许存放一个水果。爸爸可向盘中放苹果,也可向盘中放桔子。儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘中空时一次只能放一只水果供吃者取用,请用 P、V原语实现爸爸、儿子、女儿三个并发进程的同步。

semaphore empty = 1;
semaphore apple = 0;
semaphore orange = 0;
semaphore mutex = 1;

void father() {
    while (true) {
        P(empty);
        P(mutex);
        // 向盘中放苹果或桔子
        if (放苹果) {
            V(apple);
        } else if (放桔子) {
            V(orange);
        }
        V(mutex);
    }
}

void son() {
    while (true) {
        P(orange);
        P(mutex);
        // 从盘中取桔子
        V(mutex);
        V(empty);
    }
}

void daughter() {
    while (true) {
        P(apple);
        P(mutex);
        // 从盘中取苹果
        V(mutex);
        V(empty);
    }
}

25

桌上有一空盘,最多允许存放一只水果。爸爸只向盘中放一个苹果,妈妈只向盘中放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。用wait、signal操作实现爸爸、妈妈、儿子、女儿四个并发进程的同步。

semaphore empty=1,nutex=1,apple=0,orange=0;  //为四个信号量赋初值
void father(){
     do{
           wait(empty);    //等待盘子为空
           wait(metux);    //等待获取对盘子的操作
            爸爸向盘中放一个苹果;
           signal(mutex);   //释放对盘子的操作
           signal(apple);   //通知女儿可以来盘子中取苹果
    }while(TRUE);
}
void mather(){               //与父亲进程雷同
     do{
           wait(empty);
           wait(metux);
            妈妈向盘中放一个桔子;
           signal(mutex);
           signal(orange);
    }while(TRUE);
}
void son(){                        
     do{
           wait(orange);       //判断盘子中是否有桔子
           wait(metux);        //等待获取对盘子的操作
            儿子取出盘中的桔子;
           signal(mutex);      //释放对盘子的操作
           signal(empty);      //盘子空了,可以继续放水果了
    }while(TRUE);
}
void daugther(){               //与儿子进程雷同
     do{
           wait(apple);
           wait(metux);
            女儿取出盘中的苹果;
           signal(mutex);
           signal(empty);
    }while(TRUE);
}
void main() {               //四个并发进程的同步执行
	cobegin
	   father();mather();son();daugther();
	coend
}

25

在某页式虚拟系统中,假定访问内存的时间是10ms,平均缺页中断处理为25ms,平均缺页中断率为5%,试计算在该虚存系统中,平均有效访问时间是多少?

答:若要访问的页面在内存中,一次访问的时间是:10ms+10ms=20ms;如果不在内存,所花的时间是:10ms(问内存页表)+25ms(中断处理)+10ms(访问内存页表)+10ms(访问内存)=55ms。所以平均有效访问时间为: 20ms× (1-5%)+55ms×5%=21.75ms

26

若是一个磁盘容量是64MB,磁盘盘块大小为1KB,若是采用显式链接的方式,需要多大的FAT表;若是用索引结构,需要用几级索引,为什么?

答:64MB/1KB=64K(块),需16位地址标识,需对于FAT表的一表项,则占2字节,2B×64K=128KB。

一个盘块可以放1KB/2B=512项,一级索引肯定不够,512*512>64K,所以需要二级索引。