操作系统原理课程设-计读者写者问题说明书.doc_第1页
操作系统原理课程设-计读者写者问题说明书.doc_第2页
操作系统原理课程设-计读者写者问题说明书.doc_第3页
操作系统原理课程设-计读者写者问题说明书.doc_第4页
操作系统原理课程设-计读者写者问题说明书.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数学与计算机学院 课程设计说明书 课 程 名 称: 操作系统原理-课程设计 课 程 代 码: 题 目: 读者写者问题 年级/专业/班: 学 生 姓 名: 学 号: 开 始 时 间: 2011 年 12 月 05 日 完 成 时 间: 2011 年 12 月 25 日 课程设计成绩: 学习态度及平 时成绩(30) 技术水平与实际 能力(20) 创新 (5) 说明书撰写质量(45) 总 分 (100) 指导教师签名: 年 月 日 西华大学数计学院课程设计说明书 1 目 录 1 引引 言言 .1 1 1.1 问题的提出 .1 1.2 任务于分析.1 2 程序的主要功能程序的主要功能 .2 2 2.1 测试文本录入功能.2 2.2 读者优先判断功能.2 2.3 写者优先判断功能 .2 3 程序运行平台程序运行平台 .3 3 4 总体设计总体设计 .4 4 5 模块分析模块分析.5 5 5.1 测试文本录入模块 .5 5.2 读者优先判断模块 .5 5.3 写者优先判断模块 .5 6 系统测试系统测试 .7 7 7 结论结论 .8 8 致致 谢谢 .8 8 参考文献参考文献 .1010 读者写者问题 2 摘 要 在现代操作系统中,几乎毫无例外的都是通过文件系统来组织和管理在计算机 中所存储的大量程序和数据;或者说,文件系统的管理功能,使通过把它所管理的 程序和数据组织成一系列文件来实现的。文件系统负责管理在外存上的文件,并把 对文件的存取、共享和保护等功能调用提供给用户。不仅方便了用户,保证了文件 的安全性,还可有效的提高系统资源的利用率操作系统是一门实践性很强的课程, 不仅要学习书本上的理论,而且必须动手实践才能对操作系统基本原理真正理解。 本课程设计中的题目能加深学生对教学内容的理解,培养学生初步掌握操作系统基 本功能的设计方法及其实现过程。 计算机操作系统是计算机中的关键性技术,它的设计与实现体现了程序设计与 软件工程的精髓。计算机操作系统原理课程那个是计算机科学与技术及相关专业的 核心课程,历来为计算机及信息学科所重视。操作系统原理课程设计正是该课程时 间环节的集中表现,它不仅可使学生巩固理论学习的概念、原理、设计及算法,同 时也可培养软件开发所应有的系统结构设计和软件工程素养。 关键词:操作系统 文件系统 功能调用 西华大学数学与计算机学院课程设计说明书 1 1 1 引引 言言 1.1 问题的提出 在 Windows2000 环境下,创建一个控制台进程,此进程包含 n 个线程。用这 n 个线 程来表示 n 个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信 号量机制分别实现读者优先和写者优先问题。 1.2 任务与分析 具体要求具体要求: 读者-写者问题的读写操作限制(包括读者优先和写者优先) 写-写互斥:不能有两个写者同时进行写操作 读-写互斥:不能同时有一个线程在读,而另一个线程在写。 读-读允许:可以有一个或多个读者在读。 读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作, 则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问 共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写操作和结束读 写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 课程设计目的:课程设计目的: 通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关 基本概念的理解,并学习如何将基本原理和实际设计有机的结合。 读者写者问题 2 2 程序的主要功能 2.1 测试文本录入功能 从指定的文件中录入程序所需要的数据信息。 2.2 读者优先判断功能 按 thread_info 中信息创建线程并执行,当线程类型为 R 时创建读者线程。 2.3 写着优先判断功能 按 thread_info 中信息创建线程并执行,当线程类型为 R 时创建读者线程。 西华大学数学与计算机学院课程设计说明书 3 3 程序运行平台 Windows98/2000/XP 操作系统,以 VC+ 6.0 集成开发环境为主要开发工具。 读者写者问题 4 4 4 总体设计总体设计 读者优先处理函数写者优先处理函数数 处理读者线程函数处理写者线程函数处理读者线程函数处理写者线程函数 主 函 数 图 4.1 系统总体框架 西华大学数学与计算机学院课程设计说明书 5 5 5 模块分析模块分析 5.1 测试文本录入模块 打开测试数据文本“thread.txt”,并将其中数据读入 thread_info 数组中 int nu;/线程号,nu、ki、de、ru 用来临时保存线程信息 char ki;/线程类型 double de;/延迟时间 double ru;/运行时间 file=fopen(thread.txt,r); if(file) while(!feof(file) fscanf(file,%d %c %lf %lfn, thread_infon_thread.num=nu; thread_infon_thread.kind=ki; thread_infon_thread.delay=de; thread_infon_thread+.runtime=ru; fclose(file); 5.2 读者优先判断模块 1.1.首先调 readfirst()函数,按 thread_info 中信息创建线程并执行,当线程类型为 R 时创建读者线程,反之创建写者线程。主要代码如下: for(int i=0;idelay *1000); /延迟时间 DWORD ru=(DWORD)(threadinfo*)p)-runtime *1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(reader %d applyn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount if(+readcount=1) /申请的读者数加 1 EnterCriticalSection(/如为第一个读者,等待写者写完 ReleaseMutex(rmutex);/释放互斥变量 rmutex printf(reader %d begin to readn,nu); Sleep(ru); /执行 printf(reader %d finishedn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount if(-readcount=0) LeaveCriticalSection( ReleaseMutex(rmutex);/释放 rmutex 3.3.写者线程 rf_write():首先申请写操作;然后等待进入临界区 cs_write,执行写操 作;最后释放临界资源 cs_write,完成写操作。 DWORD de=(DWORD)(threadinfo*)(p)-delay*1000);/延迟时间 DWORD ru=(DWORD)(threadinfo*)(p)-runtime*1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(writer %d applyn,nu); EnterCriticalSection( printf(writer %d begin to writen,nu); Sleep(ru); printf(writer %d finishedn,nu); 西华大学数学与计算机学院课程设计说明书 7 LeaveCriticalSection( 5.3 读者优先判断模块 1.1.首先调 writefirst()函数,按 thread_info 中信息创建线程并执行,当线程类型为 R 时创建读者线程,反之创建写者线程。主要代码如下: for(int i=0;idelay *1000); /延迟时间 DWORD ru=(DWORD)(threadinfo*)p)-runtime *1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(reader %d applyn,nu); WaitForSingleObject(mutex,-1);/阻塞互斥变量 mutex EnterCriticalSection( WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount readcount+;/申请的读者数加 1 if(readcount=1) EnterCriticalSection(/如为第一个读者,等待写者写完 ReleaseMutex(rmutex);/释放互斥变量 rmutex LeaveCriticalSection(/让其他读者进去临界区 ReleaseMutex(mutex);/释放互斥变量 mutex printf(reader %d begin to readn,nu); Sleep(ru); /执行 printf(reader %d finishedn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount readcount-; if(readcount=0) 读者写者问题 8 LeaveCriticalSection( ReleaseMutex(rmutex);/释放 rmutex 3.3.写者线程 wf_write()与读者线程有些类似,但也有不同:首先也是申请写操作;然后 用互斥变量 wmutex 完成修改 writecount 及进入临界区 cs_write 的过程,若为第一 个申请的写者应等待当前进行的读者读完,之后释放互斥变量 wmutex,执行读操作 (注意:此时并未释放临界资源 cs_write,即一次仅允许一个写者写) ;最后释放临 界资源 cs_write,完成写操作,然后用互斥变量 wmutex 完成修改 writecount,如为 当前最后一个写者则释放临界区变量 cs_read,释放互斥变量 wmutex。 HANDLE wmutex=OpenMutex(MUTEX_ALL_ACCESS,false,wmutex); DWORD de=(DWORD)(threadinfo*)(p)-delay*1000);/延迟时间 DWORD ru=(DWORD)(threadinfo*)(p)-runtime*1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(writer %d applyn,nu); WaitForSingleObject(wmutex,-1);/阻塞 wmutex,以便修改 writecount writecount+; /当前申请的写者数加 1 if(writecount=1) EnterCriticalSection(/如有读者在读,等待 ReleaseMutex(wmutex); /释放互斥变量 wmutex EnterCriticalSection( printf(writer %d begin to writen,nu); Sleep(ru); printf(writer %d finishedn,nu); LeaveCriticalSection( WaitForSingleObject(wmutex,-1); writecount-;/当前申请的写者数减 1 if(writecount=0) LeaveCriticalSection( ReleaseMutex(wmutex);/释放互斥变量 wmutex 西华大学数学与计算机学院课程设计说明书 9 流程图: 结束 将数据读入 threadinfo 数组 输入选择 0、1、或 2 读完,读者数- 1,如读者数 为 0,允许写 者写 如有读者在读 直接进入,否 则等写者写完, 将读者数+1 调函数 rf_write 写操作 等读者读, 写者写 调函数 rf_read 线程 R线程 W 最后线程 否 是 开始 2 1 0 调函数 readerfirst调函数 writerfirst 最后线程 是 否 读完,读者数 -1,如读者数 为 0,允许写 者写 有读者读无写 者等时进入读, 读者数+1,反 之等待 线程 R 调函数 rf_write 线程 W 写操作 调函数 rf_read 等读者读, 写者写 读者写者问题 10 6 系统测试 6.1 读者优先结果 图 6-1 选择读者优先 图 6-2 读者优先运行过程及结果 西华大学数学与计算机学院课程设计说明书 11 6.2 写者优先结果 图 6-3 选择写者优先 图 6-4 写者优先运行结果和过程 读者写者问题 12 7 7 结论结论 本次操作系统课程设计完成的是读者-写者问题,通过学习对线程及其同步机制有了很 的学习和掌握. 并认识到同步可以保证在一个时间内只有一个线程对某个资源有控制权。 共享资源包括全局变量、公共数据成员或者句柄等。同步还可以使得有关联交互作用的代 码按一定的顺序执行。 西华大学数学与计算机学院课程设计说明书 13 参考文献参考文献 1张尧学等编著. 计算机操作系统教程.北京:清华大学出版社,2006.02 2汤子瀛等编著.计算机操作系统.西安:西安电子科技出版社,1996.12 3陈向群 编著.操作系统教程.北京:北京大学出版社,2007.01 4罗宇 等编著.操作系统课程设计.北京:机械工业出版社,2005.9 读者写者问题 14 附附 录录 #include #include #include #include #define N 30 /最大线程数 #define S 1000 int readcount=0;/读者数 int writecount=0;/写者数 /临界区 CRITICAL_SECTION cs_write; CRITICAL_SECTION cs_read; FILE *file; struct threadinfo int num; /线程号 char kind; /线程类型 double delay; /延迟时间 double runtime; /运行时间 ; threadinfo thread_infoN;/线程信息数组 HANDLE threadN;/线程句柄 /读者优先 读者线程,P 保存读者线程信息 void rf_read(void *p) HANDLE rmutex=OpenMutex(MUTEX_ALL_ACCESS,false,rmutex); DWORD de=(DWORD)(threadinfo*)p)-delay *1000); /延迟时间 DWORD ru=(DWORD)(threadinfo*)p)-runtime *1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(reader %d applyn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount if(+readcount=1) /申请的读者数加 1 EnterCriticalSection(/如为第一个读者,等待写者写完 ReleaseMutex(rmutex);/释放互斥变量 rmutex printf(reader %d begin to readn,nu); Sleep(ru); /执行 printf(reader %d finishedn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount if(-readcount=0) LeaveCriticalSection( ReleaseMutex(rmutex);/释放 rmutex 西华大学数学与计算机学院课程设计说明书 15 /读者优先 写者线程,P 保存写者线程信息 void rf_write(void *p) DWORD de=(DWORD)(threadinfo*)(p)-delay*1000);/延迟时间 DWORD ru=(DWORD)(threadinfo*)(p)-runtime*1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(writer %d applyn,nu); EnterCriticalSection( printf(writer %d begin to writen,nu); Sleep(ru); printf(writer %d finishedn,nu); LeaveCriticalSection( /读者优先 void readerfirst(int n_thread) for(int i=0;idelay *1000); /延迟时间 DWORD ru=(DWORD)(threadinfo*)p)-runtime *1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(reader %d applyn,nu); WaitForSingleObject(mutex,-1);/阻塞互斥变量 mutex EnterCriticalSection( WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount readcount+;/申请的读者数加 1 if(readcount=1) 读者写者问题 16 EnterCriticalSection(/如为第一个读者,等待写者写完 ReleaseMutex(rmutex);/释放互斥变量 rmutex LeaveCriticalSection(/让其他读者进去临界区 ReleaseMutex(mutex);/释放互斥变量 mutex printf(reader %d begin to readn,nu); Sleep(ru); /执行 printf(reader %d finishedn,nu); WaitForSingleObject(rmutex,-1);/阻塞 rmutex,以便修改 readcount readcount-; if(readcount=0) LeaveCriticalSection( ReleaseMutex(rmutex);/释放 rmutex /写者优先 写者线程,p 保存写者线程信息 void wf_write(void *p) HANDLE wmutex=OpenMutex(MUTEX_ALL_ACCESS,false,wmutex); DWORD de=(DWORD)(threadinfo*)(p)-delay*1000);/延迟时间 DWORD ru=(DWORD)(threadinfo*)(p)-runtime*1000);/执行时间 int nu=(threadinfo*)p)-num; Sleep(de); /等待 printf(writer %d applyn,nu); WaitForSingleObject(wmutex,-1);/阻塞 wmutex,以便修改 writecount writecount+; /当前申请的写者数加 1 if(writecount=1) EnterCriticalSection(/如有读者在读,等待 ReleaseMutex(wmutex); /释放互斥变量 wmutex EnterCriticalSection( printf(writer %d begin to writen,nu); Sleep(ru); printf(writer %d finishedn,nu); LeaveCriticalSection( WaitForSingleObject(wmutex,-1); writecount-;/当前申请的写者数减 1 if(writecount=0) LeaveCriticalSection( ReleaseMutex(wmutex);/释放互斥变量 wmutex /写者优先 void writerfirst(int n_thread) for(int i=0;in_thread;i+) 西华大学数学与计算机学院课程设计说明书 17 if(thread_infoi.kind=R) threadi=CreateThread(NULL,0,(LPTHREA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论