读者写者问题课程设计说明书Word格式.docx
- 文档编号:21476794
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:16
- 大小:142.18KB
读者写者问题课程设计说明书Word格式.docx
《读者写者问题课程设计说明书Word格式.docx》由会员分享,可在线阅读,更多相关《读者写者问题课程设计说明书Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
不仅方便了用户,保证了文件的安全性,还可有效的提高系统资源的利用率操作系统是一门实践性很强的课程,不仅要学习书本上的理论,而且必须动手实践才能对操作系统基本原理真正理解。
本课程设计中的题目能加深学生对教学内容的理解,培养学生初步掌握操作系统基本功能的设计方法及其实现过程。
计算机操作系统是计算机中的关键性技术,它的设计与实现体现了程序设计与软件工程的精髓。
计算机操作系统原理课程那个是计算机科学与技术及相关专业的核心课程,历来为计算机及信息学科所重视。
操作系统原理课程设计正是该课程时间环节的集中表现,它不仅可使学生巩固理论学习的概念、原理、设计及算法,同时也可培养软件开发所应有的系统结构设计和软件工程素养。
关键词:
操作系统文件系统功能调用
1引言
1.1问题的提出
在Windows2000环境下,创建一个控制台进程,此进程包含n个线程。
用这n个线程来表示n个读者或写者。
每个线程按相应测试数据文件的要求进行读写操作。
用信号量机制分别实现读者优先和写者优先问题。
1.2任务与分析
具体要求:
读者-写者问题的读写操作限制(包括读者优先和写者优先)
写-写互斥:
不能有两个写者同时进行写操作
读-写互斥:
不能同时有一个线程在读,而另一个线程在写。
读-读允许:
可以有一个或多个读者在读。
读者优先的附加限制:
如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:
如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:
要求在每个线程创建、发出读写申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。
课程设计目的:
通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。
2程序的主要功能
2.1测试文本录入功能
从指定的文件中录入程序所需要的数据信息。
2.2读者优先判断功能
按thread_info中信息创建线程并执行,当线程类型为R时创建读者线程。
2.3写着优先判断功能
3程序运行平台
Windows98/2000/XP操作系统,以VC++6.0集成开发环境为主要开发工具。
4总体设计
图4.1系统总体框架
5模块分析
5.1测试文本录入模块
打开测试数据文本“thread.txt”,并将其中数据读入thread_info数组中
intnu;
//线程号,nu、ki、de、ru用来临时保存线程信息
charki;
//线程类型
doublede;
//延迟时间
doubleru;
//运行时间
("
thread.txt"
"
r"
);
if(file)
{while(!
feof(file))
{fscanf(file,"
%d%c%lf%lf\n"
&
nu,&
ki,&
de,&
ru);
thread_info[n_thread].num=nu;
thread_info[n_thread].kind=ki;
thread_info[n_thread].delay=de;
thread_info[n_thread++].runtime=ru;
}
}
fclose(file);
5.2读者优先判断模块
1.首先调readfirst()函数,按thread_info中信息创建线程并执行,当线程类型为R时创建读者线程,反之创建写者线程。
主要代码如下:
for(inti=0;
i<
n_thread;
i++)
{if(thread_info[i].kind=='
R'
)
thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(rf_read),&
thread_info[i],0,&
threadID);
//创建读者线程
elseif(thread_info[i].kind=='
W'
thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(rf_write),&
//创建写者线程
2.创建及调度读者线程的函数rf_read():
首先申请读;
然后用一互斥变量rmutex保证修改readcount时无其他读者线程影响,当为第一个申请的读者时应判断当前是否有写者等待或写,等待写操作完毕方才继续执行,释放互斥变量rmutex,完成读者读的过程;
最后用互斥变量rmutex保证修改readcount时无其他读者线程影响,之后释放rmutex。
HANDLErmutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
rmutex"
DWORDde=(DWORD)(((threadinfo*)p)->
delay*1000);
//延迟时间
DWORDru=(DWORD)(((threadinfo*)p)->
runtime*1000);
//执行时间
intnu=((threadinfo*)p)->
num;
Sleep(de);
//等待
printf("
reader%dapply\n"
nu);
WaitForSingleObject(rmutex,-1);
//阻塞rmutex,以便修改readcount
if(++readcount==1)//申请的读者数加1
EnterCriticalSection(&
cs_write);
//如为第一个读者,等待写者写完
ReleaseMutex(rmutex);
//释放互斥变量rmutex
reader%dbegintoread\n"
Sleep(ru);
//执行
reader%dfinished\n"
if(--readcount==0)
LeaveCriticalSection(&
//释放rmutex
3.写者线程rf_write():
首先申请写操作;
然后等待进入临界区cs_write,执行写操作;
最后释放临界资源cs_write,完成写操作。
DWORDde=(DWORD)(((threadinfo*)(p))->
delay*1000);
DWORDru=(DWORD)(((threadinfo*)(p))->
runtime*1000);
writer%dapply\n"
EnterCriticalSection(&
writer%dbegintowrite\n"
writer%dfinished\n"
LeaveCriticalSection(&
5.3读者优先判断模块
1.首先调writefirst()函数,按thread_info中信息创建线程并执行,当线程类型为R时创建读者线程,反之创建写者线程。
thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(wf_read),&
thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(wf_write),&
2.创建及调度读者线程的函数wf_read():
然后用一互斥变量mutex保证当前只有一个读者进入cs_read临界区,然后用一互斥变量rmutex保证修改readcount时无其他读者线程影响,当为第一个申请的读者时应判断当前是否有写者等待或写,等待写操作完毕方才继续执行,完成进入临界区的过程,释放临界区并释放互斥变量mutex及rmutex以便其他读者访问临界区cs_read,完成读者读的过程;
HANDLEmutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
mutex"
WaitForSingleObject(mutex,-1);
//阻塞互斥变量mutex
cs_read);
readcount++;
//申请的读者数加1
if(readcount==1)
//让其他读者进去临界区
ReleaseMutex(mutex);
//释放互斥变量mutex
readcount--;
if(readcount==0)
3.写者线程wf_write()与读者线程有些类似,但也有不同:
首先也是申请写操作;
然后用互斥变量wmutex完成修改writecount及进入临界区cs_write的过程,若为第一个申请的写者应等待当前进行的读者读完,之后释放互斥变量wmutex,执行读操作(注意:
此时并未释放临界资源cs_write,即一次仅允许一个写者写);
最后释放临界资源cs_write,完成写操作,然后用互斥变量wmutex完成修改writecount,如为当前最后一个写者则释放临界区变量cs_read,释放互斥变量wmutex。
HANDLEwmutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
wmutex"
WaitForSingleObject(wmutex,-1);
//阻塞wmutex,以便修改writecount
writecount++;
//当前申请的写者数加1
if(writecount==1)
//如有读者在读,等待
ReleaseMutex(wmutex);
//释放互斥变量wmutex
writecount--;
//当前申请的写者数减1
if(writecount==0)
//释放互斥变量wmutex
流程图:
6系统测试
6.1读者优先结果
图6-1选择读者优先
图6-2读者优先运行过程及结果
6.2写者优先结果
图6-3选择写者优先
图6-4写者优先运行结果和过程
7结论
本次操作系统课程设计完成的是读者-写者问题,通过学习对线程及其同步机制有了很的学习和掌握.并认识到同步可以保证在一个时间内只有一个线程对某个资源有控制权。
共享资源包括全局变量、公共数据成员或者句柄等。
同步还可以使得有关联交互作用的代码按一定的顺序执行。
参考文献
1.张尧学等编著.计算机操作系统教程.北京:
清华大学出版社,2006.02
2.汤子瀛等编著.计算机操作系统.西安:
西安电子科技出版社,1996.12
3.陈向群编著.操作系统教程.北京:
北京大学出版社,2007.01
4.罗宇等编著.操作系统课程设计.北京:
机械工业出版社,2005.9
附录
#include<
windows.h>
stdio.h>
conio.h>
io.h>
#defineN30//最大线程数
#defineS1000
intreadcount=0;
//读者数
intwritecount=0;
//写者数
//临界区
CRITICAL_SECTIONcs_write;
CRITICAL_SECTIONcs_read;
FILE*file;
structthreadinfo
{intnum;
//线程号
charkind;
//线程类型
doubledelay;
doubleruntime;
//运行时间
};
threadinfothread_info[N];
//线程信息数组
HANDLEthread[N];
//线程句柄
//读者优先读者线程,P保存读者线程信息
voidrf_read(void*p)
{
HANDLErmutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
DWORDde=(DWORD)(((threadinfo*)p)->
DWORDru=(DWORD)(((threadinfo*)p)->
intnu=((threadinfo*)p)->
Sleep(de);
printf("
WaitForSingleObject(rmutex,-1);
if(++readcount==1)//申请的读者数加1
EnterCriticalSection(&
ReleaseMutex(rmutex);
Sleep(ru);
if(--readcount==0)
LeaveCriticalSection(&
}
//读者优先写者线程,P保存写者线程信息
voidrf_write(void*p)
DWORDde=(DWORD)(((threadinfo*)(p))->
DWORDru=(DWORD)(((threadinfo*)(p))->
//读者优先
voidreaderfirst(intn_thread)
for(inti=0;
{if(thread_info[i].kind=='
)
thread_info[i],0,NULL);
thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(rf_write),&
WaitForMultipleObjects(n_thread,thread,true,-1);
Allfinished!
\n"
//写者优先读者线程,p保存读者线程信息
voidwf_read(void*p)
HANDLEmutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
WaitForSingleObject(mutex,-1);
readcount++;
if(readcount==1)
ReleaseMutex(mutex);
readcount--;
if(readcount==0)
//写者优先写者线程,p保存写者线程信息
voidwf_write(void*p)
WaitForSingleObject(wmutex,-1);
writecount++;
//当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 读者 问题 课程设计 说明书