问题描述
解题思路
分析:
无论是写写还是读写互斥都是对文件的互斥访问,需要一个互斥信号量rw,在读和写的前后加入互斥访问
问题1:但是这样的话无法实现多个读者访问文件的操作;当reader1读时,rw=0;在reader1读的过程中切换到reader2读时,因为rw=0而阻塞。
解决1:用一个计数变量count=0来对读者进程计数,当第一个读者进程开始时加锁,最后一个读者进程结束时解锁
问题2:当俩个读者进程并发执行时,r1判断完count=0后切换到r2,此时r2认为count=0,加锁;在切换回r1继续执行加锁,这样r1进程就会被阻塞
解决2:产生该问题的原因是由于原因在于对count 变量的检查和赋值无法一气呵成;为了实现一气呵成的操作,需要设置一个互斥的信号量mutex=1来互斥的访问count变量
问题3:当一直有读者进程到来时,写进程就会“饿死”
解决3:在设置一个互斥的信号量w=1用于实现“读写公平”(或者说“写优先”’)
分析:
1、读者1–>读者2:r1读执行p(w)后r2阻塞;当r1执行完V(w),后r1读,r2唤醒;俩个进程并发读
2、写者1–>写者2:w1写,w=0,w2在P(w)阻塞
3、写者1–>读者1:w1执行,w=0;读者阻塞在P(w)
4、读者1–>写者1–>读者2:r1读,rw=0,w=1;w1写,w=0,p(rw)阻塞;r2读,P(w)阻塞;当r1结束后,w1唤醒;但r2依旧阻塞;这样就实现了写进程到来后,读完立即执行写进程。
5、写者1–>读者1–>写者2:w1写,w=0;r1读,在p(w)阻塞;w2写,p(w)阻塞;w1写,由于读1先入队,所以执行r1读,w2依旧阻塞;因此,其实他应该叫做“读写公平”比“写优先”更合适。