缓冲池模拟与实现_第1页
缓冲池模拟与实现_第2页
免费预览已结束,剩余29页可下载查看

下载本文档

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

文档简介

1、缓冲池模拟与实现长春理工大学大学学生实验报告书 学生用表 实验名称 缓冲池的模拟实现课程名称操作系统课程号 学院(系)软件学院专业软件工程班级学生姓名 学号 实验地点 实验日期一.实验目的1掌握缓冲池的结构2掌握缓冲池的使用方法二、实验内容1.实现输入、计算、输岀进程并发执行2、实现getBuf和putBuf函数。三、实验步骤1.整体设计包括三个线程的模拟设计三个队列的链表设计还有 三个队列的同步与互岸的设计等2、由于本次实验没有需要太多的数据结构因此数据结构的设计就只有三个缓冲队列的设计先构造一个空的缓冲队列该队列是一个实体即是一个确定的有结点的链表 它是模拟缓冲池的载体 输入与输出队列在构

2、造时只有它的头尾指针而没有它的实体这是因为它可以从空缓冲区里获得冊如当计的头尾指针而没有它的实体这是因为它可以从空缓冲区里获得冊如当计 龜龜程鞠摒计算时便可从空队列里瓢一个缓冲区作为输入題程鞠摒计算时便可从空队列里瓢一个缓冲区作为输入題I哽用再把哽用再把它挂载到输入队列的队尾中去 算法流程图( 开始J* 根据巻戟抑始牝XJ史祈山txh农井初抢化廉神瓯-HIPTfl p(iI/缓冲队列类型的定义#define EMQ 0 /空缓冲队列#define INQ1 /输入缓冲队列#defi ne OUTQ 2 /输出缓冲队列/结束运行标志 short int m_end ; GDOU-B-11-112

3、/缓冲结构体的定义 typedef struct Bufferconst int bufferpoolsize = 50;/ 缓冲池大小,默认设置为 50 个buffer* getBuf(i nt type);/从队列头中摘取一个缓冲区int BufNo; /缓冲区号int buf; / 缓冲内容Buffer *n ext; /缓冲指向下一个指针 buffer;/线程函数声明DWORD WINAPI In putThreadFu nc(LPVOID IpPa ra); /输入线程函数DWORD WINAPI OutputThreadFu nc(LPVOID lpPa ra); /输出线程函数D

4、WORD WINAPI CalThreadFu nc(LPVOID lpPa ra); /计算线程函数/加入与摘取队列函数声明void putBuf(i nt type , buffer *buf); /挂载到队列尾/构造缓冲池函数的声明void Con structBuffer();/线程的句柄HANDLE hln putT;HANDLE hOutputT;HANDLE hCalculateT;/线程的 IDDWORD InputTid;DWORD OutputTid;DWORD CalculateTid;/输入线程/输出线程/计算线程/输入线程/输出线程/计算线程/三个互斥量信号句柄HAN

5、DLE hmutexEMQ;II空队列的互斥信号量HANDLE hmutexOUTQ; II 装满输出队列的互斥信号量HANDLE hmutexINQ; II 装满输入队列的互斥信号量II 三个同步信号量HANDLE hsemINQ;HANDLE hsemOUTQ;HANDLE hsemEMQ;#in elude win dows.h #i nclude iostream#in clude stdlib.h#include time.h#in clude Mai n1.h using n amespace std;/三个缓冲队列头与尾指针buffer *hemq , *hinq , *hout

6、q;/ 队头指针buffer *lemq , *linq , *loutq;/ 队尾指针/主函数int mai n()coutvvshowlvve ndlvvshow2vve ndlvshow3ve ndle ndl;m_end = 1 ;/运行结束标志ConstructBuffer();/ 构造缓冲池/创建互斥对象hmutexEMQ = CreateMutex(NULL,FALSE,NULL);hmutexOUTQ = CreateMutex(NULL,FALSE,NULL);hmutexINQ = CreateMutex(NULL,FALSE,NULL);/创建信号量对象hsemINQ =

7、 CreateSemaphore(NULL,0,bufferpoolsize,NULL);hsemOUTQ = CreateSemaphore(NULL,0,bufferpoolsize,NULL);hsemEMQ =CreateSemaphore(NULL,bufferpoolsize,bufferpoolsize,NULL);/创建线程hln putT = CreateThread(NULL,O,l nputThreadFu nc,NULL,0,&ln putTid);Sleep(10);hCalculateT =CreateThread(NULL,O,CalThreadFu nc

8、,NULL,0,&CalculateTid);Sleep(10);hOutputT =CreateThread(NULL,0,OutputThreadFu nc,NULL,0, &OutputTid);/Sleep(IOOOO);system(pause);if(getchar() /按回车后终止程序运行m_end = 0 ;coutvv 程序已经终止!buf = nRan dom ;coutvv输入线程从BufNobufvve ndl;ReleaseMutex(hmutexEMQ); /控制访问输入队列的互斥量收容输入释放互斥对象信号WaitForSi ngleObject(

9、hmutexlNQ,INFINITE);putBuf(INQ,getbuf) ; /将输入的缓冲区挂载到输入队列的队尾ReleaseMutex(hmutexlNQ);ReleaseSemaphore(hsemlNQ,1,NULL);return 0;/ 输出线程函数的实现DWORD WINAPI OutputThreadFunc(LPVOID lpPara)/输出线程函数buffer* Outputbuf ;/ 一个临时交换区while(m_e nd)Sleep(IOO);Illi同步与互斥的控制WaitForSi ngleObject(hsemOUTQ,INFINITE);WaitForSi

10、 ngleObject(hmutexOUTQ,INFINITE);Outputbuf = getBuf(OUTQ) ;II 从输出队列中提取一个提取输出缓冲coutvv输出线程从缓冲单元vBufNovv-输出-vvdata= vvOutputbuf-bufvve ndl;Outputbuf-buf = -1 ;II 提取完成后将该缓冲区回收ReleaseMutex(hmutexOUTQ);WaitForSi ngleObject(hmutexEMQ,INFINITE);提取putBuf(EMQ,Outputbuf) ;/回收的把它挂载到空队列的队尾ReleaseMutex(hmutexEMQ)

11、;ReleaseSemaphore(hsemEMQ,1,NULL);return 0;/计算线程函数的实现DWORD WINAPI CalThreadFu nc(LPVOID lpPa ra)buffer* Calbuf1 = NULL;buffer* Calbuf2 =NULL;/计算线程函数/Calbuf-buf = -1 ;/就将收回此缰冲区表示该缓冲区已空就将收回此缰冲区表示该缓冲区已空int n Cal;while(m_e nd)Sleep(10);/因为计算线程的速度远远快于输入歸出线程所以它的因为计算线程的速度远远快于输入歸出线程所以它的休眠时间应很小/同步与互斥的控制WaitF

12、orSi ngleObject(hsemlNQ,INFINITE);WaitForSi ngleObject(hmutexINQ,INFINITE);Calbuf1 = getBuf(INQ);/从输入队列中提取一个收容输入缓冲区nCal = Calbuf1-buf;/ 提取数据coutvv 计算线程从BufNovv-提取输入-data= vbufvvvdata= vbufve ndl;ReleaseMutex(hmutexlNQ);WaitForSi ngleObject(hmutexEMQ,INFINITE);putBuf(EMQ,Calbuf1);ReleaseMutex(hmutexE

13、MQ);ReleaseSemaphore(hsemEMQ,1,NULL);nCal = nCal + 10000 ;/模拟输入数据的处理WaitForSi ngleObject(hsemEMQ,INFINITE);WaitForSi ngleObject(hmutexEMQ,INFINITE);coutvv计算线程从BufNovv-Calbuf2 = getBuf(EMQ);/得到一个空的缓冲区作为收容输出Calbuf2-buf = nCal;II存入运算结果收容输出ReleaseMutex(hmutexEMQ);WaitForSi ngleObject(hmutexOUTQ,INFINITE

14、); /载到输出队列的队尾putBuf(OUTQ,Calbuf2);ReleaseMutex(hmutexOUTQ);ReleaseSemaphore(hsemOUTQ,1,NULL);return 0 ;/从队列中得到队头结点函数(实际相当于删除一个结点操作 buffer*getBuf(i nt type)把收容输出缓冲区挂return Retur nbuf;buffer* Returnbuf = NULL;switch(type)case 0 :/判断该队列的缓冲个数是否还只有一个if(hemq != lemq & hemq-n ext- n ext != NULL)Returnb

15、uf = hemq-next ;/ 取得队列头Returnbuf-next;/修正队列链表头指针的指向Returnbuf-n ext = NULL;elsehemq-n ext =/假如该缓冲阳啲个数只有假如该缓冲阳啲个数只有-个的话则使得队头个的话则使得队头I旨针与臥尾旨针与臥尾指针相等级/这样的话就可以防止队尾指针的丢失Retur nbuf = hemq-n ext ;hemq-n ext = Retur nbuf-n ext;Returnbuf- next = NULL;lemq = hemq ;return Retur nbuf;break;case 1:return Retur nb

16、uf;if(hinq != linq & hinq-next-next != NULL)Retur nbuf=hinq-n ext;hinq-next :=Retur nbuf-next;Returnbuf- next =NULL;return Retur nbuf;elseRetur nbuf=hinq-n ext ;hinq-next :=Retur nbuf-next;Returnbuf- next = NULL;linq = hinq;break;houtq-n ext = Retur nbuf-n ext ;case 2:if(houtq != loutq & hou

17、tq-next-next !=NULL )Retur nbuf = houtq-n ext ;houtq-n ext = Retur nbuf-n ext;Retur nbuf-n ext =NULL;return Retur nbuf;elseRetur nbuf = houtq-n ext;Returnbuf- next = NULL;loutq = houtq;return Retur nbuf;break;/把某一类型的缓冲区挂载到队尾函数 /(实际相当于插入一个结点操作)void putBuf(i nt type , buffer* buf)switch(type)case 0:if

18、(buf != NULL) / 该参数(buf)不为空的时候才执行因不为空的时候才执行因为插入一个空的缓冲区是没有意义的lemq-next = buf;/修正队列尾指针lemq = buf ;/队尾指针的跟踪lemq-next = NULL;/队列尾指针赋空break;case 1:if(buf != NULL)/ 同上Iinq-n ext = buf;li nq = buf;lin q- next = NULL;break;case 2:if(buf != NULL)loutq-n ext = buf;loutq = buf;loutq- next = NULL;break;/构造缓冲池函数的声明void Con structBuffer()buffer *p , *q;/为开辟动态缓冲区而设的两个变量hemq = new buffer;/创建空队列的头指针hinq = new buffer;/创建输入队列的头指针houtq

温馨提示

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

评论

0/150

提交评论