一、问题描述

image.png
要求:
1、允许多个读者可以同时对文件执行读操作。
2、只允许一个写者往文件中写信息。
3、任一写者在完成写操作之前不允许其他读者或写者工作。
4、写者执行写操作前,应让已有的读者和写者全部退出。

二、问题分析

image.png
读者写者问题最核心的问题是如何处理多个读者可以同时对文件的读操作。

三、如何实现

image.png
操作系统——读者写者问题 - 图4
semaphore rw = 1; //实现对文件的互斥访问 int count = 0; semaphore mutex = 1;//实现对count变量的互斥访问 int i = 0; writer(){ while(1){ P(rw); //写之前“加锁” 写文件 V(rw); //写之后“解锁” } } reader (){ while(1){ P(mutex); //各读进程互斥访问count if(count==0) //第一个读进程负责“加锁” { P(rw); } count++; //访问文件的进程数+1 V(mutex); 读文件 P(mutex); //各读进程互斥访问count count—; //访问文件的进程数-1 if(count==0) //最后一个读进程负责“解锁” { V(rw); } V(mutex); } }
操作系统——读者写者问题 - 图5
只要有源源不断的读进程存在,写进程就要一直阻塞等待,可能会造成“饿死”,在上述的算法中,读进程是优先的,那么应该怎么样来改造呢?
新加入一个锁变量w,用于实现“写优先”!
image.png
这里我们来分析一下读者1->写者1->读者2这种情况。第一个读者1在进行到读文件操作的时候,有一个写者1操作,由于第一个读者1执行了V(w),所以写者1不会阻塞在P(w),但由于第一个读者1执行了P(rw)但没有执行V(rw),写者1将会被阻塞在P(rw)上,这时候再有一个读者2,由于前面的写者1进程执行了P(w)但没有执行V(w),所以读者2将会被阻塞在P(w)上,这样写者1和读者2都将阻塞,只有当读者1结束时执行V(rw),此时写者1才能够继续执行直到执行V(w),读者2也将能够执行下去。
基操勿6。
该算法是一种先到先服务的算法,对读写操作相对公平。

四、总结

image.png