1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-11-06 07:07:43 +08:00

更新进程管理

This commit is contained in:
Didnelpsun
2021-08-18 23:10:06 +08:00
parent 12614c3a33
commit a1a0b210ab
4 changed files with 289 additions and 116 deletions

View File

@@ -411,6 +411,27 @@ $D.$可重入的程序代码
### 信号量
#### PV操作
**例题** 下列关于$PV$操作的说法中,正确的是()。
Ⅰ.$PV$操作是一种系统调用命令
Ⅱ.$PV$操作是一种低级进程通信原语
Ⅲ.$PV$操作是由一个不可被中断的过程组成
Ⅳ.$PV$操作是由两个不可被中断的过程组成
$A.$Ⅰ、Ⅲ
$B.$Ⅱ、Ⅳ
$C.$Ⅰ、Ⅱ、Ⅳ
$D.$Ⅰ、Ⅳ
解:$B$。$PV$操作是一种低级的进程通信原语,不是系统调用,因此Ⅱ正确;$Р$操作和$V$操作都属于原子操作,所以$PV$操作由两个不可被中断的过程组成,因此Ⅳ正确。
#### 信号量含义
**例题** 设与某资源关联的信号量初值为$3$,当前值为$1$。若$M$表示该资源的可用个数,$N$表示等待该资源的进程数,则$M$,$N$分别是()。
$A.0,1$
@@ -423,30 +444,6 @@ $D.2,0$
解:$D$。信号量是一个特殊的整型变量,只有初始化和$PV$操作才能改变其值。通常,信号量分为互斥量和资源量,互斥量的初值一般为$1$,表示临界区只允许一个进程进入,从而实现互斥。当互斥量等于$0$时,表示临界区已有一个进程进入,临界区外尚无进程等待;当互斥量小于$0$时,表示临界区中有一个进程,互斥量的绝对值表示在临界区外等待进入的进程数。同理,资源信号量的初值可以是任意整数,表示可用的资源数,当资源量小于$0$时,表示所有资源已全部用完,而且还有进程正在等待使用该资源,等待的进程数就是资源量的绝对值。
**例题** 用$PV$操作实现进程同步,信号量的初值为()。
$A.-1$
$B.0$
$C.1$
$D.$由用户确定
解:$D$。与互斥信号量初值一般为$1$时不同,用$PV$操作实现进程同步,信号量的初值应根据具体情况来确定。若期望的消息尚未产生,则对应的初值应为$0$,若期望的消息已存在,则信号量的初值应设为一个非$0$的正整数。(一般看之前的同步互斥应用一般设置为$0$是因为还没有产生消息)
**例题** 有三个进程共享同一程序段,而每次只允许两个进程进入该程序段,若用$PV$操作同步机制,则信号量$S$的取值范围是()。
$A.2,1,0,-1$
$B.3,2,1,0$
$C.2,1,0,-1,-2$
$D.1,0,-1,-2$
解:$A$。因为每次允许两个进程进入该程序段,即资源(这里指可进入的空间)的最大容量为$2$,所以信号量最大值取$2$。至多有三个进程申请,则信号量最小为$-1$,即最多只存在一个进程在等待,所以信号量可以取$2,1,0,—1$。
**例题** 一个进程因在互斥信号量`mutex`上执行`V(mutex)`操作而导致唤醒另一个进程时,执行$V$操作后`mutex`的值为()。
$A.$大于$0$
@@ -459,4 +456,114 @@ $D.$小于等于$0$
解:$D$。由题意可知,$V$操作导致唤醒另一个进程,所以系统原来就存在等待进入临界区的进程,`mutex`小于等于$-1$,因此在执行`V(mutex)`操作后,`mutex`的值小于等于$0$。
#### 信号量初值
**例题** 用$PV$操作实现进程同步,信号量的初值为()。
$A.-1$
$B.0$
$C.1$
$D.$由用户确定
解:$D$。与互斥信号量初值一般为$1$时不同,用$PV$操作实现进程同步,信号量的初值应根据具体情况来确定。若期望的消息尚未产生,则对应的初值应为$0$,若期望的消息已存在,则信号量的初值应设为一个非$0$的正整数。(一般看之前的同步互斥应用一般设置为$0$是因为还没有产生消息)
**例题** 在$9$个生产者、$6$个消费者共享容量为$8$的缓冲器的生产者-消费者问题中,互斥使用缓冲器的信号量初始值为()。
$A.1$
$B.6$
$C.8$
$D.9$
解:$A$。所谓互斥使用某临界资源,是指在同一时间段只允许一个进程使用此资源,所以互斥信号量的初值都为$1$。
#### 信号量值范围
**例题** 有三个进程共享同一程序段,而每次只允许两个进程进入该程序段,若用$PV$操作同步机制,则信号量$S$的取值范围是()。
$A.2,1,0,-1$
$B.3,2,1,0$
$C.2,1,0,-1,-2$
$D.1,0,-1,-2$
解:$A$。因为每次允许两个进程进入该程序段,即资源(这里指可进入的空间)的最大容量为$2$,所以信号量最大值取$2$。至多有三个进程申请,则信号量最小为$-1$,即最多只存在一个进程在等待,所以信号量可以取$2,1,0,—1$。
### 进程同步与互斥应用
#### 进程互斥
**例题** 进程$P_1$和$P_2$均包含并发执行的线程,部分伪代码描述如下所示。
```cpp
// 进程P1
int x=0;
Thread1(){
int a;
a=1;
x+=1;
}
Thread2(){
int a;
a=2;
x+=2;
}
// 进程P2
int x=0;
Thread3(){
int a;
a=x;
x+=3;
}
Thread4(){
int b;
b=x;
x+=4;
}
```
下列选项中,需要互斥执行的操作是()。
$A.a=1$与$a=2$
$B.a=x$与$b=x$
$C.x+=1$与$x+=2$
$D.x+=1$与$x+=3$
解:$C$。只有对共享变量的赋值可能需要互斥操作。$P$中对$a$进行赋值,并不影响最终的结果,因此$a=1$与$a=2$不需要互斥执行,所以$A$不是。$a=x$与$b=x$执行先后不影响$a$与$b$的结果,无须互斥执行,$B$不是。在同一个进程中,$x+=1$与$x+=2$执行先后会影响$x$的结果,需要互斥执行,$C$需要。$P_1$中的x和$P_2$中的$x$虽然是共享变量,但是不同范围中的$x$,互不影响,不需要互斥执行,$D$不需要。所以其实$x+=3$和$x+=4$也要互斥运行。
### 管程
**例题** 以下关于管程的叙述中,错误的是()。
$A.$管程是进程同步工具,解决信号量机制大量同步操作分散的问题
$B.$管程每次只允许一个进程进入管程
$C.$管程中$signal$操作的作用和信号量机制中的$V$操作相同
$D.$管程是被进程调用的,管程是语法范围,无法创建和撤销
解:$C$。管程的$signal$操作与信号量机制中的$V$操作不同,信号量机制中的$V$操作一定会改变信号量的值$S=S+1$。而管程中的$signal$操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则$signal$不会产生任何影响。
**例题** 若$x$是管程内的条件变量,则当进程执行`x.wait()`时所做的工作是()。
$A.$实现对变量$x$的互斥访问
$B.$唤醒一个在$x$上阻塞的进程
$C.$根据$x$的值判断该进程是否进入阻塞态
$D.$阻塞该进程,并将之插入$x$的阻塞队列中
解:$D$。这是基本的概念,且由于进程已经执行`x.wait()`,证明判断条件为真应该阻塞,所以$C$不对。“条件变量”是管程内部说明和使用的一种特殊变量,其作用类似于信号量机制中的“信号量”,都用于实现进程同步。需要注意的是,在同一时刻,管程中只能有一个进程在执行。若进程$A$执行了`x.wait()`操作,则该进程会阻塞,并挂到条件变量`x`对应的阻塞队列上。这样,管程的使用权被释放,就可以有另一个进程进入管程。若进程$B$执行了`x.signal()`操作,则会唤醒`x`对应的阻塞队列的队首进程。在$Pascal$语言的管程中,规定只有一个进程要离开管程时才能调用`signal()`操作。