读者写者问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
实验:读者-写者问题
姓名:张金志
学号:U201313788
班级:通信1306班
一、实验目的:
1、熟练使用VC++6.0编译环境,调试并正确运行程序。
2、理解阅读者和写入者中出现的问题,进而掌握信号量的使用。
3、理解源程序中管理阅读者和写入者权限的算法,及相关窗口操作。
4、阅读演示程序源代码,熟悉阅读者写入者问题流程;
5、写出ReaderThread()和WriterThread()函数伪码;
二、实验原理:
1、问题描述:
有一个公用的数据集,有很多人需要访问,其中一些需要阅读其中的信息,一些需要修改其中的消息。阅读者可以同时访问数据集,而写入者只能互斥的访问数据集,不能与任何的进程一起访问数据区。
2、源程序算法实现调度说明:
要求(书上):
(1)允许多个读者同时对文件进行读操作
(2)只允许一个写者对文件进行写操作
(3)任何写者完成操作前,不允许其他读者或者写者进行操作
(4)写者在进行写操作前,要让所有的读者或者写者全部退出
3、在本程序中用于表现的图形界面说明:
在程序编译运行后会出现中间一个大的圆圈表示公用的资源,上面一排五个矩形表示5个读者,下面的五个矩形表示五个写入者。每个读者和写入者都有3种状态,休息,等待和操作(读入或者写入)分别用黑颜色,绿颜色,红颜色表示休息,等待和操作。一旦操作者获得资源,可以进行读或者写,我们就划一条从操作者中心到资源中心的线,表示开始操作。
三、实验伪码
ReadThread()
{
i=0
While(true) {
Rreadstate[i]=waiting;
P(mutex);
Readercount++;
i++;
If(readcount==1)
P(write);
V(mutex);
Resourcestate[i]=read;
Resourcestate[i]=reading;
P(mutex);
Readcount--;
If(readcount==0)
v(writeblock);
V(mutex)
Readerstate[i]=resting;
Readersource[i]=unused;
}
}
WriteThread(){
Writerstate[i]=resting;
While(1)
{ writerstate[i]=waiting;
P(write);
Writerstate[i]=writing;
Resourcestate[i]=wirte;
v(writeblock);
writerstate[i]=resting;
resourcestate[i]=unused;
i++;
}
}
四、思考题:
1.程序中使用到了互斥变量和临界资源来实现互斥,这两者在实现机制上有不同吗,若有,是什么不同?
答:互斥变量属于信号量,其值为0或1,反应进程之间的互斥情况。
而临界资源(共享变量)的值可以是整形变量,反应用于进程间相互合作的同步应用情况,(1)大于零时表示可以使用的资源数,(2)小于零时表示在该信号量上等待的进程数。
2.考虑演示程序是怎样实现在随机调度进程时间、控制进程延迟时间、关闭进程时间的,找出相关函数,变量,并说明。
答:实验所给的c程序是通过运用函数Sleep(P_DELAY)来实现对进程调度、延迟、关闭时间的控制的,其中变量P_DELAY的值为rand()/25*10,其会产生0到1/25*10之间的一个随机数作为随机时间。
但仅仅有rand()/25*10不够,因为这只会产生一个伪随机数,即每次产生的随机数一样,所以实验所给的c程序中还用了一个srand()。函数srand(0被称为随机数生成器的初始化器,函数srand()可以为随机数生成器生成种子,只要种子不同,rand()就会生成不同的随机数序列。