计算机操作系统作业二文档格式.docx
《计算机操作系统作业二文档格式.docx》由会员分享,可在线阅读,更多相关《计算机操作系统作业二文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
D.进程申请CPU得不到满足时,其状态变为阻塞
12.操作系统通过__B____对进程进行管理。
A.进程B.进程控制块C.进程启动程序D.进程控制区
13.假设一个进程拥有100个线程,这些线程属于用户级线程,它们在系统调度执行时间上占用的时间片个数是__A____。
A.1B.100C.1/100D.0
14.到其他3种状态的进程状态是__D____。
A.就绪B.阻塞C.完成D.执行
15.信号量的初值为2,当前值为-3,则表示等待进程有___C___。
A.1个B.2个C.3个D.5个
16.wait操作可能导致___C___。
A.进程就绪B.进程结束C.进程阻塞〔等待〕D.新进程创建
17.以下的进程状态变化中不可能发生的变化是___A___。
A.等待→运行B.运行→等待C.运行→就绪D.等待→就绪
18.如果有三个进程共享同一互斥段,而且每次最多允许两个进程进入该互斥段,则信号量的初值应设置为__C____。
A.3B.1C.2D.0
19.一个进程释放一种资源将有可能导致一个或几个进程___D___。
A.由就绪变运行B.由运行变就绪
C.由阻塞变运行D.由阻塞变就绪
20.进程控制块PCB不包括的内容是___D___。
A.CPU现场B.进程优先级C.进程运行状态D.文件缓冲区
21.PCB是描述进程状态和特性的数据结构,一个进程___D___。
A.可以有多个PCB B.可以和其他进程共用一个PCB
C.可以没有PCB D.只能有唯一的PCB
22.进程和程序的本质区别是___B___。
A.内存和外存B.动态和静态特征
C.共享和独占使用电脑资源D.顺序和非顺序执行指令
23.用于解决进程间互斥的方法是___B___。
①信号量及wait、signal操作②加锁与解锁③信箱方式
④消息缓冲方式⑤特权指令方式
A.③、④和⑤B.①和②C.①和③D.②和⑤
24.在操作系统中,每个进程具有独立性,进程之间又具有相互制约性。
对于任何两个并发进程,它们___C___。
A.必定无关B.必定相关C.可能相关D.可能相同
25.进程所请求的一次打印输出结束后,将使进程状态从__D____
A.运行态变为就绪态B.运行态变为等待态
C.就绪态变为运行态D.等待态变为就绪态
解析:
运行中的进程有3种状态:
运行状态、就绪状态和等待状态。
运行状态:
是指进程已获得CPU,并且在CPU中执行的状态。
就绪状态:
是指进程已具备运行条件,但由于没有获得CPU而不能运行所处的状态,一旦CPU分配给它,就可以运行。
等待状态:
是指进程因等待某种事件发生而暂时不能运行的状态。
例如,当两个进程竞争使用同一资源时,没有占用该资源的进程便处于等待状态。
它必须等到该资源被释放后才可以去使用它。
引起等待的原因一旦消失,进程就变为就绪状态,以便在适当的时候投入运行。
26.在下面的表达中,不正确的选项是__C___。
A.一个进程可创建一个或多个线程B.一个线程可创建一个或多个线程
C.一个线程可创建一个或多个进程D.一个进程可创建一个或多个进程
27.在下面的表达中正确的选项是___B___。
A.线程是比进程更小的能独立运行的基本单位
B.引入线程可提高程序并发执行的程度,可进一步提高系统效率
C.线程的引入增加了程序执行时时空开销
D.一个进程一定包含多个线程
线程是进程内一个相对独立的执行单元,但并不能单独运行,只能在程序中运行。
线程的引入减少了程序执行时的时空开销。
一个进程可包含一个或多个线程。
28.下面关于线程的表达中,正确的选项是__C____)。
A.不管是系统支持线程还是用户级线程,其切换都需要内核的支持
B.线程是资源的分配单位,进程是调度和分配的单位
C.不管系统中是否有线程,进程都是拥有资源的独立单位
D.在引入线程的系统中,进程仍是资源分配和调度分派的基本单位
引入线程后,进程仍然是资源分配的单位。
线程是处理器调度和分派的单位,线程本身不具有资源,它可以共享所属进程的全部资源
29.在下面的表达中,正确的选项是___D___。
A.引入线程后,处理机只在线程间切换
B.引入线程后,处理机仍在进程间切换
C.线程的切换,不会引起进程的切换
D.线程的切换,可能引起进程的切换
30.进程依靠__D____从阻塞状态过渡到就绪状态。
A.程序员的命令B.系统服务
C.等待下一个时间片到来D."
合作"
进程的唤醒
二、简答题
1.什么是线程?
进程和线程的关系是什么?
线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度实体。
在具有多线程机制的操作系统中,处理机调度的基本单位不是进程而是线程。
一个进程可以有多个线程,而且至少有一个可执行线程。
进程和线程的关系是:
(1)线程是进程的一个组成部分。
(2)进程的多个线程都在进程的地址空间活动。
(3)资源是分给进程的,而不是分给线程的,线程在执行中需要资源时,系统从进程的资源分配额中扣除并分配给它。
(4)处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。
(5)线程在执行过程中,需要同步。
2.进程能自己将自己唤醒吗?
进程能自己将自己撤销吗?
唤醒进程和撤消进程都是要通过CPU上运行程序来实现的。
一个进程入睡了,它就不可能被调度到CPU上运行;
一个进程在撤消前必须先进入终止状态,而处于终止状态的进程不可能被调度到CPU上运行。
因此,进程被唤醒、被撤消都不能由自己来完成,只能由别的进程实现。
3.父进程创建子进程之后,父子进程间的关系是什么?
一个进程创建子进程之后,进程与产生的进程之间的关系是父子关系,分别称为父进程和子进程。
子进程一经产生就与父进程并发执行,子进程共享父进程的正文段和已经打开的文件。
4.简述引进线程的好处。
(1)以线程作为系统调度的基本单位,减少了系统的时空开销。
以进程为系统调度的基本单位的系统中,进程的切换是很频繁的。
在切换中由于要保留当时的运行环境,还要设置新选中的进程的运行环境,这既花费了处理机的时间,又增加了主存的空间,从而也限制了系统进程的数量和进程的切换速度。
(2)引进线程提高了系统的并行能力。
线程作为进程内的一个可执行实体,减少了并行粒度。
线程作为调度的基本单位而不是资源分配的基本单位,调度更为容易,而且采用线程提高系统的并行能力比采用进程更为有效。
(3)同一进程的线程共享进程的用户地址空间,所以同一进程的线程间的通信更容易实现。
5.当一个进程的父进程被撤销时,该进程是撤销好还是不撤销好?
在实际系统中,两种处理方法都是可行的,且各有优缺点。
假设撤消,则该进程的任务可能还没有完成,这显然是不利的,特别是当该进程的运行结果对其他进程的运行很重要(如该进程是其他进程的前趋进程,没有它的运行结果其他进程无法运行)时;
假设不撤消,则该进程又可能成为不可控的"
孤儿"
,从而产生不可预测的结果。
比较好的做法是,当一个进程的父进程被撤消时,可以将该进程"
过继"
给系统内一个级别较高的进程(如Unix中的1#进程),让它有一个"
新的父亲"
,这样既可以继续完成其任务又不会成为不可控的。
6.为什么说进程同步问题关系到OS的成败?
同步机制应遵循的准则是什么?
进程同步问题假设处理不当,有可能会产生种种"
与时间有关性错误"
,特别是当两个或多个进程共享了公共变量而又没有互斥地使用这些变量时,极有可能导致用户程序运行结果的不正确,这量种灾难性的后果。
这种OS显然是不成功的,是用户不敢使用的。
有以下四条准则:
空闲让进、忙则等待、有限等待、让权等待。
7.进程之间存在哪几种相互制约关系?
各是什么原因引起的?
以下活动分别属于哪种制约关系?
〔1〕假设干同学去图书馆借书。
〔2〕两队举行篮球比赛。
〔3〕流水线生产的各道工序。
〔4〕商品生产和消费。
进程间存在着两种相互制约的关系:
直接制约关系〔即同步问题〕和间接制约关系〔即互斥问题〕。
同步问题是存在逻辑关系的进程之间相互等待产生的制约关系,互斥问题是相互无逻辑关系的进程间竞争使用相同的资源所发生的制约关系。
〔1〕属于互斥关系,因为书的个数是有限的,一本书只能借给一个同学。
〔2〕属于互斥关系,篮球只有一个,两队都要争夺。
〔3〕属于同步关系,各道工序的开始都依赖前道工序的完成。
〔4〕属于同步关系,商品没生产出来,消费无法进行,商品未消费完,生产也无需进行。
8.试比较说明进程和程序的区别有哪些?
〔1〕每个进程实体中包含了程序段和数据段这两个部分,因此说进程是与程序是紧密相关的。
但从结构上看,进程实体中除了程序段和数据段外,还必须包含一个数据结构,即进程控制块PCB。
〔2〕进程是程序的一次执行过程,因此是动态的;
动态性还表现在进程由创建而产生、由调度而执行、由撤消而消亡,即它具有一定的生命周期。
而程序则只是一组指令的有序集合,并和永久地存放在某种介质上,其本身不具有运动的含义,因此是静态的。
〔3〕多个进程实体可同时存放在内存中并发地执行,也正是引入进程的目的。
而程序〔在没有为它创建进程时〕的并发执行具有不可再现性,因此程序不能正确地并发执行。
〔4〕进程是一个能够独立运行、独立分配资源和独立接受调度的基本单位。
而因程序不具有PCB,所以它是不可能在多道程序环境下独立运行的。
〔5〕程与程序不一一对应。
同一个程序的多次运行,将形成多个不同的进程;
同一个程序的一次执行也可以产生多个进程;
而一个进程也可以执行多个程序
三、应用题
1.有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子。
如果没有顾客,则理发师便在理发椅子上睡觉;
当一个顾客到来时,必须唤醒理发师,进行理发;
如果理发师正在理发时,又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。
为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件。
#defineCHAIRS/*为等候的顾客准备的椅子数*/
semaphorecustomers=0;
semaphorebarbers=0;
semaphoremutex=1;
/*用于互斥*/
intwaiting=0;
voidcustomers()
{
wait(mutex);
if(waiting<
CHAIRS)
waiting=waiting+1;
signal(mutex):
signal(customers);
坐下等待;
wait(barbers);
}
else
signal(mutex);
voidbarber()
while
(1)
wait(customers);
waiting=waiting-1;
理发;
signal(barbers);
2.计算进程PC和打印进程P01、P02共享一个单缓冲区,计算进程负责计算,并把计算结果放入单缓冲中;
打印进程P01、P02则负责从单缓冲中取出计算结果进行打印,而且对每个计算结果,P01和P02都需分别打印一次。
请用记录型信号量描述上述进程间的同步关系。
为了实现计算进程和打印进程之间的同步,并使单缓冲中的每个计算结果都被两个打印进程分别打印一次。
可设置四个信号量:
full1表示缓冲中是否有可供P01打印的计算结果,full2表示缓冲中是否有可给P02打印的计算结果;
emptypl、empty2则表示计算结果是否已被P01l、P02取走,只有当一个结果被两个打印进程都取走后,缓冲区才变空,计算进程才可将下一个计算结果放入单缓冲。
相应的同步算法可描述如下:
semaphoreempty1=1,enpty2=1,full1=0,full2=0;
PC:
While
(1)
computrtnextnumber;
wait(empty1):
wait(empty2);
addthenumbertobufer;
signal(full1);
signal(full2);
P01:
wait(full1);
takefrombufer;
signal(emptyl):
printlastnumber;
P02:
wait(full2);
takefrombuffer;
signal(empty2);
3.设有三个进程,输入进程(input)、计算进程(compute)和输出进程(output),它们通过共享两个缓冲区buf1和buf2协作完成任务。
如以下图所示
三个进程之间的合作关系如下:
〔1〕输入进程使用put()函数把数据送到buf1,供计算进程调用calculate()函数计算;
〔2〕计算进程每次调用get()函数从buf1取出已输入的可计算的数据进行计算,并把计算结果使用put()函数把数据送到buf2送入buf供输出进程打印;
〔3〕输出进程调用get()函数把buf2中的数据使用print〔〕函数输出。
定义合适的信号量,并用伪代码完成实现过程。
信号量:
nonf1、none1:
输入进程与计算进程同步,buf1是否为空;
nonf2、none1:
计算进程与输出进程同步,buf2是否为空;
s1、s2:
分别互斥使用buf1和buf2
procedureinput
while
(1)
wait(nonf1)
wait(s1)
put(data);
signal(s1);
signal(none1);
}
procedurecompute
wait(none1);
wait(s1);
data=get();
data=calculate(data);
signal(s1);
signal(nonf1);
wait(nonf2);
wait(s2);
put(data);
signal(s2);
signal(none2);
procedureoutput
wait(none2);
print(data);
signal(nonf2);
4.下面给出的两个进程互斥的算法是安全的吗?
为什么?
#definetrue;
#definefalse;
Intflag[2];
flag[1]=flag[2]=false;
enter-crtsec(i)
inti;
{
While(flag[1-i])
flag[i]=true;
leave-crtsec(i)
Inti;
flag[i]=false;
processI;
…
Enter-crtsec(i);
Incriticalsection;
Leave-crtsec(i);
从概念上讲,系统中各进程在逻辑上是独立的,它们可以按各自的速度向前推进。
但由于它们共享某些临界资源,因而产生了临界区问题。
对于具有临界区问题的并发进程,它们之间必须互斥,以保证不会同时进入临界区。
这种算法不是安全的。
因为,在进入临界区的enter-crtsec〔〕不是一个原语操作,如果两个进程同时执行完其循环〔此前两个flag均为false〕,则这两个进程可同时进入临界区。
5.进程A1,A2,…,An通过K个缓冲区向进程B1,B2,…,Bm不断地发送消息。
发送和接收工作遵循如下规则:
(1)每个发送进程一次发送一个消息,写入缓冲区,缓冲区大小与消息长度一致;
(2)对每个消息,B1,B2,…,Bm都需接收一次,读入各自的数据区内;
(3)K个缓冲区都满时,发送进程等待,没有可读的消息时,接收进程等待。
试用wait和signal原语操作组织正确的发送和接收操作。
生产者-消费者问题的一个变形,一组生产者A1,A2....,An和一组消费者B1,B2,...,Bm共用k个缓冲区,每个缓冲区只要写一次,但需要读m次。
因此,我们可以把这一组缓冲区看成m组缓冲区,每个发送者需要同时写m组缓冲区中相应的m个缓冲区,而每一个接收者只需读它自己对应的那组缓冲区中的对应单元。
设置一个信号量mutex实现诸进程对缓冲区的互斥访问;
两个信号量数组empty[m]和full[m]描述m组缓冲区的使用情况。
mutex的初值为l,数组empty中元素初值为k,数组full中的元素初值为0。
其同步关系描述如下:
intmutex,empty[m],full[m];
inti;
mutex=1;
for(i=0;
i<
=m-1;
i++)
empty[i]=k;
full[i]=0;
main()
cobegin
A1();
A2();
…
An();
B1();
B2();
Bm();
coend
send()/*发送消息*/
ini;
for(i=0;
wait(empty[i]);
wait(mutex);
将消息放入缓冲区;
signal(mutex);
signal(full[i]);
receive(i)/*接收消息*/
wait(full[i]);
将消息从缓冲区取出;
signal(empty[i]);
Ai()/*因发送进程A1,A2,...,An的程序类似。
这里只给出进程Ai的描述。
*/
send();
Bi()/*因接收进程B1,B2,…,Bm的程序类似这里只给出进程Bi的描述*/
recive(i);