读者和写者问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:
课程设计
课程名称操作系统
学院计算机科学与技术学院
专业软件工程专业
班级
姓名
指导教师
2014——2015学年第1学期
目录
目录 ....................................................................................................................................... 错误!未定义书签。
1 设计概述 (3)
1.1问题描述: (3)
1.2问题解读及规则制定 (3)
2课程设计目的及功能 (3)
2.1 设计目的 (3)
2.2 设计功能 (3)
3模块介绍 (3)
3.1函数原型 (3)
3.2 PV操作代码 (4)
4测试用例,运行结果与运行情况分析 (6)
4.1测试用例 (6)
4.2运行结果 (7)
4.3运行情况分析 (9)
5自我评价与总结 (9)
6 参考文献 (10)
7 附录:(完整代码) (10)
实现读者写者(Reader-Writer Problem)问题
1 设计概述
1.1问题描述:
通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
1.2问题解读及规则制定
一个数据文件或记录可被多个进程所共享,我们将其中只要求读该文件的进程称为读者,其他进程称为写者.多个读者和多个写者进程在某个时间段内对该文件资源进行异步操作,也就是说允许多个进程同时读一个共享对象,但不允许一个写进程和其他读进程或写进程同时访问共享对象,因此,所谓"读者--写者问题"就是指必须保证一个写进程和其他进程(写进程或者读进程)互斥地访问共享对象的同步问题.两者的读写操作限制规则如下:
(1)写--写互斥,即不允许多个写着同时对文件进行写操作
(2)读--写互斥,即不允许读者和写者同时对文件分别进行读写操作
(3)读—读允许,即允许多个读者同时对文件进行读操作
2课程设计目的及功能
2.1 设计目的
通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:
1)掌握基本的同步互斥算法,理解读者和写者模型
2)了解多线程的并发执行机制,线程间的同步和互斥
2.2 设计功能:
利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉及的进程的同步与互斥。
3模块介绍
3.1函数原型
读者和写者进程由11个函数组成,分别如下: (附件包含全部具体实现)
void P_write(int);
void write(int);
void V_write(int);
void P_radd(int);
void radd(int);
void P_read(int);
void V_radd(int);
void read(int);
void P_rsub(int);
void rsub(int);
void V_read(int);
void V_rsub(int);
3.2 PV操作代码:
模拟写者对Wmutex的P操作,同时为写者进程也作写的入口:void P_write(int i)
{
Wmutex--;
if(Wmutex<0)
{
w_wait[-Wmutex-1]=i;
}
else
write(i);
}
模拟写者对Wmutex的V操作,写操作完成的时候调用:
void V_write(int i)
{
w[i]=0;
Wmutex++;
if(Wmutex<=0)
{
int k,j;
if((w_wait[0]>=0)&&(w_wait[0] { j=w_wait[0]; for(k=0;k write(j); } else { j=r_wait[0]; for(k=0;k for(k=0;k V_radd(j); } } } 模拟读之前对Rmutex的P操作,同时也作为读者进程的入口:void P_radd(int i) { Rmutex--; if(Rmutex<0) { r_wait[-Rmutex]=i; } else radd(i); } 模拟读者对Wmutex的P操作: void P_read(int i) { Wmutex--; if(Wmutex<0) { w_wait[-Wmutex-1]=10; r_wait[0]=i; } else V_radd(i); } 模拟读之前对Rmutex的V操作: void V_radd(int i) { Rmutex++; if(Rmutex<=0) { int k,j; j=r_wait[0]; for(k=0;k radd(j); } read(i); } 模拟读之后对Rmutex的P操作,读操作完成的时候调用:void P_rsub(int i) { r[i]=0; Rmutex--; rsub(i); } 模拟读者对Wmutex的V操作: void V_read(int i) { Wmutex++; if(Wmutex<=0) { int k,j;