《《操作系统》实验二内容要求》由会员分享,可在线阅读,更多相关《《操作系统》实验二内容要求(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;实例运行结果截图