1、进程的概念,进程与程序(作业)的区别
进程是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体。
进程实体:为使程序(含数据)能独立运行,应为之配置一进程控制块,即PCB;而由程序段、相关的数据段和PCB三个部分便构成了进程实体。进程的实质是进程实体的一次执行过程。
进程和程序区别:
(1)进程是一个动态概念,强调执行的过程,每个进程中包含了程序段和数据段两个部分,以及进程控制块PCB;而程序是一个静态概念,程序是指令的有序集合,无执行含义; (2)进程具有并行特征(独立性,异步性),程序则没有; (3)一个进程可以执行多个程序(如Linux中通过exec调用),同一程序的多次执行将产生多个不同的进程。同一个程序的一次执行也可产生多个进程(如在程序中多次调用Linux中的fork)。
进程和作业的区别在于:
一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。作业是用户需要计算机完成某项任务,而要求计算机所做工作的集合。一个作业的完成要经过作业提交、作业收容、作业执行和作业完成四个阶段。而进程是已提交完毕的程序所执行过程的描述,是资源分配的基本单位。其主要区别关系如下:
(1)作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业之后,系统将它放入外存中的作业等待队列中等待执行;而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中; (2)一个作业可由多个进程组成。且必须至少由一个进程组成,但反过来不成立; (3)作业的概念主要用在批处理系统中,像UNIX这样的分时系统中,则没有作业的概念;而进程的概念则用在几乎所有的多道程序系统中。
2、什么是PCB,PCB包含的主要信息,PCB的作用,为什么说PCB是进程存在的唯一标志?
为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block)。
PCB中主要包括下述四方面的信息:
进程标识符:内部标识符,外部标识符 处理机状态 进程调度信息 进程控制信息
PCB的作用:
① PCB是系统只为每个进程定义的一个数据结构,是为了使程序(含数据)能独立运行,为之配置的一进程控制块(Process Control Block); ② PCB、程序段和相关的数据段三部分构成了进程实体,创建进程,实质上是创建进程和实体中的PCB,而撤销进程,实质上是撤销进程的PCB;PCB是为了保证程序的并发执行; ③ PCB使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。
PCB****是进程存在的唯一标示,是因为: ① 在调度到某进程后,要根据其PCB中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存地址,找到其程序和数据;进程在执行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也都需要访问PCB:当进程由于某种原因而暂停执行时,又需将器断点的处理机环境保存在PCB中。可见,在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的。所以PCB是进程存在的唯一标志。
3、进程的3种基本状态,状态间的转换以及引起状态转换的原因
进程的三种基本状态:就绪状态,执行状态,阻塞状态 还存在两种比较常见的进程状态,即创建状态和终止状态 (1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2) 执行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。(时间片用完)
(3) 执行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。(I/O请求)
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。(I/O完成)
4、什么是临界资源,什么是临界区
临界资源是指每次仅允许一个进程访问的资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。
每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
5、进程间的两种相互制约关系(同步、互斥)的概念(是进程间的低级通信),并举例说明。
进程间的两种相互制约关系: 进程同步(直接相互制约关系):
它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。在多道环境下,这种进程间在执行次序上的协调是必不可少的。
举例:有输入进程A 通过单缓冲向进程B 提供数据。当缓冲空时,计算进程因不能获得所需数据而阻塞,当进程A 把数据输入缓冲区后,便唤醒进程B;反之,当缓冲区已满时,进程A 因没有缓冲区放数据而阻塞,进程B 将缓冲区数据取走后便唤醒A。
进程互斥(间接相互制约关系):
它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。
举例:有两进程A 和B,如果A 提出打印请求,系统已把唯一的 一台打印机分配给了进程B,则进程A 只能阻塞;一旦B 释放打印机,A 才由阻塞改为就绪。
6、什么是信号量,信号量值的含义是什么?
信号量是Dijkstra提出的用于解决进程同步的有效工具。信号量是一个数据结构以及对其的操作。除初始化外,仅能通过两个标准的原子操作wait(S)he signal(S)来访问。两个语句在执行到一半的时候不能被中断。
信号量值的含义是表示系统值某类资源的数目。
7、什么是P操作、什么是V操作(P、V操作的处理流程,以记录型信号量为例)
P(S):wait(S) 每次wait操作,意味着进程请求一个单位的该类资源,使系统可供分配的该类资源数减少一个。 ① 将信号量S的值减1,即S.value:=S.value-1; ② 当S.value<0时,表示该类资源分配完毕,进程调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表中。 V(S):signal(S) 每次signal操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个 ① 将信号量S的值加1,即S.value:=S.value+1; ② 如果S.value<=0,表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将链表中的第一个等待进程唤醒。
8、用信号量和P、V操作机制实现互斥和同步的方法,信号量取值的含义
利用信号量和PV操作实现进程互斥时应该注意的是: (1)每个程序中用户实现互斥的P,V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。 (2)P,V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。 (3)互斥信号量得初值一般为1 其中信号量S用于互斥,初值为1。 利用信号量和PV操作实现进程同步
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
使用PV操作实现进程同步时应该注意的是: (1)分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,那些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置那些信号量。 (2)信号量的初值与相应资源的数量有关,也与P,V操作在程序代码中出现的位置有关。 (3)同一信号量的P,V操作要成对出现,但他们分别在不同的进程代码中。
9、用P、V操作实现相互合作的两个进程间的同步、为共享临界资源的互斥
10、什么是进程的(高级)通信,当前有哪几种高级通信机制?
进程通信,是指进程之间的信息交换,其所交换的信息量少者是一个状态或数值,多者则是成千上万个字节。高级进程通信,是指用户可直接利用操作系统所提供的一组通信命令高效地传送大量数据的一种通信方式。
高级通信机制可归结为三大类: (1)共享存储器系统
a、基于共享数据结构的通信方式 b、基于共享存储区得通信方式
(2)消息传递系统 (3)管道通信系统。
11、消息传递通信的两种实现方法
(1)直接通信方式 发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。 (2)间接通信方式 进程之间的通信需要通过作为共享数据结构的实体。
12、试写出相应的程序来描述图2-17所示的前驱图。
[caption id=“attachment_576” align=“alignleft” width=“245” caption=“进程管理相关内容”][/caption] [caption id=“attachment_577” align=“alignleft” width=“261” caption=“进程管理相关内容”][/caption] 第一个图:
Var a, b, c, d, e, f, g, h; semaphore:= 0, 0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal©; signal(d); end;
begin wait(b); S3; signal(e); end;
begin wait©; S4; signal(f); end;
begin wait(d); S5; signal(g); end;
begin wait(e); S6; signal(h); end;
begin wait(f); wait(g); wait(h); S7; end;
parend
end
第二个图:
Var a, b, c, d, e, f, g, h,i,j; semaphore:= 0, 0, 0, 0, 0, 0, 0,0,0, 0;
begin
parbegin
begin S1; signal(a); signal(b); end;
begin wait(a); S2; signal©; signal(d); end;
begin wait(b); S3; signal(e); signal(f); end;
begin wait©; S4; signal(g); end;
begin wait(d); S5; signal(h); end;
begin wait(e); S6; signal(i); end;
begin wait(f); S7; signal(j); end;
begin wait(g);wait(h); wait(i); wait(j); S8; end;
parend
end
13、试画出下面四条语句的前驱图:
S1 : a := x + y; S2 : b := z + 1; S3 : c := a – b; S4 : w := c + 1;
[caption id=“attachment_612” align=“aligncenter” width=“231” caption=“进程管理”][/caption]
14、程序并发执行时为什么会失去封闭性和可再现性?
程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行换去了封闭性,这样,某程序在执行时,必然会受到其它程序的影响。程序在并发执行时,由于失去了封闭性,也将导致其再失去可再现性。
15、在进行进程切换时,所要保存的处理机状态信息有哪些?
a. 进程当前暂存的所有信息 b. 下一条指令的地址 c. 进程当前的状态信息 d. 过程和系统调用参数及调用地址信息
16、同步机构应遵循哪些基本准则?为什么?
同步机构应遵循以下四准则:空闲让进、忙则等待、有限等待、让权等待 遵循上述四准则,可以实现进程互斥地进入到自己的临界区
17、试修改下面生产者–消费者问题解法中的错误:
producer:
begin
repeat
…
produce an item in nextp;
wait(mutex);
wait(full);
buffer(in):=nextp;
signal(mutex);
until false;
end
consumer:
begin
repeat
wait(mutex);
wait(empty);
nextc:=buffer(out);
out:=out+1;
signal(mutex);
consume item in nextc;
until false;
end
producer: wait(full); //这里应为wait(empty),并把这条语句放在wait(mutex)的前面,否则会出现死锁; buffer(in):=nextp; //缓冲池数组游标应该前移,所以在该语句后面要加上:in:=(in + 1) mod n; signal(mutex); //在该语句后面加上signal(full); consumer: wait(empty); //应为wait(full),并放在wait(mutex)的前面,否则会出现死锁; out:=out+1 //考虑循环,应该改为:out:=(out+1) mod n; signal(mutex) //在该语句后面加上signal(empty);
18、在测量控制系统中的数据采集任务,把所采集的数据送一单缓冲区;计算任务从该单缓冲中取出数据进行计算。试写出利用信号量机制实现两者共享单缓冲的同步算法。
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