操作系统原理第二章 进程管理(2)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

读者优先——分析
写者(包括第一个和随后的)如果被阻塞,
是在wmutex上 读者如果被阻塞,第一个读者是在wmutex上, 而其他读者是在rmutex上 存在写者饥饿的问题,如何解决?
让被阻塞的写者和在其后来的读者在某个信号量
上排队。只要能实现在同一信号量上按到来的先 后顺序排队,就可解决。
信号量解决同步与互斥的一般方法
首先对问题进行分析,搞清问题属于哪类
问题,即是互斥问题,还是同步问题,还 是两者的混合问题; 其次分清并发进程之间的互斥关系和同步 关系,即搞清同步存在于哪些进程之间, 互斥存在于哪些进程之间; 第三,搞清同步的基本方式(具体问题具体 分析),互斥所涉及的临界资源的数量;
思考
如何实现写者优先的读写问题?
读者—写者问题小结
读者— 写者问题代表了“可由同类进程多次访问, 而不同类的进程必须互斥访问资源”这样一类问题 的控制方法。即采用一个资源计数器变量RC进行控 制。把对于该资源的访问控制变为对资源计数器变 量RC的访问控制。此时,资源计数器变量 RC是一 个临界资源,因此需要信号量对它进行互斥控制。 读者优先问题和写者优先的问题均会导致饥饿现象 过桥问题与读者—写者问题属于同一类型的问题。
2.4.2 哲学家进餐问题
1.利用记录型信号量解决哲学家进餐问题 问题:5位哲学家进餐共用一张圆桌,每座位前依次摆放一个筷 子(即桌上共5个筷子)。哲学家生活方式是交替思考和进餐。 Room ph2 f3 ph3 f2 ph1 f1 ph0 f4 f0
ph4

经分析,放在桌子上的筷子是临界资源,在一段时 间内只允许一位哲学家使用。为了实现对筷子的互 斥使用,可以用一个信号量表示一只筷子,由这五 个信号量构成信号量数组。其描述如下:

