《操作系统》实验二内容要求

上传人:夏** 文档编号:550379730 上传时间:2023-09-04 格式:DOCX 页数:7 大小:100.36KB
返回 下载 相关 举报
《操作系统》实验二内容要求_第1页
第1页 / 共7页
《操作系统》实验二内容要求_第2页
第2页 / 共7页
《操作系统》实验二内容要求_第3页
第3页 / 共7页
《操作系统》实验二内容要求_第4页
第4页 / 共7页
《操作系统》实验二内容要求_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《《操作系统》实验二内容要求》由会员分享,可在线阅读,更多相关《《操作系统》实验二内容要求(7页珍藏版)》请在金锄头文库上搜索。

1、操作系统实验二内容要求【实验题目】:进程同步【实验学时】:4学时【实验目的】通过这次实验,加深对进程同步概念的理解,进一步掌握进程同 步机制、进程同步算法和进程同步的评价。【实验内容】问题描述:以生产者消费者模型为基础,在 Windows 环境下创建一个控制台 进程(或者界面进程),在该进程中创建读者写者线程模拟生产者和 消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读 者线程读取。读者线程从缓冲区中获得数据,然后释放缓冲区。当写 者线程写入数据时,如果没有空缓冲区可用,那么写者线程必须等待 读者线程释放出一个空缓冲区。当读者线程读取数据时,如果没有满 的缓冲区,那么读入线程将被阻

2、塞,直到新的数据被写进去。 实现提示:本实验要求设计并实现一个进程,该进程拥有一个生产者线程和 一个消费者线程,它们使用N个不同的缓冲区(N为一个确定的数 值,本实验中取N=16)。你需要使用如下信号量:一个互斥信号量mutex,用以阻止生产者线程和消费者线程同时 操作缓冲区列表;一个信号量full,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;一个信号量empty,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号;实验要求:1) 上机前认真复习进程同步算法,熟悉进程同步过程中进程的执 行顺序和互相制约;2) 上机时独立编程、调试程序;3) 根据具体实验要求,完成好实验报

3、告(包括实验的目的、内容 要求、源程序、实例运行结果截图)。源程序#include #include const unsigned short SIZE_OF_BUFFER = 10; /缓冲区长度 unsigned short ProductID = 0;/产品号unsigned short ConsumeID = 0;/将被消耗的产品号unsigned short in = 0;/产品进缓冲区时的缓冲区下标unsigned short out = 0;/产品出缓冲区时的缓冲区下标int g_bufferSIZE_OF_BUFFER;/缓冲区是个循环队列bool g_continue = t

4、rue;/控制程序结束HANDLE g_hMutex;/用于线程间的互斥HANDLE g_hFullSemaphore;/当缓冲区满时迫使生产者等待HANDLE g_hEmptySemaphore;/当缓冲区空时迫使消费者等待DWORD WINAPI Producer(LPVOID); /生产者线程DWORD WINAPI Consumer(LPVOID);/消费者线程int main() /创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-

5、1,SIZE_OF_BUFFER-1,NULL); g_hEmptySemaphore =CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/调整下面的数值,可以发现,当生产者个数多于消费者个数时, /生产速度快,生产者经常等待消费者;反之,消费者经常等待 const unsigned short PRODUCERS_COUNT = 3; /生产者的个数 const unsigned short CONSUMERS_COUNT = 1; /消费者的个数/总的线程数const unsigned short THREADS_COUNT = PRODUCER

6、S_COUNT+CONSUMERS_COUNT;HANDLE hThreadsPRODUCERS_COUNT; /各线程的 handleDWORD producerIDCONSUMERS_COUNT; /生产者线程的标识符 DWORD consumerIDTHREADS_COUNT; /消费者线程的标识符/创建生产者线程for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1;/创建消费者线程for (

7、i=0;iCONSUMERS_COUNT;+i)hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&c onsumerIDi);if (hThreadsi=NULL) return -1;while(g_continue)if(getchar() /按回车后终止程序运行 g_continue = false;return 0;生产一个产品。简单模拟了一下,仅输出新产品的ID号void Produce()std:cerr Producing +ProductID . ;std:cerr Succeed std:endl;/

8、把新生产的产品放入缓冲区void Append()std:cerr Appending a product . ; g_bufferin = ProductID;in = (in+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl;/输出缓冲区当前的状态for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl;/从缓冲区中取出一个产品void Take()std:c

9、err Taking a product . ; ConsumeID = g_bufferout;out = (out+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl;/输出缓冲区当前的状态for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : g_bufferi; if (i=in) std:cout - 生产; if (i=out) std:cout - 消费; std:cout std:endl;/消耗一个产品void Consume()std:cerr Consuming ConsumeID std:cerr

10、 Succeed std:endl;/生产者DWORD WINAPI Producer(LPVOID lpPara) while(g_continue)WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE); Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/消费者DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue)WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;实例运行结果截图

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 建筑资料

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