完整word版操作系统 缓冲池的模拟使用word文档良心出品_第1页
完整word版操作系统 缓冲池的模拟使用word文档良心出品_第2页
完整word版操作系统 缓冲池的模拟使用word文档良心出品_第3页
完整word版操作系统 缓冲池的模拟使用word文档良心出品_第4页
完整word版操作系统 缓冲池的模拟使用word文档良心出品_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称缓冲池的模拟使用课程名称操作系统课程号学院(系)软件学院专业软件工程班级软件1103学生姓名钟海楼学号2010117013* 实验地点04004实验日期2012-05-08、实验目的(1)掌握缓冲池的结构(2 )掌握缓冲池的使用方法二、实验内容1、实现输入、计算、输出进程并发执行;2、实现getBuf和putBuf函数。三、实验步骤还有三个1、整体设计,包括三个线程的模拟设计,三个队列的链表设计, 队列的同步与互斥的设计等;2、由于本次实验没有需要太多的数据结构,因此,数据结构的设计就只有 三个缓冲队列的设计:先构造一个空

2、的缓冲队列,该队列是一个实体,即旦 确定的有结点的链表,它是模拟缓冲池的载体,输入与输出队列在构造时只有它 的头尾指针,而没有它的实体,这是因为它可以从空缓冲区里获得,例如,当计算线程要数据计算时,便可从空队列里获取一个缓冲区,作为输入缓冲使用再把 它挂载到输入队列的队尾中去由于要写的内容比较多,这里就不再废话连篇了,先把代码贴出来,里面有 着注释呢,大家都懂的:头文件如下:0空缓冲队列1输入缓冲队列/缓冲队列类型的定义#defi ne EMQ#defi ne INQ#defi ne OUTQ 2输出缓冲队列显示的宏定义#defi ne show1IIIby CLC软件 1103#defi n

3、e show2III#defi ne show3IIIconst int bufferpoolsize = 50;/缓冲池大小,默认设置为50个结束运行标志short int m_end ;缓冲结构体的定义typedef struct Bufferint BufNo;缓冲区号int buf; 缓冲内容Buffer *n ext;/缓冲指向下一个指针 buffer;/线程函数声明DWORD WINAPI InputThreadFunc(LPVOID IpPara); / 输入线程函数 DWORD WINAPI OutputThreadFunc(LPVOID IpPara); / 输出线程函数 D

4、WORD WINAPI CalThreadFunc(LPVOID IpPara); / 计算线程函数加入与摘取队列函数声明void pu tBuf(i nt type , buffer *buf);buffer* getBuf(i nt typ e);/挂载到队列尾/从队列头中摘取一个缓冲区构造缓冲池函数的声明void Con structBuffer();线程的句柄HANDLE hl npu tT;HANDLE hOut pu tT;HANDLE hCalculateT;输入线程输出线程计算线程/线程的IDDWORD Inpu tTid;DWORD Out pu tTid;DWORD Cal

5、culateTid;输入线程输出线程计算线程三个互斥量信号句柄HANDLE hmutexEMQ;HANDLE hmutexOUTQ;HANDLE hmutexINQ;三个同步信号量HANDLE hsemINQ;HANDLE hsemOUTQ;HANDLE hsemEMQ;Cpp的内容如下:#i nclude wi ndows.h #i nclude iostream #i nclude stdlib.h#i nclude time.h #in clude Mai n1.h using n ames pace std;/三个缓冲队列头与尾指针 buffer *hemq , *hi nq , *h

6、outq;buffer *lemq , *li nq , *loutq;空队列的互斥信号量装满输出队列的互斥信号量装满输入队列的互斥信号量队头指针队尾指针/主函数int main()coutshow1e ndlvvshow2vve ndlvvshow3vve ndlwe ndl;m_end = 1 ;/运行结束标志Co nstructBufferO;/ 构造缓冲池/创建互斥对象hmutexEMQ = CreateMutex(NULL,FALSE,NULL); hmutexOUTQ = CreateMutex(NULL,FALSE,NULL); hmutexINQ = CreateMutex(N

7、ULL,FALSE,NULL);创建信号量对象hsemINQ = CreateSema phore(NULL,O,bufferpoolsize,NULL); hsemOUTQ = CreateSema phore(NULL,0,bufferpoolsize,NULL);hsemEMQ = CreateSema phore(NULL,bufferpoolsize,bufferpoolsize,NULL);创建线程hInputT = CreateThread(NULL,O,l np utThreadFu nc,NULL,0,&lnpu tTid);Slee p(10);hCalculateT =

