操作系统习题解答(张尧学) 联系客服

发布时间 : 星期二 文章操作系统习题解答(张尧学)更新完毕开始阅读cec4b20fe87101f69e31958c

间接制约是由竞争共有资源而引起的。

8.什么是进程间的互斥?什么是进程间同步?

答:进程间的互斥是指:一组并发进程中的一个或多个程序段,因共享某一公有资源而导致它们必须以一个不许交叉执行的单位执行,即不允许两个以上的共享该资源的并发进程同时进入临界区。

进程间的同步是指:异步环境下的一组并发进程因直接制约互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程。

9.试比较P,V原语法和加锁法实现进程间互斥的区别。

答:互斥的加锁实现是这样的:当某个进程进入临界区之后,它将锁上临界区,直到它退出临界区时为止。并发进程在申请进入临界区时,首先测试该临界区是否是上锁的,如果该临界区已被锁住,则该进程要等到该临界区开锁之后才有可能获得临界区。

加锁法存在如下弊端:(1) 循环测试锁定位将损耗较多的CPU计算时间;(2) 产生不公平现象。

P,V原语法采用信号量管理相应临界区的公有资源,信号量的数值仅能由P,V原语操作改变,而P,V原语执行期间不允许中断发生。其过程是这样的:当某个进程正在临界区内执行时,其他进程如果执行了P原语,则该进程并不像lock时那样因进不了临界区而返回到lock的起点,等以后重新执行测试,而是在等待队列中等待由其他进程做V原语操作释放资源后,进入临界区,这时P原语才算真正结束。若有多个进程做P原语操作而进入等待状态之后,一旦有V原语释放资源,则等待进程中的一个进入临界区,其余的继续等待。

总之,加锁法是采用反复测试lock而实现互斥的,存在CPU浪费和不公平现像,P,V原语使用了信号量,克服了加锁法的弊端。

10.

答:设第I块缓冲区的公有信号量为metex[I],保证生产者进程和消费者进程对同一块缓冲区操作的互斥,初值为1;

设信号量avail为生产者进程的私有信号量,初值为m; 设信号量full为消费者进程的私有信号量,初值为0。 用信号量和P、V操作描述发送过程deposit(data) 和接收过程remove(data) 如下:

deposit(data): begin P(avail) 选择一个空缓冲区i P(mutex[i]) 送数据入缓冲区i V(mutex[i]) V(full) End

P(full) 选择一个满缓冲区i P(mutex[i]) 取缓冲区i中的数据 V(mutex[i]) V(avail) 12.

答:定义数组buf[0],buf[1]。

设bufempty[0],buffull[1]是Pa的公有信号量; 设bufempty[1],buffull[0]是Pb的公有信号量; 初值为:

bufempty[0]= bufempty[1]=n buffull[0]= buffull[1]=0 用信号量和P、V操作描述发送过程send(i,m) 和接收过程receive(i,m) 如下:

send (i,m): begin local x P(bufempty[i]) 按FIFO选择一个空缓冲区buf[i](x) buf[i](x)=m

buf[i](x)置满标记 V(buffull[i]) End receive(i,m): begin local x P(buffull[i]) 按FIFO选择一个满缓冲区buf[i](x) m=buf[i](x)

buf[i](x)置空标记 V(bufempty[i]) End

Pa调用send(0,m)和receive(1,m) Pb调用send(1,m)和receive(0,m) 14.

答:设信号量c[i],初值为1;i=0,1,2,3,4。i表示第i号筷子。 (1)第i个哲学家要吃饭: eat(i): begin P(c[i])

remove(data):

begin End

P(c[i+1 mod 5]) 吃饭 V(c[i+1 mod 5]) V(c[i]) End

该过程能保证两个邻座不同时吃饭,但有可能出现每人只拿到一支筷子,谁也吃不上饭的情况。

(1)为解决上述情况,让奇数号的哲学家先取右手边的筷子,偶数号的哲学家先取左手边的筷子。这样只要有一个哲学家拿到了一支筷子,就阻止了邻座的哲学家吃法的企图,从而不会死锁,除非某哲学家永远吃下去。

算法描述如下: eat(i): begin

if i mod 2 == 0 then {

P(c[i])

P(c[i+1 mod 5]) 吃饭 V(c[i+1 mod 5]) V(c[i]) } else { P(c[i+1 mod 5])

P(c[i])

吃饭 V(c[i]) V(c[i+1 mod 5]) }

End

另解:最多只允许4个哲学家同时要求进餐,这样至少有一位哲学家能取到两只筷子并可以进餐,进餐后释放两只筷子,其他哲学家可以陆续进餐。

设哲学家进餐信号量sm=4;筷子信号量c[i]=1(i=0,1,2,3,4) eat(i): begin P(sm) P(c[i]) P(c[i+1 mod 5]) 吃饭 V(c[i+1 mod 5]) V(c[i]) V(sm) End

15.什么是线程? 试述线程与进程的区别。

答;线程是在进程内用于调度和占有处理机的基本单位,它由线程控制表、存储线程上下文的用户栈以及核心栈组成。线程可分为用户级线程、核心级线程以及用户/核心混合型线程等类型。其中用户级线程在用户态下执行,CPU调度算法和各线程优先级都由用户设置,与操作系统内核无关。核心级线程的调度算法及线程优先级的控制权在操作系统内核。混合型线程的控制权则在用户和操作系统内核二者。

线程与进程的主要区别有:

(1) 进程是资源管理的基本单位,它拥有自己的地址空间和各种资源,例如内存空间、外部设备等;线程只是处理机调度的基本单位,它只和其他线程一起共享进程资源,但自己没有任何资源。

(2) 以进程为单位进行处理机切换和调度时,由于涉及到资源转移以及现场保护等问题,将导致处理机切换时间变长,资源利用率降低。以线程为单位进行处理机切换和调度时,由于不发生资源变化,特别是地址空间的变化,处理机切换的时间较短,从而处理机效率也较高。

(3) 对用户来说,多线程可减少用户的等待时间。提高系统的响应速度。例如,当一个进程需要对两个不同的服务器进行远程过程凋用时,对于无线程系统的操作系统来说需要顺序等待两个不同调用返回结果后才能继续执行,且在等待中容易发生进程调度。对于多线程系统而言,则可以在同一进程中使用不同的线程同时进行远程过程调用,从而缩短进程的等待时间。

(4) 线程和进程一样,都有自己的状态.也有相应的同步机制,不过,由于线程没有单独的数据和程序空间,因此,线程不能像进程的数据与程序那样,交换到外存存储空间。从而线程没有挂起状态。

(5) 进程的调度、同步等控制大多由操作系统内核完成,而线程的控制既可以由操作系统内核进行,也可以由用户控制进行。 思考题:读者与写者关系问题(读者优先)。

答:设写者互斥信号量wm=1;读者计数器readcount=0;互斥操作readcount的信号量rm=1;

reader() begin P(rm)

Readcount:=readcount+1 If readcount==1 then P(wm) V(rm) 读数据 P(rm)

Readcount:=readcount-1 If readcount==0 then V(wm) V(rm) end

writer() begin P(wm)

写数据 V(wm)