操作系统 实验三 进程同步的经典算法

上传人:E**** 文档编号:118615693 上传时间:2019-12-20 格式:DOC 页数:18 大小:270KB
返回 下载 相关 举报
操作系统 实验三 进程同步的经典算法_第1页
第1页 / 共18页
操作系统 实验三 进程同步的经典算法_第2页
第2页 / 共18页
操作系统 实验三 进程同步的经典算法_第3页
第3页 / 共18页
操作系统 实验三 进程同步的经典算法_第4页
第4页 / 共18页
操作系统 实验三 进程同步的经典算法_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《操作系统 实验三 进程同步的经典算法》由会员分享,可在线阅读,更多相关《操作系统 实验三 进程同步的经典算法(18页珍藏版)》请在金锄头文库上搜索。

1、宁德师范学院计算机系实验报告(20142015学年 第二学期)课程名称 操作系统 实验名称 实验三 进程同步的经典算法专 业 计算机科学与技术(非师)年 级 2012级 学号 B2012102147 姓名 王 秋 指导教师 王远帆 实验日期 2015-04-9 实验目的与要求:(1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。(2)了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。实验设备(环境):(1)一台安装有Cygwin Terminal的计算机(2) Windows XP操

2、作系统(3)VC+6.0实验内容:(1)生产者消费者问题(2)读者写者问题根据实验(1)中所熟悉的P、V原语对应的实际Windows API函数,并参考教材中读者、写者问题的算法原理,尝试利用Windows API函数实现第一类读者写者问题(读者优先)。实验步骤、实验结果及分析: (1)生产者消费者问题1:创建一个“Win32 Consol Application”工程,然后拷贝清单3-1中的程序,编译成可执行文件。2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:在命令窗口运行过程图 3-1运行结果图3:仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题:线

3、程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?第一个执行函数是Producer;位于第三个参数中。4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。运行结果:3-1修改后结果图从中你可以得出什么结论:5:修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。运行结果:6:根据步骤4的结果,并查看MSDN,回答下列问题1) CreateMutex中有几个参数,各代表什么含义。有3个参数 1. LPSECURITY_ATTRIBUTES IpMu

4、texAttributes代表安全属性的指针 2. BOOL bInitialOwner 代表布尔bInitialOwner 3. LPCTSTR IpName 代表LPCTSTR类型IpName2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。有4个参数:1、表示采用不允许继承的默认描述符 2、设置信号机的初始计数 3、设置信号机的最大计数 4、指定信号机对象的名称。3)程序中P、V原语所对应的实际Windows API函数是什么,写出这几条语句。4)CreateMutex能用CreateSemaphore替代吗?尝试修改程序3-1,将信号量Mute

5、x完全用CreateSemaphore及相关函数实现。写出要修改的语句:P:Take() V:Append()4)CreateMutex能用CreateSemaphore替代吗?尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。写出要修改的语句:Mutex=CreateSemaphore(NULL,false,false,NULL); (2) 读者写者问题根据实验(1)中所熟悉的P、V原语对应的实际Windows API函数,并参考教材中读者、写者问题的算法原理,尝试利用Windows API函数实现第一类读者写者问题(读者优先)。拷贝清单3-2中的程序

6、,编译成可执行文件,运行截图:读者写者运行结果 程序清单:程序3-1代码:#include #include const unsigned short SIZE_OF_BUFFER = 2; unsigned short ProductID = 0; unsigned short ConsumeID = 0; unsigned short in = 0; unsigned short out = 0; int bufferSIZE_OF_BUFFER; bool p_ccontinue = true; HANDLE Mutex; HANDLE FullSemaphore; HANDLE Emp

7、tySemaphore; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main() Mutex = CreateMutex(NULL,FALSE,NULL);EmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL); FullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL); const unsigned short PRODUCERS_COUNT = 3;

8、 /生产者的个数 const unsigned short CONSUMERS_COUNT = 1; /消费者的个数 /总的线程数 const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsTHREADS_COUNT; DWORD producerIDPRODUCERS_COUNT; DWORD consumerIDCONSUMERS_COUNT; /创建生产者线程 for (int i=0;iPRODUCERS_COUNT;+i) hThreadsi=CreateThread(NU

9、LL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /创建消费者线程 for (i=0;iCONSUMERS_COUNT;+i) hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDi); if (hThreadsi=NULL) return -1; while(p_ccontinue) if(getchar() /按回车后终止程序运行 p_ccontinue = false; return 0;/生产一个产品。void

10、 Produce() std:cout std:endl Producing +ProductID . ; std:cout Succeed std:endl;/把新生产的产品放入缓冲区void Append() std:cerr Appending a product . ; bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : bufferi; if (i=in) std:co

11、ut - 生产; if (i=out) std:cout - 消费; std:cout std:endl; /从缓冲区中取出一个产品void Take() std:cerr Taking a product . ; ConsumeID = bufferout;bufferout = 0; out = (out+1)%SIZE_OF_BUFFER; std:cerr Succeed std:endl; /输出缓冲区当前的状态 for (int i=0;iSIZE_OF_BUFFER;+i) std:cout i : bufferi; if (i=in) std:cout - 生产; if (i=

12、out) std:cout - 消费; std:cout std:endl; /消耗一个产品void Consume() std:cout Consuming ConsumeID . ; std:cout Succeed std:endl;/生产者DWORD WINAPI Producer(LPVOID lpPara) while(p_ccontinue) WaitForSingleObject(EmptySemaphore,INFINITE);/p(empty); WaitForSingleObject(Mutex,INFINITE);/p(mutex); Produce(); Append

13、(); Sleep(1500); ReleaseMutex(Mutex);/V(mutex); ReleaseSemaphore(FullSemaphore,1,NULL);/V(full); return 0;/消费者DWORD WINAPI Consumer(LPVOID lpPara) while(p_ccontinue) WaitForSingleObject(FullSemaphore,INFINITE);/P(full); WaitForSingleObject(Mutex,INFINITE);/P(mutex); Take(); Consume(); Sleep(1500); ReleaseMutex(Mutex);/V(m

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

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

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