版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机与信息学院操作系统课程设计报告一、 开题报告(一) 该项课程设计的意义;1. 更加深入的了解读者写者问题的算法;2. 加深对线程,进程的理解;3. 加深对“线程同步”概念的理解,理解并应用“信号量机制”;4. 熟悉计算机对处理机的管理,了解临界资源的访问方式;5. 了解c+中线程的实现方式,研读api。(二) 课程设计的任务多进程/线程编程:读者-写者问题。 l 设置两类进程/线程,一类为读者,一类为写者;l 随机启动读者或写者;l 显示读者或写者执行状态;l 随着进程/线程的执行,更新显示;(三) 相关原理及算法描述;整体概况:该程序从大体上来分只有两个模块,即“读者优先”和“写者优先
2、”模块. 读者优先:如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时.每个读者准备读. 等待互斥信号,保证对readcount 的访问,修改互斥.即readcount+.而当读者线程进行读操作时,则读者数目减少(readcount-).当readcout=0 时,说明所有的读者都已经读完,离开临界区唤醒写者(leavecriticalsection(&rp_write);), 释放互斥信号(releasemutex(h_mutex).还需要一个互斥对象mutex来实现对全局变量
3、read_count修改时的互斥. 另外,为了实现写-写互斥,需要增加一个临界区对象write。当写者发出写请求时,必须申请临界区对象的所有权。通过这种方法,可以实现读-写互斥,当read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权写者优先:写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加一个整形变量write_count,用于记录正在等待的写者的数目,write_count的初值为0.当线程开始调入时.只允许一个写者准备读. 等待互斥信号,保证对write_count
4、的访问,修改互斥.即write_count+.而当写者线程进行读操作时,则相应写者数目减少(write_count-).当write_count=0 时,说明所有的读者都已经读完,离开临界区唤醒读者,释放互斥信号.为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。(四) 开发环境;vc+6.0(五) 预期设计目标;读者-写者问题的读写操作限制(包括读者优先和写者优先)1.写-写互斥:不能有两个写者同时进行写操作2.读-写互斥:不能同时有一个线程在读,而另一个线程在写。3.读-读允许:可以有一个或多个读者在读。若读者的优先权比写者高, 如果读者
5、申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作.不必经过别的操件若读者的优先权比写者高,如果第一个写者已经占有了文件的时候.则别的读者必需等待该操作完成后.才能开始读操作.若写者的优先权比读者高, 在一个写者提出要访问文件时,就必须使其尽可能的得到文件,而且不用调配。完成课程设计的任务,实现读者写者问题的全部要求,同时可以实现“读者优先”和“写者优先”两种情况,有时间的话,争取实现可视化图形界面。二、 课程设计报告(一) 课程设计任务、要求、目的;任务和要求:多进程/线程编程:读者-写者问题。 l 设置两类进程/线程,一类为读者,一类为写者;l 随机启动读者或写者;l
6、显示读者或写者执行状态;l 随着进程/线程的执行,更新显示;目的:1 更加深入的了解读者写者问题的算法;2 加深对线程,进程的理解;3 加深对“线程同步”概念的理解,理解并应用“信号量机制”;4 熟悉计算机对处理机的管理,了解临界资源的访问方式;5 了解c+中线程的实现方式,研读api。(二) 原理及算法描述;写者优先原理图:读者优先原理图:算法描述:读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。(三) 开
7、发环境;vc+6.0(四) 重要算法和设计思路描述;整体概况:该程序从大体上来分只有两个模块,即“读者优先”和“写者优先”模块. 读者优先:如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时.每个读者准备读. 等待互斥信号,保证对readcount 的访问,修改互斥.即readcount+.而当读者线程进行读操作时,则读者数目减少(readcount-).当readcout=0 时,说明所有的读者都已经读完,离开临界区唤醒写者(leavecriticalsection(&rp_w
8、rite);), 释放互斥信号(releasemutex(h_mutex).还需要一个互斥对象mutex来实现对全局变量read_count修改时的互斥. 另外,为了实现写-写互斥,需要增加一个临界区对象write。当写者发出写请求时,必须申请临界区对象的所有权。通过这种方法,可以实现读-写互斥,当read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权写者优先:写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加一个整形变量write_count,用于记录正在等待的写者的数目,
9、write_count的初值为0.当线程开始调入时.只允许一个写者准备读. 等待互斥信号,保证对write_count 的访问,修改互斥.即write_count+.而当写者线程进行读操作时,则相应写者数目减少(write_count-).当write_count=0 时,说明所有的读者都已经读完,离开临界区唤醒读者,释放互斥信号.为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。(五) 程序实现-数据结构;相关windowsapi说明:createthread: 创建一个在调用进程的地址空间中执行的线程。exitthread sleep:
10、对指定的时间间隔挂起当前的执行线程createmutex: 创建有名或者无名的互斥对象releasemutex:waitforsingleobject: 当发生(1)指定对象处于信号态(2)超时 则该函数返回waitformultipleobject: 任意一个或全部指定对象处于信号态或超时间隔已过时,返回createsemapore: 创建一个有名或无名信号对象。releasesemapore: initializecriticalsection: 初始化临界区对象entercriticalsection: 等待指定临界区对象的所有权。当调用线程被赋予所有权时,返回。leavecritica
11、lsection:该函数释放指定临界区对象的所有权。(六) 程序实现-程序清单;#include <windows.h>/#include <ctype.h>/#include <stdio.h>/#include <string.h>/#include <stdlib.h>/#include <malloc.h>#include<iostream>using namespace std;#define max_person 100 /最多100人#define reader 0 /读者#define writ
12、er 1 /写者#define end -1 /结束/#define r reader/#define w writertypedef struct handle m_hthread;/定义处理线程的句柄int type;/进程类型(读写)int starttime;/开始时间int worktime;/运行时间int id;/进程号person;person personsmax_person;int numofperson = 0;long currenttime= 0;/基本时间片数int personlists = /进程队列1, writer, 3, 5,2, writer, 16,
13、 5,3, reader, 2, 2,4, writer, 6, 5,5, reader, 4, 3,6, reader, 17,7,end,;int numofreading = 0;int numofwriterequest = 0;/申请写进程的个数handle readsemaphore;/读者信号handle writesemaphore;/写者信号bool finished = false; /所有的读完成/bool wfinished = false; /所有的写完成void createpersonlist(int *ppersonlist);bool createreader
14、(int starttime,int worktime,int id);bool createwriter(int starttime,int worktime,int id);dword winapi readerproc(lpvoid lpparam);dword winapi writerproc(lpvoid lpparam);int main()readsemaphore = createsemaphore(null,1,100,null); /创建信号量,当前可用的资源数为1,最大为100/*handle createsemaphore( lpsecurity_attributes
15、 lpsemaphoreattributes, /lpsemaphoreattributes为安全属性 long linitialcount, /linitialcount为semaphore的初始值 long lmaximumcount, /lmaximumcount为最大值 lpctstr lpname /lpname为semaphore对象的名字,null表示创建匿名semaphore );*/writesemaphore = createsemaphore(null,1,100,null); /创建信号量,当前可用的资源数为1,最大为100createpersonlist(person
16、lists); / 创建所有读者写者cout<<"创建所有的读者写者"<<"n.n"currenttime = 0;while(true)currenttime+;sleep(300); / 300 mscout<<"当前时间 = "<<currenttime<<endl;if(finished) return 0;/ return 0;void createpersonlist(int *ppersonlists)int i=0;int *plist = ppersonli
17、sts;bool ret;while(plist0 != end)switch(plist1)case reader:ret = createreader(plist2,plist3,plist0);break;case writer:ret = createwriter(plist2,plist3,plist0);break;if(!ret)printf("create person %d is wrongn",plist0);plist += 4; / 寻找下一个读者或者写者 bool createreader(int starttime,int worktime,in
18、t id)dword dwthreadid;if(numofperson >= max_person)return false;person *pperson = &personsnumofperson;pperson->id = id;pperson->starttime = starttime;pperson->worktime = worktime;pperson->type = reader;numofperson+;/ 新建进程pperson->m_hthread= createthread(null,0,readerproc,(lpvoi
19、d)pperson,0,&dwthreadid); /*handle createthread( lpsecurity_attributes lpthreadattributes, / pointer to security attributes 安全属性 dword dwstacksize, / initial thread stack size 堆栈大小 lpthread_start_routine lpstartaddress, / pointer to thread function 函数指针 lpvoid lpparameter, / argument for new thr
20、ead dword dwcreationflags, / creation flags lpdword lpthreadid / pointer to receive thread id );*/if(pperson->m_hthread = null)return false;return true;bool createwriter(int starttime,int worktime,int id) dword dwthreadid;if(numofperson >= max_person) return false;person *pperson = &person
21、snumofperson;pperson->id = id;pperson->starttime = starttime;pperson->worktime = worktime;pperson->type = writer;numofperson+;/ 新建进程pperson->m_hthread= createthread(null,0,writerproc,(lpvoid)pperson,0,&dwthreadid);/*handle createthread( lpsecurity_attributes lpthreadattributes, /
22、pointer to security attributes 安全属性 dword dwstacksize, / initial thread stack size 堆栈大小 lpthread_start_routine lpstartaddress, / pointer to thread function 函数指针 lpvoid lpparameter, / argument for new thread dword dwcreationflags, / creation flags lpdword lpthreadid / pointer to receive thread id );*
23、/if(pperson->m_hthread = null)return false;return true;dword winapi readerproc(lpvoid lpparam)/读过程person *pperson = (person *)lpparam;/ 等待启动时间while(currenttime != pperson->starttime)/读操作还没有到达执行时间,则等待printf("reader %d is requesting .n",pperson->id);printf("nn*n");/等待写者请求/
24、该语句在写者优先的时候是认为写者优先级高于读者,在有写者的时候读者需要等候,而在读者优先的时候,不用判断是否存在写者,有读者时即开始读操作。 while(numofwriterequest != 0)/numofwriterequest != 0 表示有写者在等待,不能读/等待readsemaphore读信号,即当readsemaphore有信号时等待结束,相当于p操作waitforsingleobject(readsemaphore,infinite); /*dword waitformultipleobjects( const handle *lphandles, / pointer to
25、 the object-handle array dword dwmilliseconds / time-out interval in milliseconds );*/if(numofreading = 0)/当第一个读者到了,如果writesemaphore信号灯灭了,说明有写者在写,读者必须等待,即互斥写操作waitforsingleobject(writesemaphore,infinite); numofreading+;/还有读者,但是允许下一个读进程读取,相当于v操作releasesemaphore(readsemaphore,1,null); /*bool releasese
26、maphore(handle hsemaphore,/lpreleasecount参数表示要增加的数值long lreleasecount, /lppreviouscount参数用于返回之前的计算值,如果不需要可以设置为null lplong lppreviouscount);*/ 启动读者pperson->starttime = currenttime; printf("reader %d is reading the critical section.n",pperson->id);printf("nn*n"); while(curren
27、ttime <= pperson->starttime + pperson->worktime)/ . 执行读操作printf("reader %d is exit.n",pperson->id);printf("nn*n");waitforsingleobject(readsemaphore,infinite);numofreading-;if(numofreading = 0) releasesemaphore(writesemaphore,1,null);/此时没有读者,可以写releasesemaphore(readsem
28、aphore,1,null);if(pperson->id = 6 ) finished = true; /所有的读写完成exitthread(0);return 0;dword winapi writerproc(lpvoid lpparam)person *pperson = (person *)lpparam;/ 等待启动时间while(currenttime != pperson->starttime) printf("writer %d is requesting .n",pperson->id);printf("nn*n"); numofwriterequest+;/在写者优先的时候需要用自加来初始信号值,而在读者优先的时是通过读者操作来控制信号值waitforsin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年一线班组员工安全培训题库
- 2025年摊铺机租赁与施工材料保障合同范本3篇
- 除薄冰机课程设计
- 年度多媒体集成竞争策略分析报告
- 二零二五年度模板木枋行业信息化平台建设合同4篇
- 水沟勾缝施工方案
- 文明施工方案范本
- 二零二五年度环保型门卫室建设合同4篇
- 2025年度个人股权无偿转让及公司资产评估协议2篇
- 隔声罩课程设计模板
- 寒假作业一年级上册《数学每日一练》30次打卡
- 2024-2025学年九年级化学上册 第二单元 单元测试卷(人教版)
- 2024年公共卫生基本知识考试题库(附含答案)
- 2024多级AO工艺污水处理技术规程
- 2024年江苏省盐城市中考数学试卷真题(含答案)
- DZ∕T 0287-2015 矿山地质环境监测技术规程(正式版)
- 2024年合肥市庐阳区中考二模英语试题含答案
- 质检中心制度汇编讨论版样本
- 药娘激素方案
- 提高静脉留置使用率品管圈课件
- GB/T 10739-2023纸、纸板和纸浆试样处理和试验的标准大气条件
评论
0/150
提交评论