操作系统读者写者实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《操作系统》上机实验报告
实验项目读者写者
学院(部)信息学院
专业计算机科学与技术班级
学生姓名
学号
读者写者问题
一.实验目的:
1.熟悉读者优先和写者优先的过程。
2.更好地理解进程同步的概念及其实现方法。
二.实验要求:
分别实现读者优先和写者优先。
“读-写”互斥,即不能同时有一个读者在读,同时去有一个写者在写;
“写-写”互斥,即不能有两个写者同时进行写操作;
“读-读”允许,即可以有两个以上的读者同时进行读操作。
三.实验内容:
读者优先:
如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount 记录当前的读者数目,用于确定是否释放写者线程,(当readcout=0 时,说明所有的读者都已经读完,释放一个写者线程),每个读者开始读之前都要修改readcount,为了互斥的实现对readcount 的修改,需要一个互斥对象Mutex来实现互斥。
另外,为了实现写-写互斥,需要一个临界区对象write,当写者发出写的请求时,必须先得到临界区对象的所有权。通过这种方法,可以实现读写互斥,当readcount=1 时,(即第一个读者的到来时,),读者线程也必须申请临界区对象的所有权.
当读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount==1 后,其余的读者由于等待对readcount的判断,阻塞在Mutex上!
写者优先:
写者优先和读者优先有相同之处,不同的地方在:一旦有一个写者到来时,应该尽快让写者进行写,如果有一个写者在等待,则新到的读者操作不能读操作,为此添加一个整型变量writecount,记录写者的数目,当writecount=0时才可以释放读者进行读操作!为了实现对全局变量writecount的互斥访问,设置了一个互斥对象Mutex3。
为了实现写者优先,设置一个临界区对象read,当有写者在写或等待时,读者必须阻塞在临界区对象read上。
读者除了要一个全局变量readcount实现操作上的互斥外,还需要一个互斥对象对阻塞在read这一个过程实现互斥,这两个互斥对象分别为mutex1和mutex2。
四.实验结果
1.实验数据:
读者优先:r w r w r 写者优先:r w r w r
结果展示:
五.实验总结
这次实验分读者优先和写者优先来处理,不仅掌握了读者写者的过程和原理,而且还了解到了读者优先和写者优先之间的联系,共同点和不同点。写代码的过
程中出现了许多的问题,最先开始没有用进程来实现,发现比较困难,而且模拟的不真实,后来有从网上面学习了一些进程的东西,借鉴了他人的一些经验完成了这次的报告。
六.实验代码
#include
#include
#include "fstream.h"
int readcount=0; //读者数目
int writecount=0; //写者数目
CRITICAL_SECTION RP_Write; //临界区
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
struct ThreadInfo //线程信息
{ int Threadhao; //线程序号
char ThreadClass; //线程类别
double ThreadStartTime; //线程开始时间
double ThreadRunTime; //线程读写持续时间
};
void ReaderFun(char* file);//读者优先函数
void R_ReaderThread(void *p);//处理读者优先读者线程
void R_WriterThread(void *p);//处理读者优先写者线程
void WriterFun(char* file);
void W_ReaderThread(void *p);
void W_WriterThread(void *p);
int main()//主函数
{
char select;
while (true)
{
cout<<"1:读者优先"< cout<<"2:写者优先"< cout<<"3:退出"< cout<<" "< cout<<"请选择要进行的操作:"< do { cin>>select; if(select!='1' && select!='2' && select!='3') cout<<"你操作有误,请重试!"< }while (select!='1' && select!='2' && select!='3'); system("cls"); if (select=='3') return 0;//退出 else if (select=='1')//调用读者优先 ReaderFun("110.txt"); else if(select=='2')//调用写者优先 WriterFun("110.txt"); cout<<"\n是否还有继续? 1. 继续 2.退出"< do { cin>>select; if(select!='1' && select!='2' ) cout<<"你操作有误,请重试!"< }while (select!='1' && select!='2'); if(select=='2') return 0;// 退出 system("cls"); } return 0; } //读者优先函数 void ReaderFun(char* file) { DWORD n_thread=0; //线程数初值为0 DWORD thread_ID; //线程ID DWORD wait_for_all; //等待所有线程结束 //临界资源 HANDLE h_Mutex; //互斥对象(h_Mutex)确保线程拥有对单个资源的互斥访问权h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount"); HANDLE h_Thread[64]; //线程对象数组,最大64 ThreadInfo thread_info[64]; readcount=0; InitializeCriticalSection(&RP_Write); //初始化临界区 ifstream inFile; inFile.open(file); cout<<"读者优先:\n"< while (inFile) {//读入每一个读者、写者的信息 inFile>>thread_info[n_thread].Threadhao >>thread_info[n_thread].ThreadClass >>thread_info[n_thread].ThreadStartTime >>thread_info[n_thread].ThreadRunTime; if (-1 == inFile.get())