1、试画出下面条语句的前趋图:
S1:a=5-x; S2:b=a*x; S3:c=4*x; S4:d=b+c; S5:e=d+3。
S1->S2->S4->S5
......../
......S3
2、试利用 Bernstein 条件证明上题中的 S2 和 S3 语句是可以并发执行的,而 S3 和 S4 语句是不能并发执行的?
证明:
R(S2)={x,a}, W(S2)={b}, R(S3)={x}, W(S3)={c};
可见,S2 与 S3 的读集与写集两两不相交,S2 与 S3 的读集之间也不相交,因而,他们满足 Bernstein 条
件,S2 与 S3 语句是可以并发执行的。
同理可证 S3 和 S4 不能满足 Bernstein 条件,是不能并发执行的。
3、程序并发执行为什么会产生间断性?
因为程序在并发执行过程中存在相互制约性。
4、程序并发执行为何会失去封闭性和可再现性?
因为程序并发执行时,多个程序共享系统中的各种资源,资源状态需要多个程序来改变,即存在资源共享性使程序失去封闭性;而失去了封闭性导致程序失去可再现性。
5、在操作系统中为什么要引入进程概念?它会产生什么样的影响?
为了使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制和描述,而引入了进程概念。
影响:使程序的并发执行得以实行。
6、试从动态性,并发性和独立性上比较进程和程序?
A、动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只是一组有序指令的集合,是静态实体。
B、并发性是进程的重要特征,同时也是 OS 的重要特征。引入进程的目的正是为了使其程序能和其它进程的程序并发执行,而程序是不能并发执行的。
C、独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立的单位参加运行。
7、试说明 PCB 的作用?为什么说 PCB 是进程存在的唯一标志?
A、PCB 是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB 中记录了操作系统所需的用于描述进程情况及控制进程运行所需的全部信息。因而它的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能和其它进程并发执行的进程。
B、在进程的整个生命周期中,系统总是通过其 PCB 对进程进行控制,系统是根据进程的 PCB 而不是任何别的什么而感知到该进程的存在的,所以说,PCB 是进程存在的唯一标志。
8、试说明进程在三个基本状态之间转换的典型原因。
A、处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态变为执行状态。
B、当前进程因发生某事件而无法执行,如访问已被占用的临界资源,就会使进程由执行状态转变为阻塞状态。
C、当前进程因时间片用完而被暂停执行,该进程便由执行状态转变为就绪状态。
9、为什么要引入挂起状态?该状态具有哪些性质?
A、引入挂起状态处于 5 中需要:终端用户的需要,父进程的需要,操作系统的需要,对换的需要和负荷调节的需要。
B、处于挂起状态的进程不能接收处理机调度。
10 在进行进程切换时,所要保存的处理机状态信息主要有哪些?
A、进程当前暂存信息; B、下一条指令地址信息; C、进程状态信息; D、过程和系统调用参数及调用地址信息。
11 试说明引起进程创建的主要事件。
A、用户登陆; B、作业调度; C、提供服务; D、应用请求。
12 试说明引起进程撤消的主要事件。
A、正常结束; B、异常结束; C、外界干预;
13 在创建一个进程时,需完成的主要工作是什么?
A、操作系统发现请求创建新进程事件后,调用进程创建原语 Creat();
B、申请空白 PCB;
C、为新进程分配资源;
D、初始化进程控制块;
E、将新进程插入就绪队列。
14 在撤消一个进程时,需完成的主要工作是什么?
A、OS 调用进程终止原语;
B、根据被终止进程的标志符,从 PCB 集合中检索出该进程的 PCB,从中读出该进程的状态;
C、若被终止进程正处于执行状态,应立即中止该进程的执行,并设置调度标志为真;
D、若该进程还有子孙进程,还应将其所有子孙进程予以终止;
E、将该进程所拥有的全部资源,或者归还给其父进程,或者归还给系统;
F、将被终止进程(它的 PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。
15 试说明引起进程阻塞或被唤醒的主要事件是什么?
A、请求系统服务;
B、启动某种操作;
C、新数据尚未到达;
D、无新工作可做。
16 试从调度性,并发性,拥有资源及系统开销几个方面,对进程和线程进行比较。
A、在引入线程的 OS 中,把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位;
B、在引入线程的 OS 中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,亦可并发执行,因而使 OS 具有更好的并发性;
C、进程始终是拥有资源的一个独立单位,线程自己不拥有系统资源,但它可以访问其隶属进程的资源;
D、在创建,撤消和切换进程方面,进程的开销远远大于线程的开销。
17 什么是用户级线程和内核级线程?并对它们进行比较。
A、内核级线程是依赖于内核的,它存在于用户进程和系统进程中,它们的创建,撤消和切换都由内核实现;
---用户级线程仅存在于用户级中,它们的创建,撤消和切换不利用系统调用来实现,因而与内核无关,内核并不知道用户级线程的存在。
B、内核级线程的调度和切换与进程十分相似,调度方式采用抢占式和非抢占式,调度算法采用时间轮转法和优先权算法等,当由线程调度选中一个线程后,再将处理器分配给它;而用户级线程通常发生在一个应用程序的诸线程之间,无需终端进入 OS 内核,切换规则也较简单,因而,用户级线程的切换速度较快。
---用户级线程调用系统调用和调度另一个进程执行时,内核把它们看作是整个进程的行为,内核级线程调用是以线程为单位,内核把系统调用看作是该线程的行为。
---对于用户级线程调用,进程的执行速度随着所含线程数目的增加而降低,对于内核级线程则相反。
18 在 Solaris OS 中,设置了哪几种线程?轻型线程的作用是什么?
A、用户级线程,内核级线程和轻型线程;
B、作用:由 LWP 实现了在内核与用户级线程之间的隔离,从而使用户级线程与内核无关。
19 在 Solaris OS 中,用户级线程是通过什么方式来访问内核的?
通过 LWP 来访问内核。 LWP 可为内核所识别,但不能识别用户级线程,通过建立用户级线程与 LWP 之间的
连接,可以实现用户级线程与内核的通信。
1、什么是临界资源和临界区?
A、一次仅允许一个进程使用的资源成为临界资源。
B、在每个进程中,访问临界资源的那段程序称为临界区。
2、为什么进程在进入临界区之前,应先执行"进入区"代码,在退出临界区后又执行"退出区"代码?
为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志,如果正被访问,则本进程不能进入临界区,实现这一功能的代码成为"进入区"代码;在退出临界区后,必须执行" 退出区"代码,用于恢复未被访问标志。
3、同步机构应遵循哪些基本准则?为什么?
答: 1.空闲让进:当无进程处于临界区内时,必须让一个要求进入临界区的进程立即进入,以有效地利用临界资源。
2.忙则等待:已有进程进入临界区,则其他试图进入自己临界区的进程必须等待。
3.有限等待:对要求进入临界区的进程,应在有限时间内使之进入。
4.让权等待:等待进入临界区的进程,必须让出CPU。
4、试从物理概念上来说明记录型信号量和 wait 和 signal 操作?(有待讨论)。
5、你认为整型信号量机制和记录型信号量机制,是否完全遵循了同步机构的四条准则?
A、在整型信号量机制中,未遵循"让权等待"的准则。
B、记录型信号量机制完全遵循了同步机构的"空闲让进,忙则等待,有限等待,让权等待"四条准则。
6、在生产者-消费者问题中,如果缺少了 signal(full)或 signal(empty),对执行结果会有何影响?
生产者-消费者问题可描述如下:
var mutex,empty,full:semaphore:=1,n,0;
buffer:array[0,...,n-1] of item;
in,out:integer:=0,0;
begin
parbegin
producer:begin
repeat
produce an item in nextp;
wait(empty);
wait(mutex);
buffer(in):=nextp;
in:=(in+1) mod n;
signal(mutex);
/* ************** */
signal(full);
/* ************** */
until false;
end
consumer:begin
repeat
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
/* ************** */
signal(empty);
/* ************** */
consume the item in nextc;
until false;
end
parend
end
可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱。而消费者始终因 wait(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待。
7、在生产者-消费者问题中,如果将两个 wait 操作即 wait(full)和 wait(mutex)互换位置;或者是将signal(mutex)与 signal(full)互换位置结果会如何?
var mutex,empty,full:semaphore:=1,n,0;
buffer:array[0,...,n-1] of item;
in,out:integer:=0,0;
begin
parbegin
producer:begin
repeat
.
.
produce an item in nextp;
.
.
wait(empty);
wait(mutex);
buffer(in):=nextp;
in:=(in+1) mod n;
/* ***************** */
signal(full);
signal(mutex);
/* ***************** */
until false;
end
consumer:begin
repeat
/* **************** */
wait(mutex);
wait(full);
/* **************** */
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
consume the item in nextc;
until false;
end
parend
end
A、wait(full)和 wait(mutex)互换位置后,因为 mutex 在这儿是全局变量,执行完 wait(mutex),则 mutex 赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex 为 0 而进行等待,使 full 始终为 0,这样就形成了死锁。
B、而 signal(mutex)与 signal(full)互换位置后,从逻辑上来说应该是一样的。
8、我们为某临界区设置一把锁 W,当 W=1 时,表示关锁;W=0 时,表示锁已打开。试写出开锁原语和关锁原语,并利用它们去实现互斥。
开锁原语:
unlock(W):
W=0;
关锁原语:
lock(W);
if(W==1) do no_op;
W=1;
利用开关锁原语实现互斥:
var W:semaphore:=0;
begin
parbegin
process :
begin
repeat
lock(W);
critical section
unlock(W);
remainder section
until false;
end
parend
9、试修改下面生产者-消费者问题解法中的错误:
producer:
begin
repeat
producer an item in nextp;
wait(mutex);
wait(full); /* 应为 wait(empty),而且还应该在 wait(mutex)的前面 */
buffer(in):=nextp;
/* 缓冲池数组游标应前移:in:=(in+1) mod n; */
signal(mutex);
/* signal(full); */
until false;
end
consumer:
begin
repeat
wait(mutex);
wait(empty); /* 应为 wait(full),而且还应该在 wait(mutex)的前面 */
nextc:=buffer(out);
out:=out+1; /* 考虑循环,应改为:out:=(out+1) mod n; */
signal(mutex);
/* signal(empty); */
consumer item in nextc;
until false;
end
10 试利用记录型信号量写出一个不会出现死锁的哲学家进餐问题的算法。
设初始值为 1 的信号量 c[I]表示 I 号筷子被拿(I=1,2,3,4,...,2n),其中 n 为自然数。
send(I):
Begin
if I mod 2==1 then
{
P(c[I]);
P(c[I-1 mod 5]);
Eat;
V(c[I-1 mod 5]);
V(c[I]);
else
{
P(c[I-1 mod 5]);
P(c[I]);
Eat;
V(c[I]);
V(c[I-1 mod 5]);
}
End
11 在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据
进行计算。试写出利用信号量机制实现两者共享单缓冲的同步算法。
int mutex=1;
int empty=n;
int full=0;
int in=0;
int out=0;
main()
{
cobegin
send();
obtain();
coend
}
send()
{
while(1)
{
. .
collect data in nextp;
. .
wait(empty);
wait(mutex);
buffer(in)=nextp;
in=(in+1) mod n;
signal(mutex);
signal(full);
}
}//send
obtain()
{
while(1)
{
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
culculate the data in nextc;
}//while
}//obtain
12 画图说明管程由哪几部分组成?为什么要引入条件变量?
管程由三部分组成:局部于管程的共享变量说明;对该数据结构进行操作的一组过程;对局部于管程的数据设置初始值的语句。
因为调用 wait 原语后,使进程等待的原因有多种,为了区别它们,引入了条件变量。
13 如何利用管程来解决生产者-消费者问题?(见 P82)
14 什么是 AND 信号量?试利用 AND 信号量写出生产者-消费者问题的解法。
为解决并行所带来的死锁问题,在 wait 操作中引入 AND 条件,其基本思想是将进程在整个运行过程中所需要的所有临界资源,一次性地全部分配给进程,用完后一次性释放。解决生产者-消费者问题可描述如下:
var mutex,empty,full:semaphore:=1,n,0;
buffer:array[0,...,n-1] of item;
in,out:integer:=0,0;
begin
parbegin
producer:begin
repeat
. .
produce an item in nextp;
. .
wait(empty);
wait(s1,s2,s3,...,sn); //s1,s2,...,sn 为执行生产者进程除 empty 外其余的条件
wait(mutex);
buffer(in):=nextp;
in:=(in+1) mod n;
signal(mutex);
signal(full);
signal(s1,s2,s3,...,sn);
until false;
end
consumer:begin
repeat
wait(full);
wait(k1,k2,k3,...,kn); //k1,k2,...,kn 为执行消费者进程除 full 外其余的条件
wait(mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
signal(mutex);
signal(empty);
signal(k1,k2,k3,...,kn);
consume the item in nextc;
until false;
end
parend
end
15 在单处理机环境下,进程间有哪几种通信方式?
A、共享存储器系统通信方式; B、消息传递系统通信方式; C、管道通信方式.
16 试比较进程间的低级通信工具与高级通信工具。
用户用低级通信工具实现进程通信很不方便,因为其效率低,通信对用户不透明,所有的操作都必须由程序员来实现。 而高级通信工具则可弥补这些缺陷,用户可直接利用操作系统所提供的一组通信命令,高效地传送大量的数据。
17 消息队列通信机制应有哪几方面功能? 略
18 试比较消息队列与管道通信机制。
A、所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称 pipe 文件。 管道通信是属于共享存储器系统的。
B、消息队列通信机制属于消息传递系统通信机制,存在通信链路,有消息的格式,有若干缓冲队列,采用独特的发送原语和接收原语。
1、高级调度与低级调度的主要任务是什么?为什么要引入中级调度?
A、作业调度又称宏观调度或高级调度,其主要任务是按一定的原则对外存上处于后备状态的作业进行选择,给选中的作业分配内存,输入输出设备等必要的资源,并建立相应的进程,以使该作业的进程获得竞争处理机的权利。
B、进程调度又称微观调度或低级调度,其主要任务是按照某种策略和方法选取一个处于就绪状态的进程,将处理机分配给它。
C、为了提高内存利用率和系统吞吐量,引入了中级调度。
2、在作业调度中需做出哪两个决定?
A、接纳多少个作业; B、接纳哪些作业。
3、在剥夺调度方式中,有哪些剥夺原则?
A、时间片原则; B、优先权原则; C、短作业(进程)优先原则。
4、在 OS 中引起进程调度的主要因素有哪些?(有待讨论)
5、选择调度方式和调度算法时,应遵循的准则是什么?
A、面向用户的准则有周转时间短,响应时间快,截止时间的保证,以及优先权准则。
B、面向系统的准则有系统吞吐量高,处理机利用率好,各类资源的平衡利用。
6、在批处理系统,分时系统和实时系统中,各采用哪几种进程(作业)调度算法?(有待讨论)
7、为什么说多级反馈队列能较好地满足各种用户的需要?
A、对于终端型作业用户,由于终端型作业用户所提交的作业,大都属于交互型作业,系统只要能使这些作业(进程)在第一队列所规定的时间片内完成,便可使终端型作业用户都感到满意。
B、对于短批处理作业用户,很短的批处理型作业如果仅在第一队列中执行一个时间片即可完成,便可获得与终端型作业一样的相应时间。对于稍长的作业,通常也只需在第二队列和第三队列中各执行个时间片即可完成,其周转时间仍然很短。
C、对于长批处理作业用户,用户也不必担心其作业长期得不到处理。
8、在按时间片轮转调度算法中,在确定时间片的大小时,应考虑哪些因素?
A、系统对相应时间的要求; B、就绪队列中进程的数目; C、系统的处理能力。
9、为实现实时调度,对实时系统提出了哪些要求?
A、要提供必要的调度信息; B、在调度方式上要具体情况具体分析; C、要具有快速响应外部中断的能力; D、快速任务分派。
10 目前常用的调度方式和算法,能否应用到实时系统中?
A、对于时间片轮转调度算法,是一种常用于分时系统的调度算法;
B、对于非抢占式优先权调度算法,可用于要求不太严格的实时控制系统中;
C、对于基于时钟中断抢占的优先权调度算法,有很好的响应效果,可用于大多数的实时系统中;
D、对于立即抢占(Immediate Preemption)的优先权调度,要求操作系统具有快速响应外部时间的能力。
11 在多处理机系统中,比较有代表性的线程调度方式有哪几种?
A、自调度方式; B、成组调度; C、专用处理机分配调度方式。
12 试比较自调度和成组调度?
A、自调度方式是系统中有一个公共的线程或进程的就绪队列,所有的处理机在空闲时,都可自己从该队列中取出一个进程或线程运行;
B、成组调度是由系统将一组相关的进程或线程,同时分配到一组处理机上运行,进程或线程与处理机一 一对应;
C、在一般情况下,成组调度的性能优于自调度,因为自调度存在瓶颈,低效,线程切换频繁等问题,而成组调度可减少线程的切换和调度的开销,因而目前得到了广泛的认可。
13 在 OS/2 中采用哪种调度方式和调度算法?
在 OS/2 中采用的是抢占式调度方式,多优先级的抢占式调度算法。
14 何谓死锁?产生死锁的原因和必要条件是什么?
A、死锁是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进;
B、产生死锁的原因有二,一是竞争资源,二是进程推进顺序非法;
C、必要条件是:互斥条件,请求和保持条件,不剥夺条件和环路等待条件。
15、在解决死锁问题的几个方法中,哪种方法最易于实现?哪种方法使资源利用率最高?
答:A、解决死锁可归纳为四种方法:静态策略:设计合适的资源分配算法(如有序资源分配法),否定四个必要条件之一,不让死锁发生(预防死锁),动态策略:避免死锁(银行家算法),检测死锁和解除死锁让(死锁发生);
16 请详细说明可通过哪些途径预防死锁?
答:在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一。
A、摈弃"请求和保持"条件,要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配。
B、摈弃"不剥夺"条件,就是已经保持了资源的进程,当它提出新的资源请求而不能立即得到满足时,必须释放它已经保持的所有资源,待以后需要时再重新申请;
C、摈弃"环路等待"条件—采用资源有序分配法,就是将所有资源按类型排序标号,所有进程对资源的请求必须严格按序号递增的次序提出。
17 在银行家算法的例子中,如果 P0 发出的请求向量由 Request0(0,2,0)改为 Request0(0,1,0),问系统可否将资源分配给它?
可以。
首先,Request0(0,1,0)<=Need0(7,4,3), Request0(0,1,0)<=Available(2,3,0);分配后可修改得一资源数据表(表略),进行安全性检查,可以找到一个安全序列{P1,P4,P3,P2,P0},或{P1,P4,P3,P0,P2},因此,系统是安全的,可以立即将资源分配给 P0。
26、在银行家算法中,若出现下述资源分配情况:
Process Allocation Need Available
P 0 0032 0012 1622
P 1 1000 1750
P 2 1354 2356
P 3 0332 0652
P 4 0014 0656
试问: 1) 该状态是否安全?
2) 若进程 P 2 提出请求 Request ( 1 , 2 , 2 , 2 )后,系统能否将资源分配给它?
答:(1)
| Work | Need | Allocation | Work+Allocation
| Finish |
P0 | 1,6,2,2 | 0,0,1,2 | 0,0,3,2 | 1,6,5,4 | T |
P3 | 1,6,5,4 | 0,6,5,2 | 0,3,3,2 | 1,9,8,6 | T |
P1 | 1,9,8,6 | 1,7,5,0 | 1,0,0,0 | 2,9,8,6 | T |
P2 | 2,9,8,6 | 2,3,5,6 | 1,3,5,4 | 3,12,13,10 | T |
P4 | 3,12,13,10 | 3,12,13,10 | 0,0,1,4 | 3,12,14,14 | T |
有安全序列{P0,P3,P1,P2,P4},该状态安全。
解(2)
①、Request2(1,2,2,2) ≤Need2(2,3,5,6)
②、Request2(1,2,2,2) ≤ Available(1,6,2,2)
③、预分配资源,有:
Available:=Available (1,6,2,2) - Request2(1,2,2,2)=(0,4,0,0);
Allocation 2() := Allocation 2(1,3,5,4) + Request2(1,2,2,2)=(2,5,7,6);
Need2() := Need2(2,3,5,6) - Request2(1,2,2,2) = (1,1,3,4)
④、Available (0,4,0,0)不能满足任何进程的需要,无安全序列,该状态不安全,不能分配。
| Allocation | Need | Available |
P0 | 0,0,3,2 | 0,0,1,2 | 0,4,0,0 |
P1 | 1,0,0,0 | 1,7,5,0 |
|
P2 | 2,5,7,6 | 1,1,3,4 |
|
P3 | 0,3,3,2 | 0,6,5,2 |
|
P4 | 0,0,1,4 | 0,6,5,6 |
|