下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称缓冲池的模拟使用课程名称操作系统课程号学院(系)软件学院专业软件工程班级软件1103钟海楼学生姓名*学号2010117013*实验地点实验日期2012-05-0804004-、实验目的(1)掌握缓冲池的结构(2 )掌握缓冲池的使用方法二实验内容1、实现输入、计算、输出进程并发执行;2、实现 getBuf 和 putBuf 函数。三、实验步骤1、整体设计,包括三个线程的模拟设计,三个队列的链表设计,还有三个 队列的同步与互斥的设计等;2、由于本次实验没有需要太多的数据结构,因此,数据结构的设计就只有三个缓冲队列的设计: 先构
2、造一个空的缓冲队列, 该队列是一个实体, 即是一个 确定的有结点的链表,它是模拟缓冲池的载体,输入与输出队列在构造时只有它 的头尾指针,而没有它的实体,这是因为它可以从空缓冲区里获得,例如,当计 算线程要数据计算时,便可从空队列里获取一个缓冲区,作为输入缓冲使用再把 它挂载到输入队列的队尾中去由于要写的内容比较多,这里就不再废话连篇了,先把代码贴出来,里面有 着注释呢,大家都懂的:头文件如下:/缓冲队列类型的定义#defi ne EMQ#defi ne INQ 1#defi ne OUTQ 20空缓冲队列输入缓冲队列输出缓冲队列/显示的宏定义#defi ne showl|-I- 缓冲池的模拟.
3、1#defi ne show2 |-I- by CLC.1#defi ne show3|-_ i- 软件1103const int bufferpoolsize = 50; Illi缓冲池大小,默认设置为50个结束运行标志short int m_end ;缓冲结构体的定义typedef struct Bufferint BufNo;缓冲区号int buf;缓冲内容Buffer *n ext;II缓冲指向下一个指针 buffer;/线程函数声明DWORD WINAPI InputThreadFunc(LPVOID IpPara); II输入线程函数DWORDWINAPI OutputThread
4、Func(LPVOID IpPara); II输出线程函数DWORD WINAPI CalThreadFunc(LPVOID IpPara); II计算线程函数加入与摘取队列函数声明void putBuf(i nt type , buffer *buf); II挂载到队列尾buffer* getBuf(i nt type);II从队列头中摘取一个缓冲区构造缓冲池函数的声明void Con structBuffer();线程的句柄HANDLE hI nputT;输入线程HANDLE hOutputT;输出线程HANDLE hCalculateT;计算线程/线程的IDDWORD In putTid
5、;输入线程DWORD OutputTid;输出线程DWORD CalculateTid;计算线程三个互斥量信号句柄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#i nclude Mai n1.husing n amespace std;/三个缓冲队列头与尾指针buffer
6、 *hemq , *hi nq , *houtq;队头指针buffer *lemq , *li nq , *loutq;队尾指针/主函数int main()coutshow1e ndlvshow2ve ndlvshow3ve ndle ndl; m_end = 1 ;/运行结束标志Co nstructBuffer(); /构造缓冲池/创建互斥对象hmutexEMQ = CreateMutex(NULL,FALSE,NULL); hmutexOUTQ =CreateMutex(NULL,FALSE,NULL); hmutexINQ =CreateMutex(NULL,FALSE,NULL);创建
7、信号量对象hsemINQ = CreateSem aphore(NULL,0,bufferpoolsize,NULL); hsemOUTQ =CreateSem aphore(NULL,0,bufferpoolsize,NULL);hsemEMQ = CreateSemaphore(NULL,bufferpoolsize,bufferpoolsize,NULL);创建线程空队列的互斥信号量装满输出队列的互斥信号量装满输入队列的互斥信号量hl nputT = CreateThread(NULL,O,l nputThreadFu nc,NULL,O,&ln putTid);Sleep(10
8、);hCalculateT = CreateThread(NULL,0,CalThreadFu nc,NULL,0,&CalculateTid);Sleep(10);hOutputT = CreateThread(NULL,0,OutputThreadFu nc,NULL,0,&OutputTid);Sleep(10000);system(pause);if(getchar() /按回车后终止程序运行m_end = 0 ;cout程序已经终止!buf = nRan dom ;cout输入线程从BufNodata= bufve ndl;ReleaseMutex(hmutexEMQ
9、);释放互斥对象信号/控制访问输入队列的互斥量WaitForSi ngleObject(hmutexlNQ,INFINITE);putBuf(INQ,getbuf);将输入的缓冲区挂载到输入队列的队尾ReleaseMutex(hmutexINQ);ReleaseSemaphore(hsemlNQ,1,NULL);return 0;输出线程函数的实现DWORD WINAPI OutputThreadFu nc(LPVOID lpPara)输出线程函数buffer* Outputbuf ;/一个临时交换区while(m_e nd) _Sleep(100);/同步与互斥的控制WaitForSi ng
10、leObject(hsemOUTQ,INFINITE);WaitForSi ngleObject(hmutexOUTQ,INFINITE);Outputbuf = getBuf(OUTQ) ;/从输出队列中提取一个提取输出缓冲区cout输出线程从缓冲单元BufNodata= bufbuf = -1 ;提取完成后将该缓冲区回收ReleaseMutex(hmutexOUTQ);WaitForSi ngleObject(hmutexEMQ,INFINITE); putBuf(EMQ,Outputbuf);回收的把它挂载到空队列的队尾ReleaseMutex(hmutexEMQ);ReleaseSem
11、aphore(hsemEMQ,1,NULL);return 0;/计算线程函数的实现DWORD WINAPI CalThreadFu nc(LPVOID IpPara)计算线程函数buffer* Calbuf1 = NULL;buffer* Calbuf2 =NULL;int nCal;while(m_e nd) _Sleep(10);因为计算线程的速度远远快于输入与输出线程,所以它的 休眠时间应很小/同步与互斥的控制WaitForSi ngleObject(hsemlNQ,INFINITE);WaitForSi ngleObject(hmutexlNQ,INFINITE);Calbuf1 =
12、 getBuf(INQ);/从输入队列中提取一个收容输入缓冲区n Cal = Calbuf1-buf;提取数据cout计算线程从缓冲单元BufNodata= bufbuf = -1 ;系统将收回此缓冲区,表示该缓冲区已空ReleaseMutex(hmutexlNQ);WaitForSi ngleObject(hmutexEMQ,INFINITE);putBuf(EMQ,Calbuf1);ReleaseMutex(hmutexEMQ);ReleaseSemaphore(hsemEMQ,1,NULL);n Cal = nCal + 10000 ;/模拟输入数据的处理WaitForSi ngleOb
13、ject(hsemEMQ,INFINITE);WaitForSi ngleObject(hmutexEMQ,INFINITE);Calbuf2 = getBuf(EMQ);得到一个空的缓冲区作为收容输出Calbuf2-buf = n Cal ;/存入运算结果coutvv计算线程从BufNovv-收容输出-data= bufn ext- n ext != NULL)Returnbuf = hemq- next ;/取得队列头hemq- next = Returnbuf-next;/修正队列链表头指针的指向Returnbuf- n ext = NULL;return Returnbuf;else假
14、如该缓冲队列的个数只有一个的话,贝U使得队头指针与队尾 指针相等级这样的话就可以防止队尾指针的丢失Retur nbuf = hemq-n ext ;hemq-n ext = Retur nbuf-n ext;Returnbuf- n ext = NULL;lemq = hemq ;return Returnbuf;break;case 1:if(hi nq != linq & hinq-n ext- next != NULL)Retur nbuf = hinq-n ext;hinq-n ext = Retur nbuf-n ext;Returnbuf- next =NULL;retur
15、n Returnbuf;elseRetur nbuf = hinq-n ext ;hinq-n ext = Retur nbuf-n ext;Returnbuf- n ext = NULL;li nq = hinq;return Returnbuf;break;case 2:if(houtq != loutq & houtq- next- n ext !=NULL )Retur nbuf = houtq-n ext ;houtq-n ext = Retur nbuf-n ext;Returnbuf- n ext = NULL;return Returnbuf;elseRetur nbu
16、f = houtq-n ext;houtq-n ext = Retur nbuf-n ext ;Returnbuf- n ext = NULL;loutq = houtq;return Returnbuf;break;/把某一类型的缓冲区挂载到队尾函数(实际相当于插入一个结点操作)void putBuf(i nt type , buffer* buf)switch(type)case 0:if(buf != NULL)该参数(buf)不为空的时候,才执行,因为插入一个空的缓冲区是没有意义的lemq- next = buf;修正队列尾指针lemq = buf ;/队尾指针的跟踪lemq- nex
17、t = NULL;/队列尾指针赋空break;case 1: if(buf != NULL)linq-n ext = buf;li nq = buf; linq-next= NULL;break;case 2:if(buf != NULL )loutq-n ext = buf;loutq = buf;loutq-n ext =NULL; break;/同上/构造缓冲池函数的声明void Con structBuffer()buffer *p , *q;hemq = new buffer;hinq = new buffer;houtq = new buffer;q = hemq;/为开辟动态缓冲
18、区而设的两个变量/创建空队列的头指针/创建输入队列的头指针/创建输出队列的头指针for(i nt i = 0 ; i BufNo = i;/给开辟的缓冲区编号p-buf = -1 ;q- next = p;前一缓冲区指向新的缓冲区q = p;/q总是记住队尾的缓冲区lemq = q ;空缓冲区队尾指针的确定linq = hinq;/此时输入与输出队列的头指针与尾指针是loutq = houtq;lemq-n ext = NULL;致的lin q-n ext = NULL; loutq-n ext = NULL;部分运行效果截图:DOCUMEMT 虫矽与作业大二懂二学删接昨該端码区UsingBu
19、fferPm 片 DbugW-L丄翌一缓冲池的模拟by CLC软件H阴四、实验总结1本次实验中,线程的同步与互斥和三个缓冲队列的维护是重点,在实际 编程中,刚开始的时候没有太注重三个队列的维护,使得每次运行时都出现只有 前面几个结果,后来认真的想想,原因在于是没有对这三个缓冲队列的维护,因为三个队列都是以链表的形式来实现的,因此,出现了指针指向了系统非法的内存地址,使得运行异常中止;2、在putBuf()与getBuf()函数中并没有把线程访问的同步与互斥操作放 在里面,是因为是线程调用它时,返回后需要向屏幕打印消息,这样的话,多个 线程便会抢占性的在屏幕上打印消息, 会造成乱码的现象;假如要在putBuf()与getBuf()函数中包含互斥与同步的操作,那么势必要在这两个函数里面实现打3535
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年PIE工程师培训技能:迈向行业精英的关键路径
- 《弟子规》与2024年教育趋势融合教学
- 2024年贝的故事:教学资源的整合与创新
- 2024年XX企业客户服务文化建设方案
- 小学语文教学设计《棉花姑娘》
- 护理学基础(护理专科(含答案))
- 2024-2025学年新教材高中英语课时分层作业一Unit1Laughoutloud含解析外研版选择性必修第一册
- 《操作系统教程》(5版)课堂或课后研讨题
- 2024-2025学年高中数学第二章圆锥曲线与方程2.1抛物线及其标准方程课时作业含解析北师大版选修1-1
- 2024-2025学年高中政治第3单元中华文化与民族精神第7课第2框弘扬中华民族精神作业含解析新人教版必修3
- 02J331地沟及盖板图集
- 2019年西藏开发投资集团有限公司招聘试题及答案解析
- HAY岗位管理体系构建
- 2023年中级经济师考试真题及答案
- SB/T 10895-2012鲜蛋包装与标识
- GB/T 9115-2010对焊钢制管法兰
- GB/T 2423.3-2006电工电子产品环境试验第2部分:试验方法试验Cab:恒定湿热试验
- GB/T 23221-2008烤烟栽培技术规程
- GB/T 16900-2008图形符号表示规则总则
- 城市绿地系统规划 第9章 工业绿地规划
- 辽宁省辽南协作校2022-2023学年高二上学期期末考试语文答案 Word版含解析
评论
0/150
提交评论