操作系第3版孟庆昌答案.docx
《操作系第3版孟庆昌答案.docx》由会员分享,可在线阅读,更多相关《操作系第3版孟庆昌答案.docx(25页珍藏版)》请在冰豆网上搜索。
![操作系第3版孟庆昌答案.docx](https://file1.bdocx.com/fileroot1/2023-1/3/4bcf4366-8a70-446d-9500-5f21cda44283/4bcf4366-8a70-446d-9500-5f21cda442831.gif)
操作系第3版孟庆昌答案
部分习题参考答案
针对书中习题的重点和难点部分给出参考答案,而其余习题可在书中相应章节处得到答案。
第1章
3.操作系统是裸机之上的第一层软件,它只在核心态模式下运行,受硬件保护,与硬件关系尤为密切。
操作系统是整个计算机系统的控制管理中心,其他所有软件都建立在操作系统之上。
操作系统对它们既具有支配权力,又为其运行建造必备环境。
4.脱机I/O是指输入/输出工作不受主机直接控制,而由卫星机专门负责完成I/O,主机专门完成快速计算任务,从而二者可以并行操作。
联机I/O是指作业的输入、调入内存及结果输出都在CPU直接控制下进行。
8.硬件——是指计算机物理装置本身,它是计算机系统的物理基础。
如CPU、内存、设备等。
软件——是相对硬件而言的,它是与数据处理系统的操作有关的计算机程序、过程、规则及相关文档资料的总称。
简单地说,软件是计算机执行的程序。
多道程序设计——在这种设计技术下,内存中能同时存放多道程序,在管理程序的控制下交替地执行。
这些作业共享CPU和系统中的其他资源。
并发——是指两个或多个活动在同一给定的时间间隔中进行。
它是宏观上的概念。
吞吐量——在一段给定的时间内,计算机所能完成的总工作量。
分时——就是对时间的共享。
在分时系统中,分时主要是指若干并发程序对CPU时间的共享。
实时——表示“及时”或“即时”。
系统调用——是用户在程序中能以“函数调用”形式调用的、由操作系统提供的子功能的集合。
每一个子功能称做一条系统调用命令。
它是操作系统对外的接口,是用户级程序取得操作系统服务的唯一途径。
10.通常,大家会熟悉以下操作系统:
Windows2000,WindowsXP,UNIX或Linux。
在上机工作过程中,操作系统为用户提供的服务包括:
命令和数据输入/输出的管理,内存的分配,用户文件的管理,CPU的分配,设备管理等。
12.当执行操作系统程序时,处理机处于核心态。
它有较高的特权,可以执行所有的指令,包括一般用户程序中不能使用的特权指令,从而能对所有寄存器和内存进行访问、启动I/O操作等。
用户程序是在用户态下执行,它的权限较低,只能执行指令集中非特权指令。
设置这两种不同状态的目的是为了保护操作系统程序(特别是其内核部分),防止受到用户程序的损害。
13.只在核心态下执行的指令有:
①屏蔽所有中断。
③设置时钟日期。
⑤启动打印机。
⑥清内存。
14.实时系统的一个重要特征就是对时间的严格限制和要求。
实时系统的首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼于提高计算机系统的使用效率。
所以,设计实时操作系统必须首先考虑处理各种事件的时间限制。
15.特权指令是一类只能在核心态下执行的机器指令。
而系统调用不是机器指令,它往往以函数调用的形式出现,实现操作系统提供的子功能,它是操作系统与用户的编程接口。
在用户程序中可以使用系统调用来获得操作系统服务。
在系统调用代码中可以使用特权指令。
16.①结构关系清晰,提高系统的可靠性和安全性。
②各层模块的功能明确,提高系统的可扩充性和可移植性。
③各层间具有单向依赖性,增强系统的可维护性。
④符合软件工程的思想,便于实施研制开发。
18.①精减核心的功能,提供了一种简单的高度模块化的体系结构,提高了系统设计及使用的灵活性。
②可移植性好。
所有与具体机器特征相关的代码,全部隔离在微内核中。
③可伸缩性好。
操作系统能方便地进行定制、扩充或缩减,以适应硬件的快速更新和应用需求的不断变化。
④实时性好。
微内核可以方便地支持实时处理。
⑤提供多线程机制,支持多处理器的体系结构和分布式系统及计算机网络。
⑥系统安全性好。
传统的操作系统将安全性功能建立在内核之外,因而它并不是很安全的。
而微内核则将安全性作为系统内特性来进行设计。
第2章
1.由于多道程序并发执行时共享系统资源,共同决定这些资源的状态,因此系统中各程序在执行过程中就出现了相互制约的新关系,程序的执行出现“走走停停”的新状态。
用程序这个静态概念已不能如实反映程序并发执行过程中的这些特征。
为此,人们引入了“进程(Process)”这一概念来描述程序动态执行过程的性质。
进程和程序是两个完全不同的概念。
进程与程序的主要区别如表C-1所示。
表C-1
进程
程序
进程是动态概念
程序是静态概念
进程具有并发性,宏观上同时运行
程序本身具有顺序性,程序的并发执行是通过进程实现的
进程具有独立性,是一个能独立运行的单位,是系统资源分配的基本单位,是运行调度的基本单位
程序本身没有此特性
程序和进程无一一对应关系,一个进程可顺序执行多个程序
一个程序可由多个进程共用
进程异步前进,会相互制约
程序不具备此特性
然而,进程与程序之间存在密切关系,进程的功能是通过程序的运行得以实现的,进程活动的主体是程序。
进程不能脱离开具体程序而独自存在。
2.PCB是进程组成中最关键的部分。
每个进程有唯一的进程控制块;操作系统根据PCB对进程实施控制和管理,进程的动态、并发等特征是利用PCB表现出来的;PCB是进程存在的唯一标志。
PCB中有表明进程状态的信息,该进程的状态包括运行态、就绪态和阻塞态,它利用状态信息来描述进程的动态性质。
4.
(1)就绪→运行:
CPU空闲,就绪态进程被调度程序选中。
运行→阻塞:
运行态进程因某种条件未满足而放弃对CPU的占用,如等待读文件。
阻塞→就绪:
阻塞态进程所等待的事件发生了,例如读数据的操作完成。
运行→就绪:
正在运行的进程用完了本次分配给它的CPU时间片。
(2)下述状态变迁:
(A)2→1,可以。
运行进程用完了本次分配给它的时间片,让出CPU,从就绪队列中选一个进程投入运行。
(B)3→2,不行。
任何时候一个进程只能处于一种状态,它既然由运行态变为阻塞态,就不能再变为就绪态。
(C)4→1,可以。
某一阻塞态进程等待的事件出现了,而且此时就绪队列为空,该进程进入就绪队列后马上又被调度运行。
8.不是所有的共享资源都是临界资源。
因为临界资源是一次仅允许一个进程使用的资源,而系统中有很多资源可以让多个进程同时使用,例如硬盘、正文段等。
10.因为打印机是一种临界资源,所以这三个进程只能互斥使用这台打印机,即一个用户的计算结果打印完之后,另一个用户再打印。
设三个进程分别为A,B和C,如图C-1所示。
设一个互斥信号量为mutex,其初值为1。
图C-1
11.
(1)这个算法不对。
因为A,B两进程共用一个缓冲区Q,如果A先运行,且信息数量足够多,那么缓冲区Q中的信息就会发生后面的冲掉前面的,造成信息丢失,B就不能从Q中读出完整的信息。
改正:
A,B两进程要同步使用缓冲区Q。
为此,设立两个信号量。
empty——缓冲区Q为空,初值为1。
full——缓冲区Q为满,初值为0。
算法框图如图C-2所示。
(2)这个算法不对。
因为A,B两个进程是并发的,它们共享一个临界资源,所以二者应互斥地使用该临界资源,在进入临界区时不存在A先B后的时序关系,而是哪个进程先到一步就先进入自己的临界区。
改正:
A,B两个进程应互斥地进入临界区。
为此,设立一个信号量:
互斥信号量为mutex,其初值为1。
算法框图如图C-3所示。
图C-2图C-3
12.
(1)如图C-4所示,系统可设三个进程来完成这个任务:
R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。
图C-4
(2)R进程受C进程影响,B1放满信息后R进程要等待,等到C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束,B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束,B2中信息放满后P进程才可从中取出它们,进行打印。
(3)信号量含义及初值:
B1full——缓冲区B1满,初值为0。
B1empty——缓冲区B1空,初值为1。
B2full——缓冲区B2满,初值为0。
B2empty——缓冲区B2空,初值为1。
13.
(1)①输入、输出两组进程读/写缓冲区需要的条件是:
·所有进程都要互斥使用缓冲区。
·所有输入进程连续写入缓冲区的个数不能超过缓冲区的总容量(n)。
·输出进程不能超前输入进程。
②设置三个信号量:
full——放有信息的缓冲区数,其初值为0。
empty——可供使用的缓冲区数,其初值为n。
mutex——互斥信号量,初值为1,表示各进程互斥进入临界区,即保证任何时候只有一个进程使用缓冲区。
两个计数变量:
in和out分别是输入进程和输出进程使用的计数量,表示下面使用的缓冲区编号,初值都是0。
输入进程:
输出进程:
while(TRUE){while(TRUE){
P(empty);P(full);
P(mutex);P(mutex);
信息送往buffer(in);从buffer(out)中取出信息
in=(in+1)modn;/*以n为模*/out=(out+1)modn;/*以n为模*/
V(mutex);V(mutex);
V(full);V(empty);
}}
(2)①输入、输出两组进程读/写缓冲区需要的条件是所有进程都要互斥使用缓冲区;输出进程不能超前输入进程。
②信号量:
full——缓冲区满的情况,初值为0。
mutex——互斥信号量,初值为1。
计数器:
i=0,j=0(i,j分别为输入进程和输出进程使用的缓冲区号码)。
输入进程:
输出进程:
while(TRUE){while(TRUE){
P(mutex);P(full);
信息送往buffer(i);P(mutex);
i=i+1;从buffer(j)中取出信息;
V(mutex);j=j+1;
V(full);V(mutex);
}}
14.
(1)完成此项工作可编写一个程序(函数)或者两个程序(函数)。
每个读者对应一个进程。
当一个读者进入阅览室时,就为他建立一个进程;当读者离开阅览室时,就终止该进程。
可见,有多少个读者到来就要有多少个进程。
而完成工作的程序代码可以是一个,或者二个,这是各个读者进程共用的。
(2)信号量:
S——座位情况,初值为100。
mutex——互斥使用登记表,初值为1。
有两种解法,分别对应利用一个程序(函数)编写和利用二个程序(函数)编写。
第一种解法第二种解法
(一个函数,用自然语言描述)(二个函数,用C语言描述)
每位读者进程typedefstruct{/*定义结构型信号量*/
intvalue;
structPCB*list;
}semaphore;
↓semaphores=100;
P(S)semaphoremutex=1;
P(mutex)voidmain()
查表,登记{
V(mutex)register();/*查表并登记*/
入室,阅读reading();/*阅读*/
P(mutex)delete();/*查表并删除登记项*/
出室查表,删除登记项}
V(mutex)voidregister()
V(S){
↓P(S);
P(mutex);
Check_register();
V(mutex);
}
voiddelete()
{
P(mutex);
Check_delete();
V(mutex);
V(S);
}
15.在生产者-消费者问题中,如果对调生产者进程中的两个P操作,形如:
生产者进程Producer:
while(TRUE){
P(mutex);
P(empty);
……
V(mutex);
V(full);
}
当缓冲区全满时,只要有一个生产者进程试图进入临界区,并在empty信号量上阻塞,所有消费者进程都无法进入自己的临界区,从而无法使该进程醒来。
于是,所有生产者进程和消费者进程都无限期地处于阻塞状态,从而出现死锁。
然而,如果对调生产者进程中的两个V操作,并不出现任何故障,只是从进程退出临界区的角度考虑,应越快越好。
如果对调消费者进程中的两个P操作,也会产生同样问题。
16.信号量所能传递的信息量是非常有限的,通信效率低。
如果用它实施进程间数据的传送就会增加程序的复杂性,使用起来也很不方便,甚至会因使用不当而产生死锁。
为了解决进程间消息通信问题,人们研究和设计了高级通信机构。
其主要优点是:
①不仅能较好地解决进程间的同步互斥问题,还能交换大量信息;②由操作系统隐藏了进程通信的实现细节,即通信过程对用户是透明的,从而大大简化了编制通信程序的复杂性。
当某个进程需要向另一个进程发送消息时,就向系统申请一个消息缓冲区,并把要发送的数据送到消息缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中。
接收进程在接收消息时,只需从本进程的消息队列中摘下该缓冲区,并从中取出所需的信息,然后把该缓冲区交还给系统。
17.设隧道一端为A,另一端为B。
每辆汽车为一个进程。
A、B两端的汽车进程分别用P_Ai和P_Bi(i=1,2,3…)表示。
双方通过隧道的方式相同:
首先提出申请;获准后进入隧道,本方进入隧道的汽车计数加1;如果是本方第一辆车过隧道,则阻塞对方汽车过隧道;若对方无车辆等待,则本方可以连续放行多台车辆进入隧道;汽车通过隧道;本方进入隧道的汽车计数减1;如果是目前本方最后一辆车(即目前本方无车辆过隧道),则放行对方汽车通过。
设置信号量:
wait:
等待申请的互斥信号量,初值为1;
mutexA:
放行A方汽车过隧道的互斥信号量,初值为1;
mutexB:
放行B方汽车过隧道的互斥信号量,初值为1;
计数变量:
count1=0;count2=0;
过隧道算法描述:
P_Ai:
P_Bi:
P(wait);P(wait);
P(mutexA);P(mutexB);
count1=count1+1;count2=count2+1;
if(count1==1)if(count2==1)
P(mutexB);P(mutexA);
V(mutexA);V(mutexB);
V(wait);V(wait);
汽车通过隧道;汽车通过隧道;
P(mutexA);P(mutexB);
count1=count1-1;count2=count2-1;
if(count1==0)if(count2==0)
V(mutexB);V(mutexA);
V(mutexA);V(mutexB);
18.本题是典型的读者-写者问题。
查询信息的用户是读者,订票用户是写者,并且要求写者优先。
【解法1】读者-写者按先后顺序交叉访问数据库,如图C-5所示。
图C-5
计数变量:
rc——正在运行的查询者进程数目,初值为0。
信号量:
Sw——控制订票者进程的活动,初值为1。
Src——互斥使用rc变量,初值为1。
S——当订票者到达时封锁后续的读进程,初值为1。
【解法2】保证写者优先于读者,即一旦有写者到达时,则新读者要等待。
信号量:
rmutex——当至少有一个写者到达时,阻止所有读者访问的互斥操作信号量,初值为1。
wmutex——写者间以及读者与写者间互斥操作信号量,初值为1。
x——控制readcount变量修改的互斥信号量,初值为1。
y——控制writecount变量修改的互斥信号量,初值为1。
z——有写者时,只允许一个读者在rmutex上排队,其他读者在信号量z上排队,初值为1。
计数变量:
readcount——读者计数器,初值为0。
它控制对wmutex的设置。
writecount——写者数目,初值为0。
它控制对rmutex的设置。
读者进程写者进程
while(TRUE){while(TRUE){
P(z);P(y);
P(rmutex);writecount++;
P(x);if(writecount==1)
readcount++;P(rmutex);
if(readcount==1)V(y);
P(wmutex);P(wmutex);
V(x);执行写操作
V(rmutex);V(wmutex);
V(z);P(y);
执行读操作writecount--;
P(x);if(writecount==0)
readcount--;V(rmutex);
if(readcount==0)V(y);
V(wmutex);}
V(x);
}
19.除学生进程、教师进程外,为保证系统控制流程,需另设一个监控进程,用于控制学生的进入和计算机的分配,如图C-6所示。
信号量:
student——学生到达情况,初值为0。
computer——计算机分配情况,初值为2m。
enter——能否进入机房情况,初值为0。
finish——学生完成情况,初值为0。
check——检查工作完成情况,初值为0。
图C-6
20.如图C-7所示。
信号量:
S_M0=1,S_M1=2,S_M2=3,S_M3=2——各个信箱中可用格子的信号量。
S0=2,S1=0,S2=0,S3=0——各个信箱中信息的信号量。
mutex0,mutex1,mutex2,mutex3——互斥使用各信箱的信号量,初值均为1。
图C-7
26.用一个信号量表示一根筷子,五个信号量构成信号量数组chopstick[5],所有信号量初值为1。
第i个哲学家的进餐过程可描述如下:
while(TRUE){
思考问题
P(chopstick[i]);
P(chopstick[(i+1)mod5]);
进餐
V(chopstick[i];
V(chopstick[(i+1)mod5]);
}
#defineN5
#defineLEFT(i-1)%N
#defineRIGHT(i+1)%N
#defineTHINKING0
#defineHUNGRY1
#defineEATING2
typedefstruct{/*定义结构型信号量*/
intvalue;
structPCB*list;
}semaphore;
intstate[N];
semaphorechopstick[5]={1,1,1,1,1};
semaphoremutex=1;/*互斥进入临界区*/
semaphores[N];/*每位哲学家一个信号量*/
voidphilosopher(inti)
{
while(TRUE){
think();/*哲学家在思考问题*/
take_chopstick(i);/*拿到两根筷子或者等待*/
eat();/*进餐*/
put_chopstick(i);/*把筷子放回原处*/
}
}
voidtake_chopstick(inti)
{
P(mutex);
state[i]=HUNGRY;
test(i);/*试图拿两根筷子*/
V(mutex);
P(s[i]);
}
voidput_chopstick(inti)
{
P(mutex);
state[i]=THINKING;
test(LEFT);/*查看左邻,现在能否进餐*/
test(RIGHT);/*查看右邻,现在能否进餐*/
V(mutex);
}
voidtest(inti)
{
if(state[i]==HUNGRY&&state[LEFT]!
=EATING&&state[RIGHT]!
=EATING){
state[i]=EATING;
V(s[i]);
}
}
第3章
4.解决死锁的一般方法有:
死锁的预防、死锁的避免、死锁的检测与恢复等三种。
5.死锁预防的基本思想是:
要求进程申请资源时遵循某种协议,从而打破产生死锁的4个必要条件中的一个或几个,保证系统不会进入死锁状态。
6.死锁避免的基本思想是:
对进程所发出的每一个申请资源命令加以动态地检查,并根据检查结果决定是否进行资源分配。
就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免。
这种方法的关键是确定资源分配的安全性。
8.死锁预防的有效方法是:
资源有序分配策略——分类编号,按序分配。
死锁避免的著名算法是银行家算法。
9.会产生死锁。
设当轮船距A桥100m时就鸣笛警告,此时桥上无车辆,吊桥A就吊起。
但是B桥上有车辆,而且由于A桥吊起,车辆无法前进,B桥上的车辆无法下桥。
于是,轮船和车辆都不能前进,造成死锁现象。
一种防止死锁的办法是:
当轮船距A桥100m时就鸣笛警告,车辆不能再上B桥。
当B桥上无车辆时,就吊起B桥;然后,当A桥上无车辆,则吊起A桥。
轮船通过A桥和B桥后,两个吊桥放下,车辆可以通行(这种方法相当于资源的按序号分配)。
10.
(1)能同时运行的最大作业数是2,实际上空闲的磁带机最少是2台,最多是4台。
(2)作业对磁带机资源提出请求时,系统判断:
若分配的话,系统是否仍处于安全状态。
在3个作业各分到3台磁带机的情况下,系统仍然是安全的。
所以,能同时运行的最大作业数是3,实际上空闲的磁带机最少和最多台数各是0和1。
11.①处于死锁状态的进程都占有一定资源,而处于饥饿状态的进程永远得不到所申请的资源。
②死锁是一种僵局,在无外力干预下,处于死锁状态的全部进程都不能前进,即它们都处于阻塞态,可能造成整个系统瘫痪;而出现饥饿时系统照常运行,只是某个或某几个进程永远也不能得到所需的全部服务。
③造成死锁的根本原因是资源有限且使用不当;而造成饥饿的原因是资源分配策略或调度策略不合适,如果采用先来先服务的资源分配策略就可以避免饥饿。
④发生死锁时,一定至少有一个资源被无限期地占用而得不到释放;而饥饿出现时,系统中的每个资源占有者都在有限的时间内释放它所占用的资源。
12.
(1)各路段作为“资源”,各车辆视为“进程”。
产生死锁的4个必要条件:
①互斥条件——路段是独占资源;②占有且等待条件——各车辆都占有一段路段,