读者写者问题

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

相关文档
最新文档