资源描述
江苏大学操作系统大作业
——读者和写者的问题
姓名: 秦友才
班级: 计算机1502
学号: 3140602055
操作系统大作业:读者和写者的问题
一、 问题的提出
一个数据对象被若干个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作。即一个是写者一个是读者。写者任意时刻只能有一个,而读者则允许有多个,多个读者之间不会干扰,而写者就不能同时运行。所以对共享资源的读写的限制条件是:
1) 允许多个读者可以同时对文件执行读操作;
2) 只允许一个写者往文件中写信息;
3) 任一写者在完成写操作之前不允许其他读者或写者工作;
使用信号量来处理读者和写者的问题。有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。
二、 问题的分析
设计优先策略满足:
1. 读者优先,即当读者进行读的时候,后续的写者必须等待。直到所有的读者都读完后写者才可以去进行写操作。
2. 写者优先,即当一个写者到来的时候,只有在写者之前的读者才会执行,写者之后的都之后将会被阻塞。
3. 公平策略。满足规则,在读序列中,如果有写者在等待,不允许新来的读者执行,在写者结束时,所有的都读者都有比写者更高的优先级。
通过信号量的操作控制顺序,下面对前两种策略进行分析。
三、 解决算法
读者优先,只要有读者经行都读操作,则写者一直等待。如果有新的读者到来,写者依然要等待。一直等待读者全部完成,才会去执行写者。教科书上给出的例子就是读者优先的。
如果新读者到:①无读者、写者,新读者可以读;②有写者等待,但有其它读者正在读,则新读者也可以读;③有写者写,新读者等待。如果新写者到:①无读者,新写者可以写;②有读者,新写者等待;③有其它写者,新写者等待。
只要解决写者和写者,第一个读者和写者的互斥问题。引入一个信号量Wmutex,来解决这个互斥,通过Rcount来记录当前正在读文件的读者个数,只要读者个数不为零,写者就没有权利写。通过一个Rmutex来解决修改Rcount时候读者和读者的问题。
Semaphore wmutex,rmutex=1;
Int rcount=0
Void reader()
{
P(rmutex);
If(rconut==0) P(wmutex);
Rcount++;
V(rmutex);
//读数据
P(rmutex);
Rcount--
If(rconut==0) V(wmutex);
V(rmutex);
}
Void Write()
{
P(wmutex);
DoWriting();
V(wmutex);
}
写者优先,读者优先对于写者来书实在是太苛刻了,如果有读者就不能写。采用写者优先在一个写者到达时如果有正在工作的读者,那么该写者只要等待正在工作的读者完成,而不必等候其后面到来的读者就可以进行写操作。注意,该算法当一个写者在等待时,后到达的读者是在写者之后被挂起,而不是立即允许进入。为了解决以上问题,写者优先的设计思想是在一个写者到达时如果有正在工作的读者,那么该写者只要等待正在工作的读者完成,而不必等候其后面到来的读者就可以进行写操作。注意,该算法当一个写者在等待时,后到达的读者是在写者之后被挂起,而不是立即允许进入。
在读者优先的算法的基础上增加了一个排队信号量read,读、写进程在每次操作前都要等待read信号量。写者优先的程序设计如下:
int Rcount=0;
semaphore rmutex=1;
semaphore write=1;
semaphore add_reader=1;
void reader()
{
P(add_reader);
P(rmutex);
Rcount++;
if Rcoun=1
P(write);
V(rc_mutex);
V(add_reader);
//读操作
P(Rmutex);
Rcount--;
if Rcount=0
V(write);
V (Rmutex);
}
void writer()
{
P(add_reader);
P(Rmutex);
P(write);
//写操作
V(write);
V(add_reader);
}
四、 流程分析
读者优先
写者优先
五、 分析和总结
刚接到这个题目的时候很茫然,不知道该做什么。在脱了很久之后终于面临要收作业的事实后,我到网上找了很多相关的东西,参考了很多blog,了解了一些,于是写了这些。
读者和写者问题是操作系统中互斥同步的经典问题,在真实的计算机运行过程中也经常会发生这样的问题,如何有效的、代价最小的解决冲突实现互斥同步是非常重要的事情。
展开阅读全文