- 1、本文档共50页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《操作系统》实验报告
实验序号:操作系统实验(二) 实验项目名称:读者写者问题
学 号
姓 名
队别
实验地点
指导教员
实验时间
一、实验目的及要求
实验目的:综合运用多进程并发控制,进程同步互斥,信号量机制等原理解决问题。
实验要求:本题目安排16学时,要求党员根据题目要求,写出算法,在VC平台上进行程序设计和调试,在运行成功的基础上,整理出源程序和运行结果.写出设计报告。
二、实验设备(环境)
实验设备: WINDOWS 2000环境、VC平台、WIN 32 API
三、实验内容与步骤
实验内容与步骤:可以将所有读者和写者分别存于一个读者等待队列和一个写者等待队列,每当读允许时,就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作.
a)读者优先
读者优先指的是除非有写者在写文件,否则读者不需要等待.所以可以用一个整形变量记录当前读者的数目,用于确定是否需要释放正在等待的写者线程.每一个读者开始读文件时,必须修改变量.因此需要一个互斥对象mutex来实现对全局变量修改时的互斥.
另外,为了实现写互斥,需要增加一个临界区对象 write.当写者发出写请求时,必须申请临界区对象的所有权.通过这种方法,也可以实现读写互斥,当read_count=1时,读者线程也必须申请临界区对象的所有权.
当读者拥有临界区所有权时,写者阻塞在临界区对象write上.当写者拥有上,其write”后阻塞在read_count==1临界区所有权时,第一个读者判断完”
余的读者由于等待对read_count的判断,阻塞在mutex上.
b)写者优先
写者优先与读者优先类似.不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作.为此应当添加一个整形变量write_count,用于记录正在等待的写者的数目,当write_count=0时,才可以释放等待的读者线程队列.
为了对全局变量write_count实现互斥,必须增加一个对象mutex3.
为了实现写者优先,应当添加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上.
读者线程除了要对全局变量read_count实现操作上的互斥外,还必须有一个互斥对象对阻塞read这一过程实现互斥.这两个互斥对象分别命名为mutex1和mutex2。
四、实验结果与数据处理
源代码
#include windows.h
#include ctype.h
#include stdio.h
#include string.h
#include stdlib.h
#include malloc.h
#define MAX_PERSON 100
#define READER 0 //读者
#define WRITER 1 //写者
#define END -1
#define R READER
#define W WRITER
typedef struct _Person
{
HANDLE m_hThread;//定义处理线程的句柄
进程类型(读写)int m_nType;//
int m_nStartTime;//开始时间
int m_nWorkTime;//运行时间
int m_nID;//进程号
}Person;
Person g_Persons[MAX_PERSON];
int g_NumPerson = 0;
long g_CurrentTime= 0;//基本时间片数
int g_PersonLists[] = {//进程队列
1, W, 4, 5, 2, W, 16, 4, 3, R, 5, 2,
4, W, 6, 5, 5, R, 4, 3,
END,
};
int g_NumOfReading = 0;
int g_NumOfWriteRequest = 0;//申请写进程的个数
HANDLE g_hReadSemaphore;//读者信号
HANDLE g_hWriteSemaphore;//写者信号
bool finished = false; //所有的读完成
//bool wfinished =
文档评论(0)