生产者与消费者问题0

上传人:公**** 文档编号:562048769 上传时间:2023-08-08 格式:DOC 页数:18 大小:119.50KB
返回 下载 相关 举报
生产者与消费者问题0_第1页
第1页 / 共18页
生产者与消费者问题0_第2页
第2页 / 共18页
生产者与消费者问题0_第3页
第3页 / 共18页
生产者与消费者问题0_第4页
第4页 / 共18页
生产者与消费者问题0_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《生产者与消费者问题0》由会员分享,可在线阅读,更多相关《生产者与消费者问题0(18页珍藏版)》请在金锄头文库上搜索。

1、 . . . 操作系统课程设计报告题目:生产者与消费者问题班级: $学号: 0804010214: $指导教师$2010-1-13一、题目(生产者与消费者问题)1.课程设计题目分析题目分析:生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间执行的两个进程。生产者进程生产物品,然后将物品放置在一个空缓冲区中供消费者进程消费。消费者进程从缓冲区中获得物品,然后释放缓冲区。当生产者进程生产物品时,如果没有空缓冲区可用,那么生产者进程必须等待消费者进程释放出一个空缓冲区。当消费者进程消费物品时,如果没有满的缓冲区,那么

2、消费者进程将被阻塞,直到新的物品被生产出来。功能要求:根据进程同步机制,编写一个解决上述问题的程序,可显示缓冲池状态、放数据、取数据等过程。键盘输入进程数和缓冲区数目,可调度生产者、消费者的活动与显示进程的当前状态。为实现进程互斥的进入自己的临界区,所有同步机制都应遵循以下四条准则:(1)空闲让进,(2)忙着等待,(3)有限等待(4)让权等待。2.数据结构(1) CreateThreadl功能创建一个在调用进程的地址空间中执行的线程l格式HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize

3、,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,DWORD dwCreationFlags,Lpdword lpThread );l参数说明lpThreadAttributes指向一个LPSECURITY_ATTRIBUTES(新线程的安全性描述符)。dwStackSize定义原始堆栈大小。lpStartAddress指向使用LPTHRAED_START_ROUTINE类型定义的函数。lpParamiter定义一个给进程传递参数的指针。dwCreationFlags定义控制线程创建的附加标志。lpThread保存线程标志符(3

4、2位)(2) CreateMutexl功能创建一个命名或匿名的互斥量对象l格式HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);l参数说明lpMutexAttributes必须取值NULL。bInitialOwner指示当前线程是否马上拥有该互斥量(即马上加锁)。lpName互斥量名称。(3) CreateSemaphorel功能创建一个命名或匿名的信号量对象l格式HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lp

5、SemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName );l参数说明lpSemaphoreAttributes必须取值NULL。lInitialCount信号量的初始值。该值大于0,但小于lMaximumCount指定的最大值。lMaximumCount信号量的最大值。lpName信号量名称。(4) WaitForSingleObjectl功能使程序处于等待状态,直到信号量hHandle出现(即其值大于等于1)或超过规定的等待时间l格式DWORD WaitForSingleObject(HANDL

6、E hHandle, DWORD dwMilliseconds);l参数说明hHandle信号量指针。dwMilliseconds等待的最长时间(INFINITE为无限等待)。(5) ReleaseSemaphorel功能对指定信号量加上一个指定大小的量。成功执行则返回非0值l格式BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lppreviousCount );l参数说明hSemaphore信号量指针。lReleaseCount信号量的增量。lppreviousCount保存信号量当前值。(6) Releas

7、eMutexl功能打开互斥锁,即把互斥量加1。成功调用则返回0l格式BOOL ReleaseMutex(HANDLE hMutex);l参数说明hMutex互斥量指针。(7) InitializeCriticalSectionl功能初始化临界区对象l格式VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l参数说明lpCriticalSection指向临界区对象的指针。(8) EnterCriticalSectionl功能等待指定临界区对象的所有权l格式VOID enterCriticalSection(LP

8、CRITICAL_SECTION lpCriticalSection);l参数说明lpCriticalSection指向临界区对象的指针。(9) LeaveCriticalSectionl功能释放指定临界区对象的所有权l格式VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l参数说明lpCriticalSection指向临界区对象的指针。3.流程图ProduceWait BufferWait ProductsConsume结束While produceWhile consumeBegin4.所用技术和实现功能(1)所

9、用技术:应用进程同步技术信号量,以生产者/消费者模型为依据,在Windows 环境下创建一个控制台进程,在该进程中创建n个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。应用信号量机制实现生产者与消费者进程互斥的访问缓冲区,缓冲区为一个循环队列。(2)实现功能:键盘输入进程数和缓冲区数目,可调度生产者、消费者的活动与显示进程的当前状态。5、设计结论和心得(1)结论:在同一个进程地址空间执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线

10、程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。(2)心得:通过课程设计,进一步学习并理解生产者/消费者模型与其同步互斥规则,学习了解了windows同步对象与其特性,熟悉实验环境,掌握有关API的使用方法,同时熟悉对vc的使用,提高了分析问题以与解决问题的能力,通过学习相关知识,扩展了知识面。6.课程设计源代码;#include#include#include#include#include/定义常量;/此程序允许的最大临界区数;#define MAX_BUFFER_NUM10/秒到微秒的乘法因子;#define INTE_P

11、ER_SEC 1000/本程序允许的生产和消费线程的总数;#define MAX_THREAD_NUM 64/定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfointserial;/线程序列号charentity; /是P还是Cdoubledelay;/线程延迟intthread_requestMAX_THREAD_NUM; /线程请求队列intn_request;/请求个数;/全局变量的定义/临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTIONPC_CriticalMAX_BUFFER_NUM;int Buffer_Critical

12、MAX_BUFFER_NUM; /缓冲区声明,用于存放产品;HANDLE h_ThreadMAX_THREAD_NUM; /用于存储每个线程句柄的数组;ThreadInfoThread_InfoMAX_THREAD_NUM; /线程信息数组;HANDLEempty_semaphore; /一个信号量;HANDLEh_mutex; /一个互斥量;DWORDn_Thread = 0; /实际的线程的数目;DWORDn_Buffer_or_Critical; /实际的缓冲区或者临界区的数目;HANDLEh_SemaphoreMAX_THREAD_NUM; /生产者允许消费者开始消费的信号量;/生产消

13、费与辅助函数的声明void Produce(void *p);void Consume(void *p);bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(int);int main(void)/声明所需变量;DWORDwait_for_all;ifstreaminFile;/初始化缓冲区;for(int i=0;i MAX_BUFFER_NUM;i+)Buffer_Criticali = -1;/初始化每个线程的请求队列;for(int j=0;jMAX_THREAD_NUM;j+)for(int k=0;kMAX_THREAD_NUM;k+)Thread_Infoj.thread_requestk = -1;Thread_Infoj.n_request = 0;/初始化临界区;for(i =0;i n_Buffer_or_Critical;in

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 模板/表格 > 财务表格

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号