第二章 进程的描述与控制

2019-07-14 12:21发布

一、名词解释1.进程上下文进程执行活动全过程的静态描述。 包括计算机中与执行该进程有关的各寄存器的值、程序段在经过编译之后形成的机器指令代码集(正文段)、数据集、各种堆栈和PCB结构。* 进程控制块PCB中应包含信息:进程控制符,处理机状态,进程调度信息,进程控制信息。2.直接制约一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程执行速度的过程。3.临界区每个进程中访问临界资源的那段程序代码。4.进程同步进程同步是指一组并发进程由于相互合作,共同完成某种任务,因而相互等待,使得各进程按一定的速度执行的过程。5.内核线程由操作系统完成创建和撤销,用来执行一个指定的函数线程。二、选择题1.进程的三个基本状态是(阻塞)、(就绪)、(执行)。由(就绪)到(执行)是由进程调度所引起的;由(执行)到(阻塞)是正在执行的进程发生了某事件,使之无法继续执行而引起的。2.在一个单处理机系统中,存在n个进程,则最多有(n-1)个进程处于就绪队列,(n)个进程处于阻塞状态。3.在分时系统中,导致进程创建的典型事件是(用户登陆);在批处理系统中,导致进程创建的典型事件是(作业调度);由系统专门为运行中的应用进程创建新进程的事件是(提供服务)。在创建进程时,(为进程分配CPU)不是创建所必需的步骤。A:(1)用户注册;(2)用户登录;(3)用户记账;(4)用户通信。B:(1)作业录入;(2)作业调度;(3)进程调度;(4)中级调度。C:(1)分配资源;(2)进程通信;(3)共享资源;(4)提供服务。D:(1)为进程建立PCB;(2)为进程分配内存等资源;(4)将进程插入就绪队列。4.在生产者—消费者问题中,应设置互斥信号量mutex、资源信号量full和empty。它们的初值应分别是(1)、(0)和(+n)。5.下面的叙述中,正确的一条是(信号量的初值不能为负数)。(1)一个进程的状态发生变化总会引起其他一些进程的状态发生变化。(2)进程被挂起后,状态变为阻塞状态。(3)信号量的初值不能为负数。(4)在进程对应的代码中使用wait、signal操作后,可以防止系统死锁。三、填空题1.进程特征包括其结构特征、并发性、(动态性)、独立性和(异步性)。2.若进程的用户程序段在执行时,该进程处于(用户态),也称为(目态)。3.PCB中包含有进程的描述信息、(控制信息)以及(资源信息),是进程动态特征的集中反映。4.进程空间分为用户空间和(系统空间)。5.在比较进程和程序时,进程是(动态)的概念,而程序是(静态)的概念。* 进程和程序区别6.由共享公有资源而造成的对并发进程执行速度的制约称为(资源共享)。7.进程同步机制应遵循的原则包括(空闲让进)、(忙则等待)、(有限等待)和(让权等待)。8.进程通信包括(共享存储器)、(管道)和(消息传递系统)三种方式。9.线程的基本状态包括(执行)状态、(就绪)状态和(阻塞)状态。* 线程管程客户机-服务器系统10.在间接通信方式中,进程之间的通信需要通过(消息邮箱)来暂时存放消息。四、判断题1.F)操作系统的一个重要概念是进程,不同进程所执行的代码也不同。2.F)操作系统通过PCB来控制和管理进程,用户进程可从PCB中读出与本身运行状态相关的信息。3.F)当进程由执行状态变为就绪状态时,CPU现场信息必须被保存在PCB中。4.F)当进程申请CPU得不到满足时,它将处于阻塞状态。5.T)管程每次只允许一个进程进入。6.Twaitsignal操作可以解决一切互斥问题。7.F)程序的顺序执行具有不可再现性。8.F)临界区是指进程中用于实现进程同步的那段代码。9.T)当某进程处于静止就绪状态时,该进程在外存。10.F)原语可以并发执行,并且其执行过程可以被中断。 五、问答题1. 在操作系统中,何为进程“忙等”和“饥饿”?它们分别有什么缺点?忙等是当临界资源忙碌,即正在被访问时,其他访问进程必须不断进行测试的状态。忙等的缺点是不符合让权等待的原则,造成处理机时间的浪费,同时很难将它们用于解决复杂的进程同步问题。饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。饥饿的缺点是等待时间过长造成处理机时间的浪费,同时给进程推进和响应带来明显影响。2. 试写出下图所示各个进程的前驱关系,并使用信号量机制(每一个前驱关系给一个信号量)设计程序执行所有进程。                                                           p1() {S1;signal(a); signal(b);}p2() {wait(a);S2; signal(c); signal(d);}p3() {wait(b);S3; signal(e);}p4() {wait(c);S4; signal(f);}p5() {wait(d);S5; signal(g);}p6() {wait(e);S6; signal(h);}p7() {wait(f);wait(g); wait(h); S7;}void main(){semaphore a, b,c, d, e, f, g, h;a.value =b.value= c.value =e.value =f.value =g.value = h.value =0;cobeginp1(); p2();p3(); p4(); p5(); p6(); p7();coend}3. 桌上有个能盛下5个水果的空盘子。父亲不停地向盘中放苹果或桔子,儿子不停地从盘中取出桔子,女儿不停地从盘中取出苹果。规定3人不能同时从盘中取放水果。试用信号量实现3人代表的进程之间的同步。semaphore empty= 5, orange = 0, apple = 0, mutex = 1;Dad() { while (1) { wait(empty);//如果先申请临界资源再申请空盘子,则可能出现申请临界资源成功却因为申请空盘子失败而阻塞,结果后面的进程想申请临界资源却无法申请而阻塞,造成连锁反应; wait(mutex); 将水果放入盘中; signal(mutex); if (放入的是桔子)  signal(orange);  else  signal(apple); }}Son() {  while (1) {    wait(orange);    wait(mutex);    从盘中取一个桔子;    signal(mutex);    signal(empty);    享用桔子;  }}Daughter() {  while (1) {    wait(apple);    wait(mutex);    从盘中取一个苹果;    signal(mutex);    signal(empty);    享用苹果;  }}void main(){cobeginDad(); Son();Daughter();coend}4. 3个进程PAPBPC协作解决文件打印问题,PA将文件记录从磁盘中读入内存的缓冲区1每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每次执行打印一个记录,缓冲区的大小与记录大小一样。请使用PV操作实现进程的同步。semaphoreempty1,full1,empty2,full2;
empty1=empty2=1;full1=full2=0;
process PA{
        while(1){
           
从输入设备上读信息;
            P(empty1);
           
将读入的信息放入缓冲区1;
            V(full1);
        }
    }
process PB{
        while(1){
            P(full1);
           
从缓冲区1中取出内容;
            V(empty1);
            P(empty2);
           
将缓冲区1中的内容复制到缓冲区2;
            V(full2);
        }
    }
process PC{
        while(1){
            P(full2);
           
从缓冲区2中取出内容;
            V(empty2);
           
打印内容;
        }
}
void main(){
cobeginPA(); PB();PC();coend}5. 嗜睡理发师问题:一个理发店有一个有N张沙发的等候室和一个放有1张理发椅的理发室组成,没有顾客理发师理发师便去睡觉,当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,该顾客就找一张空沙发坐下等待,如果理发师因无顾客正在睡觉,由新到的顾客唤醒理发师理发,在理发完成后,顾客必须付费收费后才能离开理发店,试用PV操作实现此同步问题。int count=0
semaphore mutex=1, sofa=N, empty=1, full=0, payment=0, receipt=0;
guest(){
P(mutex);
if(count
=N){
V(mutex);
离开理发店;
}
else{
count=count+1;
P(mutex);
if(count
1){P(sofa);
在沙发上就座;
P(empty);
从沙发上起来;
V(sofa);
}
else
唤醒理发师;
在理发椅上就座;
V(full);
理发;
付费;
V(payment);
P(receipt);
从理发椅上站起来;
V(empty);
P(mutex);
count=count-1;
V(mutex);
离开理发店;}}
barber(){
while(1){ P(full);
替顾客理发;
P(payment);
收费;
V(receipt);
}
}
void main(){
cobeginguest();barber();coend}