操作系统实验三 进程同步的经典算法_第1页
操作系统实验三 进程同步的经典算法_第2页
操作系统实验三 进程同步的经典算法_第3页
操作系统实验三 进程同步的经典算法_第4页
操作系统实验三 进程同步的经典算法_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

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); R

14、eleaseMutex(Mutex);/V(mutex); ReleaseSemaphore(EmptySemaphore,1,NULL);/V(empty); return 0;3-2代码:#include #include #include #include #include #include #define MAX_PERSON 100 /最多100人#define READER 0 /读者#define WRITER 1 /写者#define END -1 /结束#define R READER#define W WRITERtypedef struct _Person HANDLE

15、m_hThread;/定义处理线程的句柄 int m_nType;/进程类型(读写) int m_nStartTime;/开始时间 int m_nWorkTime;/运行时间 int m_nID;/进程号Person;Person g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 0;/基本时间片数int g_PersonLists = /进程队列 1, W, 3, 5, 2, W, 16, 5, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3, 6, R, 17,7, END,;int g_NumOf

16、Reading = 0;int g_NumOfWriteRequest = 0;/申请写进程的个数HANDLE g_hReadSemaphore;/读者信号HANDLE g_hWriteSemaphore;/写者信号bool finished = false; /所有的读完成/bool wfinished = false; /所有的写完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int W

17、orkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main() g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可用的资源数为1,最大为100 g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可用的资源数为1,最大为100 CreatePersonList(g_PersonLists); / C

18、reate All the reader and writers printf(Created all the reader and writern.n); g_CurrentTime = 0; while(true) g_CurrentTime+;Sleep(300); / 300 msprintf(CurrentTime = %dn,g_CurrentTime);if(finished) return 0; / return 0;void CreatePersonList(int *pPersonLists) int i=0; int *pList = pPersonLists; bool

19、 Ret; while(pList0 != END) switch(pList1) case R: Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654 break; case W: Ret = CreateWriter(pList2,pList3,pList0); break;if(!Ret) printf(Create Person %d is wrongn,pList0); pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam

20、)/读过程 Person *pPerson = (Person*)lpParam; / wait for the start time while(g_CurrentTime != pPerson-m_nStartTime) /读操作还没有到达执行时间,则等待 printf(Reader %d is Requesting .n,pPerson-m_nID); printf(nn*n); / wait for the write request/* while(g_NumOfWriteRequest != 0) /g_NumOfWriteRequest != 0 表示现在正在写,不能读 */该语

21、句在写者优先的时候是认为写者优先级高于读者,在有写者的时候读者需/要等候,而在读者优先的时候,不用判断是否存在写者,有读者时即开始读操/作。 WaitForSingleObject(g_hReadSemaphore,INFINITE);/等待g_hReadSemaphore读信号,即当g_hReadSemaphore有信号时等待结束 相当于p操作 if(g_NumOfReading =0) WaitForSingleObject(g_hWriteSemaphore,INFINITE); /当第一个读者到了,如果g_hWriteSemaphore信号灯灭了,说明有写者再写,读者必须等待。即互斥写

22、操作 g_NumOfReading+; ReleaseSemaphore(g_hReadSemaphore,1,NULL); /还有读者,但是允许下一个读进程读取,相当于V操作/ modify the readers real start time pPerson-m_nStartTime = g_CurrentTime; printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_nID); printf(nn*n); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) / .

23、 perform read operations printf(Reader %d is Exit.n,pPerson-m_nID); printf(nn*n); WaitForSingleObject(g_hReadSemaphore,INFINITE); g_NumOfReading-; if(g_NumOfReading = 0) ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此时没有读者,可以写 ReleaseSemaphore(g_hReadSemaphore,1,NULL); if(pPerson-m_nID = 4) finished =

24、 true; /所有的读写完成 ExitThread(0); return 0;DWORD WINAPI WriterProc(LPVOID lpParam) Person *pPerson = (Person*)lpParam; / wait for the start time while(g_CurrentTime != pPerson-m_nStartTime) printf(Writer %d is Requesting .n,pPerson-m_nID); printf(nn*n); /g_NumOfWriteRequest+;/在写者优先的时候需要用自加来初始信号值,而在读者优先

25、的时是通过读者操作来控制信号值 WaitForSingleObject(g_hWriteSemaphore,INFINITE); / modify the writers real start time pPerson-m_nStartTime = g_CurrentTime; printf(Writer %d is Writting the Shared Buffer.n,pPerson-m_nID); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) / . perform write operationsprintf(Writ

26、er %d is Exit.n,pPerson-m_nID);printf(nn*n);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true;/所有的读写完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID) DWORD dwThreadID; if(g_NumPerson = MAX_PERSON) return false; Person *

27、pPerson = &g_Personsg_NumPerson; pPerson-m_nID = ID; pPerson-m_nStartTime = StartTime; pPerson-m_nWorkTime = WorkTime; pPerson-m_nType = READER; g_NumPerson+; / Create an New Thread pPerson-m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson-m_hThread = NULL) return false; return true;bool CreateWriter(int StartTime,int WorkTime,int ID) DWORD dwThreadID; if(g_NumPerson = MAX_PERSON) return false; Person *pPerson = &g_Personsg_NumPerson; pPerson-m_nID =

温馨提示

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

评论

0/150

提交评论