户级线程的切换速度较快.
---用户级线程调用系统调用和调度另一个进程执行时,内核把它们看作是整个进程的行为,内核级线程
调用是以线程为单位,内核把系统调用看作是该线程的行为.
---对于用户级线程调用,进程的执行速度随着所含线程数目的增加而降低,对于内核级线程则相反.
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;