操作系统读者写者实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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())

相关文档
最新文档