1、有三个进程共享同一程序段,而每次只允许两个进程进入该程序段,若用PV操作同步机制,则信号量S的取值范围是()。
- A:2,1,0,-1
- B:3,2,1,0
- C:2,1,0,-1,-2
- D:1,0,-1,-2
解析
因为每次允许两个进程进入该程序段,信号量最大值取2。至多有三个进程申请,则信号量最小为-1,所以信号量可以取2,1,0,-1。
答案:A
2、对于两个并发程序,设互斥信号量为mutex(初值为1),若mutex=0,则表示()。
- A:没有进程进入临界区
- B:有一个进程进入临界区
- C:有一个进程进入临界区,另一个进程等待进入
- D:有一个进程在等待进入
解析
mutex的初值为1,表示允许一个进程进入临界区,当有一个进程进入临界区且没有进程等待进入时,mutex减1,变为0。|mutex|为等待进入的进程数。因此选择B。
答案:B
3、 一个进程因在互斥信号量mutex上执行V(mutex)操作而导致唤醒另一个进程时,执行V操作后,mutex的值为()。
- A:大于0
- B:小于0
- C:大于等于0
- D:小于等于0
解析
由题意可知,系统原来存在等待进入临界区的进程,mutex小于等于-1,因此在执行V(mutex)操作后,mutex的值小于等于0。
答案:D
4、以下关于管程的叙述中,错误的是()。
- A:管程是进程同步工具,解决信号量机制大量同步操作分散的问题
- B:管程每次只允许一个进程进入管程
- C:管程中signal操作的作用和信号量机制中的V操作相同
- D:管程是被进程调用的,管程是语法范围,无法创建和撤销
解析
管程的signal操作与信号量机制中的V操作不同,信号量机制中的V操作一定会改变信号量的值S=S+1。而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则signal不会产生任何影响。
答案:C
5、若系统有n个进程,则就绪队列中进程的个数最多有()个;阻塞队列中进程的个数最多有()个。
- A:n+1
- B:n
- C:n-1
- D:1
解析
第一个括号:系统中有n个进程,其中至少有一个进程正在执行(处理器至少有一个),因此就绪队列中的进程个数最多有n-1个。B选项容易被错选,以为出现了处理器为空、就绪队列全满的情况,实际调度无此状态。
第二个括号:C选项容易被错选,阻塞队列有n-1个进程这种情况是可能发生的,但不是最多的情况。可能不少读者会忽视死锁的情况,死锁就是n个进程都被阻塞,所以最多可以有n个进程在阻塞队列。
答案:C、B
6、在9个生产者、6个消费者共享容量为8的缓冲器的生产者-消费者问题中,互斥使用缓冲器的信号量初始值为()。
- A:1
- B:6
- C:8
- D:9
解析
所谓互斥使用某临界资源,是指在同一时间按只允许一个进程使用此资源,所以互斥信号量的初值都为1。
答案:A
7、进程 P 0 P_0 P0和进程 P 1 P_1 P1的共享变量定义及其初值为:
boolean flag[2];
int turn = 0;
flag[0] = false; flag[1] = false;
若进程 P 0 P_0 P0和进程 P 1 P_1 P1访问临界资源的类C代码实现如下:
void P0() // 进程 P0
{
while(true)
{
flag[0] = true;
turn = 1;
while(flag[1] && (trun == 1));
临界区;
flag[0] = false;
}
}
void P1() //进程P1
{
while(true)
{
flag[1] = true;
trun = 0;
while(flag[0] && (trun == 0));
临界区;
flag[1] = false;
}
}
则并发执行进程 P 0 P_0 P0和进程 P 1 P_1 P1时产生的情况是()。
- A:不能保证进程互斥进入临界区,会出现”饥饿“现象
- B:不能保证进程互斥进入临界区,不会出现”饥饿“现象
- C:能保证进程互斥进入临界区,会出现”饥饿“现象
- D:能保证进程互斥进入临界区,不会出现”饥饿“现象
解析
答案:D
8、有两个并发执行的进程 P 1 P_1 P1和进程 P 2 P_2 P2,共享初值为1的变量x。 P 1 P_1 P1对x加1, P 2 P_2 P2对x减1。加1和减1操作的指令序列分别如下:
// 加1操作
load R1,x //取x到寄存器R1
inc R1
store x,R1 //将R1的内容存入x
// 减1操作
load R2,x // 取x到寄存器R2
dec R2
store x,R2 // 将R2的内容存入x
两个操作完成后,x的值()。
- A:可能为-1或3
- B:只能为1
- C:可能为0,1或2
- D:可能为-1,0,1或2
解析
将 P 1 P_1 P1中的3条语句依次编号为1,2,3,将 P 2 P_2 P2中的3条语句依次编号为4,5,6,则依次执行1,2,3,4,5,6得结果1,依次执行1,2,4,5,6,3得结果2,依次执行4,5,1,2,3,6得结果0.结果-1不可能得出。
答案:C
9、使用TSL(Test and Set Lock)指令实现进程互斥的伪代码如下所示。
do{
...
while(TSL(&lock));
critical section;
lock = FALSE;
...
}while(TRUE);
下列与该实现机制相关的叙述中,正确的是()。
- A:退出临界区的进程负责唤醒阻塞态进程
- B:等待进入临界区的进程不会主动放弃CPU
- C:上述伪代码满足”让权等待“的同步准则
- D:while(TSL(&lock))语句应在关中断状态下执行
解析
当进程退出临界区时置lock为FALSE,会负责唤醒处于就绪态得进程,A错误。
等待进入临界区得进程会一直停留在执行while(TSL(&lock))的循环中,不会主动放弃CPU,B正确。
让权等待,即进程不能进入临界区时,应立即释放处理器,防止进程忙等待。通过B的分析发现,上述伪代码并不满足“让权等待”的同步准则,C错误。
while(TSL(&lock))在关中断状态下执行时,若TSL(&lock)一直为true,不再开中断,则系统可能会因此终止,D错误。
答案:B
10、属于同一进程的两个线程thread1和thread2并发执行,共享初值为0的全局变量x。thread1和thread2实现对全局变量x加1的机器级代码描述如下。
// thread1
mov R1,x //(x)->R1
inc R1 //(R1)+1->R1
mov x,R1 //(R1)->x
// thread2
mov R2,x //(x)->R2
inc R2 //(R2)+1->R2
mov x,R2 //(R2)->x
在所有可能的指令执行序列中,使x的值为2的序列个数是()。
- A:1
- B:2
- C:3
- D:4
解析
通过阅读两个线程代码可知,thread1和thread2均是对x进行加1操作,x的初始值为0,若要使得最终x=2,只能先执行完thread1再执行thread2,或先执行完thread2再执行thread1,因此仅有两种可能,选B。