8、CreateThread(NULL,0,CalThreadFu nc,NULL,0,&CalculateTid);Slee p(10);hOut putT = CreateThread(NULL,0,Out putThreadFu nc,NULL,0,&Out pu tTid);/Slee p(10000);/system( pause); if(getchar() /按回车后终止程序运行m_end = 0 ;coutvv程序已经终止!buf = nRan dom ;coutvv输入线程从缓冲单元 BufNovvdata= vvgetbuf-bufvve ndl;ReleaseMutex(hm

9、utexEMQ); 释放互斥对象信号/控制访问输入队列的互斥量WaitForSi ngleObject(hmutexlNQ,INFINITE);putBuf(INQ,getbuf); 将输入的缓冲区挂载到输入队列的队尾ReleaseMutex(hmutexINQ);ReleaseSema phore(hsemlNQ,1,NULL);return 0;输出线程函数的实现DWORD WINA PI Out pu tThreadFu nc(L PVOID IpP ara)输出线程函数/ 一个临时交换区buffer* Out pu tbuf ;while(m_e nd)Slee p(100);/同步与

10、互斥的控制WaitForSi ngleObject(hsemOUTQ,INFINITE);WaitForSi ngleObject(hmutexOUTQ,INFINITE);Out pu tbuf = getBuf(OUTQ) ;/从输出队列中提取一个提取输出缓冲coutvv输出线程从缓冲单元BufNovv-提取输 出-data= bufvve ndl;/Out pu tbuf-buf = -1 ;提取完成后将该缓冲区回收ReleaseMutex(hmutexOUTQ);WaitForSi ngleObject(hmutexEMQ,INFINITE);putBuf(EMQ,Out pu tbu

11、f);回收的把它挂载到空队列的队尾ReleaseMutex(hmutexEMQ);ReleaseSema phore(hsemEMQ,1,NULL);return 0;/计算线程函数/计算线程函数的实现DWORD WINA PI CalThreadFu nc(L PVOID IpPara)buffer* Calbuf1 = NULL;buffer* Calbuf2 =NULL;int nCal;while(m_e nd)Slee p(10); 因为计算线程的速度远远快于输入与输出线程,所以它的 休眠时间应很小/同步与互斥的控制WaitForSi ngleObject(hsemlNQ,INFIN

12、ITE);WaitForSi ngleObject(hmutexlNQ,INFINITE);Calbuf1 = getBuf(INQ);/从输入队列中提取一个收容输入缓冲区n Cal = Calbuf1-buf;提取数据coutvv计算线程从缓冲单元BufNobufvve ndl;/Calbuf-buf = -1 ;系统将收回此缓冲区,表示该缓冲区已空ReleaseMutex(hmutexINQ);WaitForSi ngleObject(hmutexEMQ,INFINITE); putBuf(EMQ,Calbuf1);ReleaseMutex(hmutexEMQ);ReleaseSema p

13、hore(hsemEMQ,1,NULL);nCal = nCal + 10000 ;/模拟输入数据的处理WaitForSi ngleObject(hsemEMQ,INFINITE);WaitForSi ngleObject(hmutexEMQ,INFINITE);Calbuf2 = getBuf(EMQ);得到一个空的缓冲区作为收容输出Calbuf2-buf = n Cal ;/ 存入运算结果coutvv计算线程从缓冲单元BufNovvdata= bufn ext- n ext != NULL) II取得队列头/修正队列链表头指针的指Retu rn buf = hemq-n ext ; hem

14、q-n ext = Retu rnbuf-n ext;Returnbuf- next = NULL; return Returnbuf;else假如该缓冲队列的个数只有一个的话,贝u使得队头指针与队尾指针相等级这样的话就可以防止队尾指针的丢失Retu rn buf = hemq-n ext ; hemq-n ext = Retu mbuf-n ext;Returnbuf- n ext = NULL; lemq = hemq ;return Returnbuf; break; case 1:if(hi nq != linq & hin q- next- next != NULL) Retu rn

15、 buf = hinq-n ext; hinq-n ext = Retu rnbuf-n ext;Returnbuf- next =NULL; return Returnbuf;elseRetu rn buf = hinq-n ext ; hinq-n ext = Retu mbuf-n ext; Returnbuf- n ext = NULL;linq = hinq;return Returnbuf;break; case 2:if(houtq != loutq & houtq- next- n ext !=NULL ) Retu rn buf = houtq-n ext ; houtq-n

16、 ext = Retu rnbuf-n ext; Returnbuf- n ext = NULL; return Returnbuf;elseRetu rn buf = houtq-n ext; houtq-n ext = Retu rnbuf-n ext ; Returnbuf- n ext = NULL;loutq = houtq; return Returnbuf;break; /把某一类型的缓冲区挂载到队尾函数 (实际相当于插入一个结点操作) void pu tBuf(i nt type , buffer* buf)switch(t ype)case 0:该参数(buf)不为空的时候,

17、才执行,因修正队列尾指针/队尾指针的跟踪/队列尾指针赋空if(buf != NULL)为插入一个空的缓冲区是没有意义的lemq-n ext = buf; lemq = buf ;lemq-n ext = NULL;break;case 1:if(buf != NULL)/同上linq-n ext = buf;linq = buf;linq- next = NULL;break;case 2:if(buf != NULL )loutq-n ext = buf; loutq = buf;loutq- next = NULL; break;/构造缓冲池函数的声明 void Con structBuf

18、fer()buffer *p , *q; hemq = new buffer; hinq = new buffer; houtq = new buffer; q = hemq;for(i nt i = 0 ; i BufNo = i;p-buf = -1 ; q-n ext = p;q = P;/开辟新的缓冲区/给开辟的缓冲区编号/前一缓冲区指向新的缓冲区/q总是记住队尾的缓冲区lemq = q ;空缓冲区队尾指针的确定linq = hin q;/此时输入与输出队列的头指针与尾指针是一致的loutq = houtq;lemq-n ext = NULL;linq-n ext = NULL; lo

19、utq-n ext = NULL;部分运行效果截图:D:MV DOCU M ENT名;砂-与作並二雷二学靜提炸乘統谣码区山ngBLifferPooEOebij gU. I = I同 魂I缓冲池的模拟by CLC软 #11032 21 10 00 I6 62 20 00 I-査J.;査J.;査J.;査岀入入岀岀入入岀岀入入岀岀入入脅日日日-一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 一 - 00112233445566778899000112233445566778899111111111111111111112元元元元元元元元元元元元远迈迈迈迈迈刀丢刀丢刀丢刀丢刀丢刀丢刀丢刀元元元丟迈刀元历 勺-yn - yn -百-y

温馨提示

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

评论

0/150

提交评论