计算机操作系统习题解答(第三版)汤小丹 - 西安电子科技大学出版社 下载本文

户级线程的切换速度较快.

---用户级线程调用系统调用和调度另一个进程执行时,内核把它们看作是整个进程的行为,内核级线程

调用是以线程为单位,内核把系统调用看作是该线程的行为.

---对于用户级线程调用,进程的执行速度随着所含线程数目的增加而降低,对于内核级线程则相反.

18 在 Solaris OS 中,设置了哪几种线程?轻型线程的作用是什么? a. 用户级线程,内核级线程和轻型线程;

b. 作用: 由 LWP 实现了在内核与用户级线程之间的隔离,从而使用户级线程与内核无关.

19 在 Solaris OS 中,用户级线程是通过什么方式来访问内核的?

通过 LWP 来访问内核. LWP 可为内核所识别,但不能识别用户级线程,通过建立用户级线程与 LWP 之间的

连接,可以实现用户级线程与内核的通信.

第三章

1. 什么是临界资源和临界区?

a. 一次仅允许一个进程使用的资源成为临界资源.

b. 在每个进程中,访问临界资源的那段程序称为临界区.

2. 为什么进程在进入临界区之前,应先执行\进入区\代码,在退出临界区后又执行\退出区\代码?

为了实现多个进程对临界资源的互斥访问,必须在临界区前面增加一段用于检查欲访问的临界资源是否正

被访问的代码,如果未被访问,该进程便可进入临界区对资源进行访问,并设置正被访问标志,如果正被

访问,则本进程不能进入临界区,实现这一功能的代码成为\进入区\代码;在退出临界区后,必须执行\

退出区\代码,用于恢复未被访问标志.

3. 同步机构应遵循哪些基本准则?为什么? a. 空闲让进. b. 忙则等待. c. 有限等待. d. 让权等待.

4. 试从物理概念上来说明记录型信号量和 wait 和 signal 操作?(有待讨论).

5. 你认为整型信号量机制和记录型信号量机制,是否完全遵循了同步机构的四条准则?

a. 在整型信号量机制中,未遵循\让权等待\的准则.

b. 记录型信号量机制完全遵循了同步机构的\空闲让进,忙则等待,有限等待,让权等待\四条准则.

6. 在生产者-消费者问题中,如果缺少了 signal(full)或 signal(empty),对执行结果会有何影响?

生产者-消费者问题可描述如下:

var mutex,empty,full: semaphore:=1,n,0; buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin

producer: begin repeat . .

produce an item in nextp; . .

wait(empty); wait(mutex);

buffer(in):=nextp; in:=(in+1) mod n;

signal(mutex); /* ************** */ signal(full); /* ************** */ until false; end

consumer: begin repeat

wait(full); wait(mutex);

nextc:=buffer(out); out:=(out+1) mod n;

signal(mutex); /* ************** */ signal(empty); /* ************** */ consume the item in nextc;

until false; end parend end

可见,生产者可以不断地往缓冲池送消息,如果缓冲池满,就会覆盖原有数据,造成数据混乱.而消费者

始终因 wait(full)操作将消费进程直接送入进程链表进行等待,无法访问缓冲池,造成无限等待.

7. 在生产者-消费者问题中,如果将两个 wait 操作即wait(mutex)互换位置;或者是将

signal(mutex)与 signal(full)互换位置结果会如何? var mutex,empty,full: semaphore:=1,n,0; buffer: array[0,...,n-1] of item; in,out: integer:=0,0; begin parbegin

producer: begin repeat . .

produce an item in nextp; . .

wait(empty); wait(mutex);

buffer(in):=nextp;

in:=(in+1) mod n; /* ***************** */ signal(full);

signal(mutex); /* ***************** */ until false; end

consumer: begin

repeat /* **************** */ wait(mutex);

wait(full); /* **************** */ nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty);

consume the item in nextc; until false; end

wait(full)和 parend end a. wait(full)和 wait(mutex)互换位置后,因为 mutex 在这儿是全局变量,执行完 wait(mutex),则 mutex

赋值为0,倘若full也为0,则该生产者进程就会转入进程链表进行等待,而生产者进程会因全局变量mutex

为 0 而进行等待,使 full 始终为 0,这样就形成了死锁.

b. 而 signal(mutex)与 signal(full)互换位置后,从逻辑上来说应该是一样的.

8. 我们为某临界区设置一把锁 W,当 W=1 时,表示关锁;W=0 时,表示锁已打开.试写出开锁原语和关锁 原语,并利用它们去实现互斥. 开锁原语: unlock(W): W=0;

关锁原语: lock(W);

if(W==1) do no_op; W=1;

利用开关锁原语实现互斥: var W: semaphore:=0; begin parbegin process : begin repeat lock(W);

critical section unlock(W);

remainder section until false; end parend

9. 试修改下面生产者-消费者问题解法中的错误: producer: begin repeat . .

producer an item in nextp;