读者-写者问题的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要 (1)
1.设计思想 (2)
2.各模块的伪码算法 (3)
3. 函数关系调用图 (5)
4.程序测试结果 (6)
设计总结 (9)
参考文献 (10)
致谢 (11)
摘要
本设计的读者写者问题,是指一些进程共享一个数据区。数据区可以使一个文件、一块内存空间或者一组寄存器。Reader进程只能读数据区中的数据,而writer进程必须与其他进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述, 有一群写者和一群读者, 写者在写同一本书, 读者也在读这本书, 多个读者可以同时读这本书。但是,只能有一个写者在写书, 并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作, 另外, 需要有一个信号量S来确定当前是否可操作。
本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模拟演示,形象地阐述记录型信号量机制的工作原理。
关键词:共享对象,互斥,同步,信号量
1.设计思想
本设计借助C语言实现进程同步和互斥的经典问题--读者写者问题,用高级语言编写和调试一个进程同步程序,以加深对进程同步机制的理解。通过用C 语言模拟进程同步实现,加深理解有关进程同步和互斥机制的概念及P、V操作的应用。学生通过该题目的设计过程,掌握读者、写者问题的原理、软件开发方法并提高解决实际问题的能力。
在 Windows环境下,创建一个包含n个线程的控制台进程。用这n个线每个线程按相应测试数据文件的要求,进行读写操作。程来表示 n 个读者或写者。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。
读者-写者的读写限制(包括读者优先和写者优先)
1)写-写互斥,即不能有两个写者同时进行写操作;
2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写;
3)读读允许,即可以有 2 个以上的读者同时读;
4)读者优先附加条件:如果一个读者申请进行读操作,同时又有一个读操作正在进行读操作,则该读者可以直接开始读操作;
5)写者优先附加条件:如果一个读者申请进行读操作时已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
2.各模块的伪码算法
读者优先算法:
设置两个互斥信号量:
rwmutex 用于写者与其他读者/写者互斥的访问共享数据
rmutex 用于读者互斥的访问
读者计数器 readcount
semaphore rwmutex=1, rmutex=1;
int readcount = 0;
reader i //读者进程i=1,2,….
do{
P(rmutex); //读者互斥
readcount++; //读者数加1
if (readcount == 1) P(rwmutex); //读者写者互斥
V(rmutex);
读者读数据;
P(rmutex);
Readcount--;
if (readcount == 0) V(rwmutex);
V(rmutex);
}while(1);
writer j //写者进程j = 1,2,….
do{
P(rwmutex);
写文件;
V(rwmutex);
}while(1);
写者优先算法:
设置三个互斥信号量:
rwmutex 用于写者与其他读者/写者互斥的访问共享数据
rmutex 用于读者互斥的访问
读者计数器readcount
nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作semaphore rwmutex= 1,rmutex= 1,nrmutex= 1;
int readcount = 0;
reader i //读者进程i=1,2,….
do{
P(rwmutex);
P(rmutex);
readcount++;
if (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
V(rmutex);
V(rwmutex);//及时释放读写互斥信号量,允许其它读、写进程申请资源读数据;
P(rmutex);
readcount--;
if (readcount == 0) V(nrmutex); //所有读者退出,允许写更新
V(rmutex);
}while(1);
writer j //写者进程j = 1,2,….
do{
P(rwmutex); // 互斥后续其它读者、写者
P(nrmutex); //如有读者正在读,等待所有读者读完
写更新;
V(nrmutex); //允许后续新的第一个读者进入后互斥写操作
V(rwmutex); //允许后续新读者及其它写者
}while(1);
3. 函数关系调用图
图1 函数关系图
4.程序测试结果
测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是读者还是写者,以及读写操作的开始时间和持续时间.每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号.第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间 (单位为秒) 后发出对共享资源的读写申请. 第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
在读者写者同时在队列中等待申请资时,读者优先调用资源.而且如果一个读者申请进行读操作时已有另一读者正在进行读操作, 则该读者可直接开始读操作,即读读允许。
图2 进程1、2的测试结果
如图2所示,进程1是W操作,在时间3时进入队列,运行时间是5,即在时间8时,进程1退出。在它进入时没有进程占用资源,它既占用资源;知道它释放资源,等候的进程有3,4,5;