A.原理:
至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。
以下将room作为信号量,只允许4个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入room的等待队列,根据FIFO的原则,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象。
fjnFLDa5Zo
伪码:
semaphorechopstick[5]={1,1,1,1,1}。
semaphoreroom=4。
voidphilosopher(inti>
{
while(true>
{
think(>。
wait(room>。
//请求进入房间进餐
wait(chopstick[i]>。
//请求左手边的筷子
wait(chopstick[(i+1>%5]>。
//请求右手边的筷子
eat(>。
signal(chopstick[(i+1>%5]>。
//释放右手边的筷子
signal(chopstick[i]>。
//释放左手边的筷子
signal(room>。
//退出房间释放信号量room
}
}
B.原理:
仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。
方法1:
利用AND型信号量机制实现:
根据课程讲述,在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。
当某些资源不够时阻塞调用进程。
由于等待队列的存在,使得对资源的请求满足FIFO的要求,因此不会出现饥饿的情形。
tfnNhnE6e5
伪码:
semaphorechopstick[5]={1,1,1,1,1}。
voidphilosopher(intI>
{
while(true>
{
think(>。
Swait(chopstick[(I+1>]%5,chopstick[I]>。
eat(>。
Ssignal(chopstick[(I+1>]%5,chopstick[I]>。
}
}
方法2:
利用信号量的保护机制实现。
通过信号量mutex对eat<)之前的取左侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。
HbmVN777sL
伪码:
semaphoremutex=1。
semaphorechopstick[5]={1,1,1,1,1}。
voidphilosopher(intI>
{
while(true>
{
think(>。
wait(mutex>。
wait(chopstick[(I+1>]%5>。
wait(chopstick[I]>。
signal(mutex>。
eat(>。
signal(chopstick[(I+1>]%5>。
signal(chopstick[I]>。
}
}
28.在测量控制系统中的数据采集任务时,把所采集的数据送往一单缓冲区;计算任务从该单缓冲区中取出数据进行计算。
试写出利用信号量机制实现两任务共享单缓冲区的同步算法。
V7l4jRB8Hs
a.Varmutex,empty,full:
semaphore:
=1,1,0。
gather:
begin
repeat
……
gatherdatainnextp。
wait(empty>。
wait(mutex>。
buffer:
=nextp。
signal(mutex>。
signal(full>。
untilfalse。
end
compute:
begin
repeat
……
wait(full>。
wait(mutex>。
nextc:
=buffer。
signal(mutex>。
signal(empty>。
computedatainnextc。
untilfalse。
end
b.Varempty,full:
semaphore:
=1,0。
gather:
begin
repeat
……
gatherdatainnextp。
wait(empty>。
buffer:
=nextp。
signal(full>。
untilfalse。
end
compute:
begin
repeat
……
wait(full>。
nextc:
=buffer。
signal(empty>。
computedatainnextc。
untilfalse。
end
33.试比较进程间的低级通信工具与高级通信工具.
用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现,而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据。
83lcPA59W9
36.为什么要在OS中引入线程?
在OS中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。
在OS中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
mZkklkzaaP
38.试从调度性,并发性,拥有资源及系统开销方面对进程和线程进行比较.
a.调度性。
在传统的操作系统中,拥有资源的基本单位和独立调度、分派的基本单位都是进程,在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位;AVktR43bpw
b.并发性。
在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使OS具有更好的并发性;ORjBnOwcEd
c.拥有资源。
无论是传统的操作系统,还是引入了线程的操作系统,进程始终是拥有资源的一个基本单位,而线程除了拥有一点在运行时必不可少的资源外,本身基本不拥有系统资源,但它可以访问其隶属进程的资源;2MiJTy0dTT
d.开销。
由于创建或撤销进程时,系统都要为之分配和回收资源,如内存空间等,进程切换时所要保存和设置的现场信息也要明显地多于线程,因此,操作系统在创建、撤消和切换进程时所付出的开销将显著地大于线程。
gIiSpiue7A
第三章处理机调度与死锁
1.高级调度与低级调度的主要任务是什么?
为什么要引入中级调度?
高级调度的主要任务:
用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程,分配必要的资源,然后,再将新创建的进程插入就绪队列上,准备执行。
uEh0U1Yfmh
低级调度的主要任务:
用于决定就绪队列中的哪个进程应获得处理机,然后再由分派程序执行将处理机分配给该进程的具体操作。
IAg9qLsgBX
引入中级调度的主要目的:
是为了提高系统资源的利用率和系统吞吐量。
10.试比较FCFS和SPF两种进程调度算法
相同点:
两种调度算法都是既可用于作业调度,也可用于进程调度;
不同点:
FCFS调度算法每次调度都是从后备队列中选择一个或是多个最先进入该队列的作业,将它们调入内存,为它们分配资源,创建进程,然后插入到就绪队列中。
该算法有利于长作业/进程,不利于短作业/进程。
WwghWvVhPE
SPF调度算法每次调度都是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存中运行。
该算法有利于短作业/进程,不利于长作业/进程。
asfpsfpi4k
15.按调度方式可将实时调度算法分为哪几种?
按调度方式不同,可分为非抢占调度算法和抢占调度算法两种。
18.何谓死锁?
产生死锁的原因和必要条件是什么?
a.死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进;
b.产生死锁的原因有二,一是竞争资源,二是进程推进顺序非法;
c.必要条件是:
互斥条件,请求和保持条件,不剥夺条件和环路等待条件。
19.在解决死锁问题的几个方法中,哪种方法最易于实现?
哪种方法是资源利用率最高?
解决/处理死锁的方法有预防死锁、避免死锁、检测和解除死锁,其中预防死锁方法最容易实现,但由于所施加的限制条件过于严格,会导致系统资源利用率和系统吞吐量降低;而检测和解除死锁方法可是系统获得较好的资源利用率和系统吞吐量。
ooeyYZTjj1
20.请详细说明可通过哪些途径预防死锁?
a.摒弃"请求和保持"条件:
系统规定所有进程开始运行之前,都必须一次性地申请其在整个运行过程所需的全部资源,但在分配资源时,只要有一种资源不能满足某进程的要求,即使其它所需的各资源都空闲,也不分配给该进程,而让该进程等待;BkeGuInkxI
b.摒弃"不剥夺"条件:
系统规定,进程是逐个地提出对资源的要求的。
当一个已经保持了某些资源的进程,再提出新的资源请求而不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请;PgdO0sRlMo
c.摒弃"环路等待"条件:
系统将所有资源按类型进行线性排序,并赋予不同的序号,且所有进程对资源的请求必须严格按序号递增的次序提出,这样,在所形成的资源分配图中,不可能再出现环路,因而摒弃了"环路等待"条件。
3cdXwckm15
22.在银行家算法中,若出现下述资源分配情:
Process
Allocation
Need
Available
P0
0032
0012
1622
P1
1000
1750
P2
1354
2356
P3
0332
0652
P4
0014
0656
试问:
⑴该状态是否安全?
⑵若进程P2提出请求Request(1,2,2,2>后,系统能否将资源分配给它?
⑴该状态是安全的,因为存在一个安全序列。
下表为该时刻的安全序列表。
资源情况
进程
Work
Need
Allocation
Work+Allocation
Finish
P0
P3
P4
P1
P2
1622
1654
1987
19911
29911
0012
0652
0656
1750
2356
0032
0333
0014
1000
1354
1654
1987
19911
29911
3121417
true
true
true
true
true
⑵若进程P2提出请求Request(1,2,2,2>后,系统不能将资源分配给它,若分配给进程P2,系统还剩的资源情况为<0,4,0,0),此时系统中的资源将无法满足任何一个进程的资源请求,从而导致系统进入不安全状态,容易引起死锁的发生。
h8c52WOngM
第四章存储器管理
1.为什么要配置层次式存储器?
这是因为:
a.设置多个存储器可以使存储器两端的硬件能并行工作。
b.采用多级存储系统,特别是Cache技术,这是一种减轻存储器带宽对系统性能影响的最佳结构方案。
c.在微处理机内部设置各种缓冲存储器,以减轻对存储器存取的压力。
增加CPU中寄存器的数量,也可大大缓解对存储器的压力。
v4bdyGious
2.可采用哪几种方式将程序装入内存?
它们分别适用于何种场合?
将程序装入内存可采用的方式有:
绝对装入方式、重定位装入方式、动态运行时装入方式;绝对装入方式适用于单道程序环境中,重定位装入方式和动态运行时装入方式适用于多道程序环境中。
J0bm4qMpJ9
3.何为静态链接?
何谓装入时动态链接和运行时动态链接?
a.静态链接是指在程序运行之前,先将各自目标模块及它们所需的库函数,链接成一个完整的装