思考:过桥问题——作业
过桥问题。有桥如图所示。
车流如箭头所示。桥上不 允许车辆交会,但允许同 方向多辆车依次通行(即桥 上可以有多个同方向的车)。 请用PV操作实现交通管理 以防桥上堵塞。
2.4.3 读者——写者问题
有多个读者和写者进程(读、写进程个数任意), 它们共享一个内存区域。读进程从该区域中读出 信息,写进程把信息写入该区域。 读写规则为:读者与写者之间互斥,写者与写者 之间互斥;读者之间不互斥。另外,按照上述规 则,对读写的选择顺序没有做任何假定。 ①试用PV操作写出一个“读者优先”的读写问题 的同步算法;②试用PV操作写出一个“无优先” 的读写问题的同步算法; ③试用PV操作写出一个 “写者优先”的读写问题的同步算法。
生产者—消费者同步中应注意:
在 每 个 进 程 中 用 于 实 现 互 斥 的 wait(mutex) 和 signal(mutex)必须成对地出现;
对资源信号量 empty 和 full 的 wait 和 signal 操作,需要 成对地出现,但它们分别处于不同的程序中。例如, wait(empty)在生产进程中,而 signal(empty) 则在消费 进程中; 在每个程序中的多个wait操作顺序不能颠倒。应先执行 对资源信号量的wait操作,然后再执行对互斥信号量的 wait 操 作 , 否 则 可 能 引 起 进 程 死 锁 ( 例 如 消 费 者 先 执 行
Room ph2
f2 f3 ph3 f1 ph0 f4 ph4 f0
ph1
第i位哲学家的活动可描述为: Var chopstick: array[0, …, 4] of semaphore=(1,1,1,1,1); repeat wait(chopstick[i]); wait(chopstick[(i+1) mod 5]); … eat; … signal(chopstick[i]); signal(chopstick[(i+1) mod 5]); … think; until false; 问题:上述算法有可能引起死锁。为什么?如何解决?
2. 利用AND信号量机制解决哲学家进餐问题 在哲学家进餐问题中,要求每个哲学家先获得两个临界资源 (筷子)后方能进餐,这在本质上就是前面所介绍的AND同步 问题,故用AND信号量机制可获得最简洁的解法。 Var chopsiick array [0, …, 4] of semaphore :=(1,1,1,1,1); processi repeat think; Sswait(chopstick[(i+1) mod 5], chopstick [i]); eat; Ssignat(chopstick [(i+1) mod 5], chopstick [i]); until false;

读者优先

reader(){ writer(){ while(1){ while(1){ wait(rmutex); wait(wmutex); if(readcount==0)wait(wmutex); 写文件; readcount++: signal(wmutex); signal(rmutex); }} 读文件; 初值: wait(rmutex); wmutex=rmutex=1 readcount--; readcount=0 if(readcount==0)signal(wmutex); signal(rmutex); (readcount不适合做信号量而应 该定义为普通的整型变量,为什么?) }}
consumer:begin repeat wait(full); wait(mutex); nextc :=buffer(out);//临时消费缓冲区 out :=(out+1) mod n; signal(mutex); signal(empty); consumer the item in nextc; until false; end parend end
2.4 经典进程的同步问题
生产者一消费者问题
读者一写者问题
哲学家就餐问题
进程互斥与同步的区分
进程的互斥是进程Hale Waihona Puke Baidu步的特例,两者都涉
及到并发进程访问共享资源的问题。 进程的互斥是指只要无进程在使用共享资 源时,就允许任意一个参与竞争的进程去 使用该资源。 进程同步不同:当涉及到共享资源的进程 必须同步时,即使无进程在使用共享资源, 那么尚未得到同步消息的进程仍不能去使 用这个资源。
举例: (1)W1 R1 R2

(1)R1阻塞在wmutex 上,R2阻塞在rmutex上 (2)W1阻塞在wmutex 上,R3开始阻塞在 rmutex上。当R2释放 readcount操作后, R3解 除阻塞,可以继续执行读 操作。
(2)R1 R2 W1 R3 假设此时: R1正在读文件, R2正在 操作readcount,随后W1 和R3很快分别到来
(续)
第四,设定信号量的个数和初值。互斥信号量 的个数等于临界资源的数目,且其初值均为1; 同步信号量的个数及其初值则要根据具体问题 而定,没有统一的方法。值得注意的是每个信 号量必须置一次且只能置一次初值,初值不能 为负数; 最后,设计出相应的管理方法,给出其并发算 法。在最后一步中,尽可能地利用现在已经发 明的较为成熟的实现方法,包括已经学过的例 题或已做过的习题的实现方法。
可采取以下几种解决方法: 1. 至多只允许有四位哲学家同时去拿左边的筷子,最终 能保证至少有一位哲学家能够进餐。(增加一个总资 源信号量S=4) 2. 仅当哲学家的左、右两只筷子均可用时,才允许他拿 起筷子进餐(AND型信号量)。 3. 规定奇数号哲学家先拿他左边的筷子,然后再去拿右 边的筷子;而偶数号哲学家则相反。按此规定,将是 1、 2号哲学家竞争1号筷子;3、4号哲学家竞争3号 筷子。即五位哲学家都先竞争奇数号筷子,获得后, 再去竞争偶数号筷子,最后总会有一位哲学家能获得 两只筷子而进餐。
consumer:begin repeat Swait(full, mutex); nextc :=buffer(out); out :=(out+1) mod n; Ssignal(mutex, empty); consumer the item in nextc; until false; end parend end



无写者时,读者可以不断地读,因为进去的读者通过 V(S)可以让后面的读者进来,此时与“读者优先”时的 情形相同。 当第一个写者来时,如果被阻塞,是在mutex上。此时 它已P(S)但无法V(S),将导致第一个写者后面到来的所 有读者和写者阻塞在S上。从而实现后面到来的所有读 者和写者在S上按顺序排队,因此达到了无优先的目的。 小结:如果有读者在读,则第一个写者被阻塞在mutex 上,第二个写者和它后面来的读者均被阻塞在S上;如 果有写者在写,则包括第一个读者在内的所有读者如果 被阻塞,都是在S上,而其他写者也是阻塞在S上。

举例: (1)W1 R1 R2 假设:W1在写文件,此 时R1和R2分别到达

(1)R1阻塞在S上,R2 也阻塞在S上 (2)W1阻塞在S上,R3 也阻塞在S上
(2)R1 R2 W1 R3 假设此时: R1正在读文件, R2正在 操作readcount,随后W1 和R3很快分别到来
无优先的读写问题——分析

Var mutex, empty, full:semaphore :=1,n,0; buffer:array[0, …, n-1] of item; in, out: integer :=0, 0;//空、满缓冲区队列起始位置 begin parbegin proceducer:begin repeat … producer an item nextp;//nextp为临时缓冲区 wait(empty); wait(mutex); buffer(in) :=nextp; in :=(in+1) mod n; signal(mutex); signal(full); until false; end
wait(mutex) 通 过 、 再 执 行 wait(full) 被 阻 塞 ; 然 后 生 产 者 先 执 行 wait(mutex)就会被阻塞,导致死锁)。
2.利用AND信号量解决生产者—消费者问题 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; … Swait(empty, mutex); buffer(in)∶=nextp; in∶=(in+1)mod n; Ssignal(mutex, full); until false; end
无优先的读写问题
reader(){ writer(){ while(1){ while(1){ wait(S); wait(rmutex); wait(S); if(readcount==0)wait(wmutex); wait(wmutex); readcount++: 写文件; signal(rmutex); signal(wmutex); signal(S); signal(S);}} 读文件; wait(rmutex); 初值: readcount--; wmutex=rmutex=1 if(readcount==0)signal(wmutex); S=1 signal(rmutex); readcount=0 }}
相关文档
最新文档