读者写者问题报告.docx
- 文档编号:28627686
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:14
- 大小:95.34KB
读者写者问题报告.docx
《读者写者问题报告.docx》由会员分享,可在线阅读,更多相关《读者写者问题报告.docx(14页珍藏版)》请在冰豆网上搜索。
读者写者问题报告
计算机操作系统实验报告
题目读者写者问题
专业计算机科学与技术
班级2012240201
学生姓名张璐
学号************
一、设计概述
读者—写者问题(Readers-Writersproblem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。
计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。
就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;
(3)不允许多个写者同时操作。
读者写者问题是这样一种情况,就是允许对资源进行两种类型的操作(读和写)。
而写操作是排他的(排斥读者,同样排斥其他写者),读操作是共享的(多个读者可读,排斥写者)。
这就存在两种策略:
1.读者优先(强读者同步Strongreadersynchronization):
总是给读者优先权,只要写者当前没有进行写操作,读者就能获得访问权。
这种情况存在于读者很多,写者不经常更新的时候使用,如图书馆参考数据库采用读者优先比较好。
2.写者优先(强写者同步Strongwritersynchronization):
通常把优先权交给写者,而将读者延迟到所有等待的或活动的写者都完成了为止。
这种情况存在于经常更新的系统,而读者对最新信息感兴趣,如机票预定系统,写者进行机票价格的更新,读者获取当前机票价。
二、设计目的与内容
1、实验目的
l.用信号量来实现读者写者问题。
2.理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。
2、设计分析
读者优先:
设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。
该算法只要还有一个读者在活动,就允许后续的读者进来,该策略的结果是,如果有一个稳定的读者流存在,那么这些读者将在到达后被允许进入。
而写者就始终被挂起,直到没有读者为止。
写者优先:
为了保证写者相对于读者的优先,需要提高写者进程的优先级。
这里除增加一个排队信号量read,让读者和写者在读写之前都在此信号量上排队。
对于read信号量,每个读进程最开始都要申请一次,之后在真正做读操作前即让出,这使得写进程可以随时申请到read。
而写进程,只有第一个写进程需要申请read,之后就一直占着不放了,直到所有写进程都完成后才让出。
等于只要有写进程提出申请就禁止读进程在read信号量上排队。
假设一个写进程正在写时,接着后续有n个读者正在等待,这时又有一个新的写者要写,比较一下写者优先1和写者优先2的情况:
写者优先1新来的写者需要等待n+1次V(read)操作,而写者优先2新来的写者只需等待2次V(read)操作,变相提高了写进程的优先级。
三、源程序
读者优先
#include
#include
usingnamespacestd;
voidmain()
{intchoice,rmutex=0,readcount=0,waitread=0,waitwrite=0;//初始化
charnow='0';
while(true)
{cout<<"读者优先\n"< cout<<"1.读者读"< cout<<"2.写者写"< cout<<"3.读者读完"< cout<<"4.写者写完"< cin>>choice; switch(choice) { case1: { cout<<"一个读者发出读请求"< if(now=='w') { waitread++;//栈中有写者,读者等待 cout<<"写者正在写文件,读者等待"< cout<<"当前有"< } else { readcount++;//读者入栈 now='r'; cout<<"读者开始读文件"< cout<<"当前栈中有"< } } break; case2: { cout<<"一个写者发出写请求"< if(now! ='0')//若栈不为空,写者等待 { waitwrite++;//入等待队列 cout<<"栈不为空,写者等待"< cout<<"当前有"< } else { now='w'; cout<<"栈为空,写者开始写文件"< } break; case3: { if((now! ='r')|(now=='0')) cout<<"栈里无读者,请重输"< else { cout<<"释放一个读者"< rmutex++; readcount--; if(readcount==0)//栈中已无读者 { if(waitwrite>0)//有写者等待,写者入栈 { waitwrite--; now='w'; cout<<"当前栈中没有读者"< cout<<"写者开始写文件"< } else { now='0'; cout<<"栈空"< } } else { now='r'; cout<<"还有"< } } } break; case4: { if(now! ='w') { cout<<"栈里无写者,请重输"< } else { cout<<"释放一个写者"< if(waitread>0)//有读者等待,读者入栈 { readcount=waitread; now='r'; waitread=0; cout<<"读者开始读文件"< } elseif(waitwrite>0)//有写者等待,写者入栈 { waitwrite--; now='w'; cout<<"写者开始写文件"< } else { now='0'; cout<<"栈空"< } } } break; } } } 写者优先 #include #include usingnamespacestd; voidmain() {intchoice,rmutex=0,readcount=0,waitread=0,waitwrite=0;//初始化 charnow='0'; while(true) {cout<<"写者优先\n"< cout<<"1.读者读"< cout<<"2.写者写"< cout<<"3.读者读完"< cout<<"4.写者写完"< cin>>choice; switch(choice) { case1: { cout<<"一个读者发出读请求"< if((now=='0')|(now=='r'))//如果栈为空且没有写者等待,或栈中有读者,读者进栈 { if(waitwrite==0) { readcount++; now='r'; cout<<"读者进栈,开始读文件"< cout<<"当前栈中有"< } elseif((waitwrite>0)|(now=='w'))//如果有写者等待或栈中有写者时,读者等待 { waitread++; //waitwrite--; cout<<"写者正在写,读者等待"< cout<<"当前有"< } } } break; case2: { cout<<"一个写者发出写请求"< if(now! ='0')//栈不为空,写者等待 { waitwrite++; cout<<"栈不为空,写者等待"< cout<<"当前有"< } else { now='w'; cout<<"栈为空,写者开始写文件"< } break; case3: { if((now! ='r')|(now=='0')) cout<<"栈里无读者,请重输"< else { cout<<"释放一个读者"< rmutex++; readcount--; if(readcount==0)//如果读者释放完 { if(waitwrite>0)//若有写者等待,写者进栈 {waitwrite--; now='w'; //rmutex=0; //readcount=0; cout<<"当前栈中已没有读者"< cout<<"写者开始写文件"< } else {now='0'; cout<<"栈空"< } } else { now='r'; cout<<"还有"< } } } break; case4: { if(now! ='w') { cout<<"栈里无写者,请重输"< } else { cout<<"释放一个写者"< if(waitwrite>0)//若有写者等待,写者入栈 { now='w'; waitwrite--; cout<<"写者开始开文件"< cout<<"当前还有"< } elseif(waitread>0)//若有读者等待,读者入栈 {intj=waitread; for(inti=0;i { waitread--; now='r'; readcount++; } cout<<"当前栈中已没有写者"< cout<<"读者开始读文件"< //rmutex=0; } else { now='0'; cout<<"栈空"< } } } break; default: cout<<"输入错误,请重输"< } } } 四、程序运行结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 读者 问题 报告