版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统实验指导操作系统实验指导作作 者:者: 任爱华,李鹏,刘方毅编著任爱华,李鹏,刘方毅编著出出 版版 社:社: 清华大学出版社清华大学出版社出版时间:出版时间: 20042004版次:版次: 1 1 实验时间:第实验时间:第7 7周周- -第第1212周(周(6 6周),每周二晚上周),每周二晚上7:30-9:007:30-9:00实验地点:文波楼机房实验地点:文波楼机房217217 实验前,认真学习教材以及实验指导书的相关内容,提前做实验前,认真学习教材以及实验指导书的相关内容,提前做好实验准备。好实验准备。 实验结束后提交实验报告,实验报告内容应包括(参照实验结束后提交实验报告,实验
2、报告内容应包括(参照实实验报告格式验报告格式.doc.doc):): 实验目的、实验内容、设计思路和流程框图,源程序(含实验目的、实验内容、设计思路和流程框图,源程序(含注释)清单、测试结果以及实验总结。注释)清单、测试结果以及实验总结。 实验报告杜绝抄袭现象,一经发现雷同,双方成绩均以实验报告杜绝抄袭现象,一经发现雷同,双方成绩均以0 0分计分计算。算。 实验报告完成后班长收齐上交。实验报告完成后班长收齐上交。1 1、预习要求:、预习要求: 进程的基本概念;进程的同步和互斥进程的基本概念;进程的同步和互斥2 2、实验目的:、实验目的: (1 1)掌握进程同步和互斥的含义;)掌握进程同步和互斥
3、的含义;(2 2)能进行多进程的设计。)能进行多进程的设计。3 3、实验内容及要求:、实验内容及要求:参照教材第参照教材第3 3章和章和操作系统实验指导操作系统实验指导实验一实验一的要求,用信号的要求,用信号量机制实现生产者和消费者问题。量机制实现生产者和消费者问题。一、实验目的一、实验目的掌握基本的进程同步与互斥算法,理解生产者掌握基本的进程同步与互斥算法,理解生产者- -消费者问题消费者问题。学习使用学习使用Windows 2000/XPWindows 2000/XP中基本的中基本的同步对象同步对象,掌握相关,掌握相关APIAPI的使用方法。的使用方法。1.1.了解了解Windows 20
4、00/XPWindows 2000/XP中中多线程多线程的并发执行机制,实现进的并发执行机制,实现进程的同步与互斥。程的同步与互斥。 线程与进程的比较线程与进程的比较二、实验内容及要求二、实验内容及要求实验内容:实验内容:l以生产者以生产者- -消费者模型为依据消费者模型为依据,在,在Windows 2000/XPWindows 2000/XP环境下创建一个控环境下创建一个控制台进程,在该进程中创建制台进程,在该进程中创建n n个线程模拟生产者和消费者,实现进程个线程模拟生产者和消费者,实现进程( (线线程程) )的同步与互斥。的同步与互斥。实验要求:实验要求:l学习并理解生产者学习并理解生产
5、者- -消费者模型及其同步和互斥规则;消费者模型及其同步和互斥规则;l学习了解学习了解WindowsWindows同步对象及其特性;同步对象及其特性;l熟悉实验环境,掌握相关熟悉实验环境,掌握相关APIAPI的使用方法;的使用方法;l设计程序,实现生产者设计程序,实现生产者- -消费者进程消费者进程( (线程线程) )的同步与互斥;的同步与互斥;l每个人提交一份实验报告。每个人提交一份实验报告。 生产者和消费者问题生产者和消费者问题生产者进程的功能:生产东西,供消费者消费;生产者进程的功能:生产东西,供消费者消费;消费者进程的功能:消费生产者生产的东西。消费者进程的功能:消费生产者生产的东西。
6、三、相关基础知识介绍三、相关基础知识介绍同步对象同步对象l同步对象是指同步对象是指WindowsWindows中用于实现同步与互斥的实体,包括中用于实现同步与互斥的实体,包括信号信号量量(Semaphore)(Semaphore)、互斥量互斥量(Mutex)(Mutex)、临界区临界区(Critical Section)(Critical Section)和和事件事件(Events)(Events)等。本实验中使用到信号量、互斥量和临界区三个等。本实验中使用到信号量、互斥量和临界区三个同步对象。同步对象。同步对象的使用步骤:同步对象的使用步骤:创建创建/ /初始化同步对象。初始化同步对象。请求
7、该同步对象,随即进入临界区请求该同步对象,随即进入临界区( (这一步相当于这一步相当于P P操作操作) )。释放该同步对象释放该同步对象( (这一步相当于这一步相当于V V操作操作) )。这些对象在一个线程中创建,在其它线程中都可以使用。这些对象在一个线程中创建,在其它线程中都可以使用。三、相关基础知识介绍三、相关基础知识介绍相关相关APIAPI的功能及使用的功能及使用l我们利用我们利用Windows SDKWindows SDK提供的提供的APIAPI编程实现实验题目的要求,编程实现实验题目的要求,在在VCVC中包含有中包含有Windows SDKWindows SDK的所有工具和定义。要使
8、用这些的所有工具和定义。要使用这些APIAPI,需要包含对这些函数进行说明的,需要包含对这些函数进行说明的SDKSDK头文件头文件最常见的是最常见的是Windows.hWindows.h。l下面给出的是本实验使用到的下面给出的是本实验使用到的APIAPI的功能和使用方法的简单介的功能和使用方法的简单介绍。绍。相关相关APIAPI的功能及使用(具体的用法可以参考的功能及使用(具体的用法可以参考MSDNMSDN)(1) CreateThread(1) CreateThreadl功能:创建一个线程,该线程在调用进程的地址空间中执行。功能:创建一个线程,该线程在调用进程的地址空间中执行。l格式:格式:
9、HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParamiter,LPVOID lpParamiter,DWORD dwCreationFlags,DWOR
10、D dwCreationFlags,Lpdword lpThread );Lpdword lpThread );l参数说明:参数说明:lpThreadAttributeslpThreadAttributes指向一个指向一个LPSECURITY_ATTRIBUTES(LPSECURITY_ATTRIBUTES(新线程的安全性描述符新线程的安全性描述符) )。dwStackSizedwStackSize定义原始堆栈大小。定义原始堆栈大小。lpStartAddresslpStartAddress指向使用指向使用LPTHRLPTHREAEAD_START_ROUTINED_START_ROUTINE类
11、型定义的函数。类型定义的函数。lpParamiterlpParamiter定义一个给进程传递参数的指针。定义一个给进程传递参数的指针。dwCreationFlagsdwCreationFlags定义控制线程创建的附加标志。定义控制线程创建的附加标志。lpThreadlpThread保存线程标志符保存线程标志符(32(32位位) )handle在在windows中表示一个中表示一个void型指针,占用型指针,占用32bit空间,空间,用来标示不同的用来标示不同的API对象,例对象,例如:信号量、线程等如:信号量、线程等相关相关APIAPI的功能及使用的功能及使用(2) CreateMutex(2
12、) CreateMutex结合以下结合以下2 2个函数使用:个函数使用:WaitForSingleObjectWaitForSingleObject(对应对应p p操作)互斥量上锁;操作)互斥量上锁;ReleaseMutexReleaseMutex(对应对应v v操作)互斥量解锁。操作)互斥量解锁。l功能:创建一个命名的或者匿名的互斥量对象功能:创建一个命名的或者匿名的互斥量对象l格式:格式:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lp
13、MutexAttributes,BOOL bInitialOwner,BOOL bInitialOwner,LPCTSTR lpName);LPCTSTR lpName);l参数说明:参数说明:lpMutexAttributeslpMutexAttributes必须取值必须取值NULLNULL。bInitialOwnerbInitialOwner指示当前线程是否马上拥有该互斥量指示当前线程是否马上拥有该互斥量( (即马上加锁即马上加锁) )。lpNamelpName互斥量名称。互斥量名称。相关相关APIAPI的功能及使用的功能及使用(3) CreateSemaphore(3) CreateSe
14、maphorel功能:创建一个命名的或者匿名的信号量对象。功能:创建一个命名的或者匿名的信号量对象。l格式:格式:HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lInitialCount, LONG lMaximumCount, LONG lMaximumCount, LPCTSTR lpName ); LPCTSTR
15、lpName );l参数说明:参数说明:lpSemaphoreAttributeslpSemaphoreAttributes必须取值必须取值NULLNULL。lInitialCountlInitialCount信号量的初始值。该值大于信号量的初始值。该值大于0 0,但小于,但小于l lMaximumCountMaximumCount指定的最大值。指定的最大值。lMaximumCountlMaximumCount信号量的最大值。信号量的最大值。lpNamelpName信号量名称。信号量名称。相关相关APIAPI的功能及使用的功能及使用(4) WaitForSingleObject(4) Wait
16、ForSingleObjectl功能功能: :使程序处于等待状态,直到信号量或者互斥量出现使程序处于等待状态,直到信号量或者互斥量出现或者超过规定的等待时间。信号量出现指信号量大于或等于或者超过规定的等待时间。信号量出现指信号量大于或等于1 1,互斥量出现指互斥量解锁。在返回之前将信号量减,互斥量出现指互斥量解锁。在返回之前将信号量减1 1或者或者互斥量加锁。互斥量加锁。l格式格式: :DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);DWORD WaitForSingleObject(HANDLE hHandle,
17、 DWORD dwMilliseconds);l参数说明参数说明: :hHandlehHandle信号量指针。信号量指针。dwMillisecondsdwMilliseconds等待的最长时间等待的最长时间(INFINITE(INFINITE为无限等待为无限等待) )。相关相关APIAPI的功能及使用的功能及使用(5) ReleaseSemaphore(5) ReleaseSemaphorel功能功能: :对指定信号量加上一个指定大小的量。成功执行则对指定信号量加上一个指定大小的量。成功执行则返回非返回非0 0值。值。l格式格式: :BOOL ReleaseSemaphore( HANDLE
18、hSemaphore,BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LONG lReleaseCount, LPLONG lppreviousCount); LPLONG lppreviousCount);l参数说明参数说明: :hSemaphorehSemaphore信号量指针。信号量指针。lReleaseCountlReleaseCount信号量的增量。信号量的增量。lppreviousCountlppreviousCount保存信号量当前值。保存信号量当前值。相关相关APIAPI的功能及使用的功能及使用(6)
19、ReleaseMutex(6) ReleaseMutexl功能:用来打开互斥锁(互斥量解锁),即将互斥量加功能:用来打开互斥锁(互斥量解锁),即将互斥量加1 1。成功调用则。成功调用则返回返回0 0。l格式:格式:BOOL ReleaseMutex(HANDLE hMutex);BOOL ReleaseMutex(HANDLE hMutex);l参数说明:参数说明:hMutexhMutex互斥量指针。互斥量指针。(7) InitializeCriticalSection(7) InitializeCriticalSectionl功能:初始化临界区对象功能:初始化临界区对象l格式:格式:VOID
20、 InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l参数说明:参数说明:lpCriticalSectionlpCriticalSection指向临界区对象的指针。指向临界区对象的指针。相关相关APIAPI的功能及使用的功能及使用(8) EnterCriticalSection(8) EnterCriticalSectionl功能:该函数用于等待指定临界区对象的所有权。当调用线程被
21、赋予功能:该函数用于等待指定临界区对象的所有权。当调用线程被赋予所有权时,该函数返回。所有权时,该函数返回。l格式:格式:VOID enterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID enterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l参数说明:参数说明:lpCriticalSectionlpCriticalSection指向临界区对象的指针。指向临界区对象的指针。(9) LeaveCriticalSection(9) LeaveCriticalSec
22、tionl功能功能: :释放指定临界区对象的所有权。释放指定临界区对象的所有权。l格式格式: :VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l参数说明参数说明: :lpCriticalSectionlpCriticalSection指向临界区对象的指针。指向临界区对象的指针。四、程序的实现四、程序的实现程序的结构包括程序的结构包括:一个主函数、分别用于模拟消费者和生产:一个主函数、分别
23、用于模拟消费者和生产者的两个函数以及三个辅助性的函数。者的两个函数以及三个辅助性的函数。主函数主函数用于初始化缓冲区和各个同步对象,并完成线程信用于初始化缓冲区和各个同步对象,并完成线程信息的读入和记录,最后根据该组线程记录启动模拟线程,并息的读入和记录,最后根据该组线程记录启动模拟线程,并等待所有线程的运行结束后退出整个程序。等待所有线程的运行结束后退出整个程序。消费者和生产者函数消费者和生产者函数运行于相应线程中完成对缓冲区的读运行于相应线程中完成对缓冲区的读写动作。写动作。三个辅助函数三个辅助函数被生产者和消费者函数调用,是生产和消费被生产者和消费者函数调用,是生产和消费函数中对缓冲区访
24、问功能的一些包装。函数中对缓冲区访问功能的一些包装。四、程序的实现四、程序的实现 数据结构数据结构用一个整型数组用一个整型数组Buffer_CriticalBuffer_Critical表示缓冲区。表示缓冲区。缓冲区数组初始化为缓冲区数组初始化为-1-1(表示缓冲区为空)(表示缓冲区为空)当生产者找到一个空的缓冲区,准备将生产的产品放入其中前,将该缓当生产者找到一个空的缓冲区,准备将生产的产品放入其中前,将该缓冲区的值设为冲区的值设为-2-2,表示该缓冲区正处于被写的状态,不允许其他生产者,表示该缓冲区正处于被写的状态,不允许其他生产者访问该缓冲区访问该缓冲区生产者将自己的生产者将自己的IDI
25、D号作为产品编号写入缓冲区,方便消费者识别号作为产品编号写入缓冲区,方便消费者识别缓冲区数组缓冲区数组Buffer_CriticalBuffer_Critical:1-2-1-1.四、程序的实现四、程序的实现 数据结构数据结构2.2.用一个用一个自定义结构自定义结构ThreadInfoThreadInfo记录一条线程的信息,多个线程对应一个记录一条线程的信息,多个线程对应一个ThreadInfoThreadInfo数组。数组。线程信息数组线程信息数组ThreadInfo ThreadInfo :线程号serial线程标识(P/C)entity延迟时间delay请求个数n_request请求数组
26、thread_request.存放请求产品号的数组四、程序的实现四、程序的实现 数据结构数据结构3.3.通过如下同步对象实现互斥:通过如下同步对象实现互斥:l设一个互斥量设一个互斥量h_mutexh_mutex,实现生产者在查询和保留缓冲区的下一个空位,实现生产者在查询和保留缓冲区的下一个空位置时进行互斥。置时进行互斥。l每 一 个 生 产 者 用 一 个 信 号 量 与 其 消 费 者 同 步 , 通 过 设 置每 一 个 生 产 者 用 一 个 信 号 量 与 其 消 费 者 同 步 , 通 过 设 置h_Semaphoreh_SemaphoreMAX_THREAD_NUMMAX_THRE
27、AD_NUM信号量数组实现,表示相应产品已经生信号量数组实现,表示相应产品已经生产。同时用一个表示空缓冲区数目的信号量产。同时用一个表示空缓冲区数目的信号量empty_semephoreempty_semephore指示是否指示是否存在空位置,以便开始下一个产品的生产。存在空位置,以便开始下一个产品的生产。l每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,通每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,通过设置临界区对象数组过设置临界区对象数组PC_CriticalPC_CriticalMAX_BUFFER_NUMMAX_BUFFER_NUM实现。实现。四、程序的实现四、
28、程序的实现 实验环境:实验环境: Windows 2000/XP + Visual C+ 6.0 Windows 2000/XP + Visual C+ 6.0 实验步骤:实验步骤: 在在VCVC里新建一个名为里新建一个名为R_WP1R_WP1的的win32 console applicationwin32 console application工工程。程。 在工程中创建一个名为在工程中创建一个名为R_WP1.cppR_WP1.cpp的源文件,输入源程序代的源文件,输入源程序代码。码。 编译连接程序,得到编译连接程序,得到R_WP1.exeR_WP1.exe文件文件, , 然后把给定的然后把给
29、定的test.txttest.txt文件存入文件存入R_WP1R_WP1工程所在目录下的工程所在目录下的debugdebug文件夹里。文件夹里。 在在DOSDOS控制台里运行该程序。控制台里运行该程序。四、程序的实现四、程序的实现实验所用的测试用例文件实验所用的测试用例文件创建一个控制台进程,在此进程中创建创建一个控制台进程,在此进程中创建n n个线程来模拟生产者或者消费者。这个线程来模拟生产者或者消费者。这些线程的信息在些线程的信息在“测试用例文件测试用例文件”中予以指定。该文件的格式和含义如下:中予以指定。该文件的格式和含义如下: 3 31 P 31 P 32 P 42 P 43 C 4
30、13 C 4 14 P 24 P 25 C 3 1 2 45 C 3 1 2 4说明:说明:第一行:给出的是程序中设置的临界区的个数;其余各行分别描述了一个生产者或者消费者线第一行:给出的是程序中设置的临界区的个数;其余各行分别描述了一个生产者或者消费者线程的信息。每行中的数据之间用程的信息。每行中的数据之间用TabTab键分隔。键分隔。第一列:线程号。(不管是消费者还是生产者,都有一个对应的线程号)。第一列:线程号。(不管是消费者还是生产者,都有一个对应的线程号)。第二列:第二列:P P生产者,生产者,C C消费者。消费者。第三列:线程在生产和消费前的休眠时间,单位为秒。设置这个参数的目的是
31、可以通过调整这第三列:线程在生产和消费前的休眠时间,单位为秒。设置这个参数的目的是可以通过调整这一列参数,控制开始进行生产和消费动作的时间。一列参数,控制开始进行生产和消费动作的时间。如果是生产者,则该行只有三个字段。如果代表消费者,则该行后边还有若干字段,代表要求如果是生产者,则该行只有三个字段。如果代表消费者,则该行后边还有若干字段,代表要求消费的产品所对应的生产者的线程号。消费的产品所对应的生产者的线程号。典型测试用例分析典型测试用例分析3号生产者生产产品放到号生产者生产产品放到0号缓冲区单元号缓冲区单元4号消费者等待号消费者等待1号生产者生产号生产者生产2号生产者生产产品放到号生产者生
32、产产品放到1号缓冲区单元号缓冲区单元1号生产者生产产品放到号生产者生产产品放到2号缓冲区单元号缓冲区单元 (4号消费者等待号消费者等待1号生产者生产号生产者生产),),1号生产者完成生产后号生产者完成生产后,4号消费者被激活号消费者被激活,此时,此时4号消费者所要求的号消费者所要求的1、3、2号生号生产者的产品都已经放在缓冲区单元中,所以产者的产品都已经放在缓冲区单元中,所以4号消费者依次号消费者依次进行进行3个产品的消费。个产品的消费。 消费完成后如果没有其他的消费者请求消费该产品,则释消费完成后如果没有其他的消费者请求消费该产品,则释放该产品所占用的缓冲区单元。放该产品所占用的缓冲区单元。
33、同步和互斥同步和互斥-11.生产者请求生产,首先要判断当前缓冲区中是否有一生产者请求生产,首先要判断当前缓冲区中是否有一个 空 的 缓 冲 区 单 元 , 设 置 一 个 同 步 信 号 量个 空 的 缓 冲 区 单 元 , 设 置 一 个 同 步 信 号 量empty_semaphore来表示缓冲区中空的缓冲区单元的来表示缓冲区中空的缓冲区单元的数量,初始值是缓冲区的数目。数量,初始值是缓冲区的数目。 对应的对应的P操作为(操作为(在生产者进程中):): 对应的对应的V操作为(操作为(在消费者进程中):):同步和互斥同步和互斥-22.在为生产者分配空的缓冲区单元时,生产者之间要互斥,设置一个
34、互斥信号量h_mutex来实现对空的缓冲区单元的互斥访问。 对应的P操作为: 对应的V操作为:同步和互斥同步和互斥-33.对于每一个生产者,生产完产品后要告诉消费者生产已经完成,使它生产的产品可以被多个 消 费 者 使 用 , 设 置 一 个 同 步 信 号 量h_Semaphore来实现生产者和消费者之间的同步。 对应的P操作为(在消费者进程中): 对应的V操作为(在生产者进程中):同步和互斥同步和互斥-3 信号量数组h_Semaphore初始化为0,最大值是线程的实际数目,消费者在消费相应的产品时,先要对对应的生产者的信号量进行测试,看生产者是否已经生产此产品,如果生产则消费,如果没有生产
35、则等待(如果一直等待有可能会出现死锁),为了不出现死锁,可将等待的最长时间设为5秒,如果超时则认为出现死锁,此时放弃对此产品的消费,进而消费下一个没有消费的产品。 生产者生产了产品时,为对应的信号量一次增加的值是线程的实际数目n_Thread,因此同一个产品最多允许n_Thread个消费者消费。同步和互斥同步和互斥-44.消费者和消费者之间的互斥: 缓冲区是一个临界资源,每一次只允许一个消费者进入到某一个缓冲区单元消费产品,设置一个临界区数组PC_Critical来实现对缓冲区的互斥访问。 对应的P操作(进入临界区): 对应的V操作(离开临界区):l 要求:要求: 分析程序结构,看懂源程序,把
36、程序调通;分析程序结构,看懂源程序,把程序调通; 自己设计不同的测试用例,分析、观察程序运行的自己设计不同的测试用例,分析、观察程序运行的结果(程序运行的结果和分析要在实验报告中写出结果(程序运行的结果和分析要在实验报告中写出来);来); 在某些情况下会出现死锁,修改程序,解决死锁。在某些情况下会出现死锁,修改程序,解决死锁。每个同学交一份实验报告。(每个同学交一份实验报告。(11.111.1号之前交)号之前交)解决生产者和消费者模型解决生产者和消费者模型中的死锁问题中的死锁问题死锁例子死锁例子 消费者C请求3号产品而等待,而生产3号产品的生产者3因请求空缓冲区而等待(缓冲区满),相互等待,出
37、现死锁。死锁分析 源程序中之所以会产生死锁,是因为源程序中之所以会产生死锁,是因为消费者对产品的消费消费者对产品的消费是按次序执行的是按次序执行的,当生产者生产的产品占满缓冲区,缓冲,当生产者生产的产品占满缓冲区,缓冲区中却没有消费者所需要的产品时,消费者等待,同时其区中却没有消费者所需要的产品时,消费者等待,同时其他生产者因得不到缓冲区而被阻塞,因此造成了死锁。他生产者因得不到缓冲区而被阻塞,因此造成了死锁。 如果,如果,让消费者在当前没有所需产品的情况下先跳过该产让消费者在当前没有所需产品的情况下先跳过该产品,而去消费下一个要消费的产品品,而去消费下一个要消费的产品,如此进行下去,缓冲,如
38、此进行下去,缓冲区中的产品肯定是消费者所需的某个产品。消费后,缓冲区中的产品肯定是消费者所需的某个产品。消费后,缓冲区得以释放,其他生产者也可继续运行。然后再循环消费区得以释放,其他生产者也可继续运行。然后再循环消费消费者所需的产品,直到进程结束即可。消费者所需的产品,直到进程结束即可。死锁分析 用上述解决死锁的方案,既然消费者得不到用上述解决死锁的方案,既然消费者得不到3号生产者的产品,号生产者的产品,可跳过此产品可跳过此产品,先去消费,先去消费下一个(即下一个(即1号)生产者的产品,此时缓冲区号)生产者的产品,此时缓冲区中存在中存在1号生产者的产品,因此可以消费,消号生产者的产品,因此可以
39、消费,消费后相应的缓冲区得到释放,费后相应的缓冲区得到释放,3号生产者得到号生产者得到缓冲区而不必阻塞。然后消费者循环消费所缓冲区而不必阻塞。然后消费者循环消费所需的产品即可,直到整个进程的结束。需的产品即可,直到整个进程的结束。 显然死锁问题被解决了。显然死锁问题被解决了。解决死锁的基本思路解决死锁的基本思路 改变消费者对产品的消费顺序改变消费者对产品的消费顺序,为等待消费,为等待消费的产品信号量的产品信号量设一个最大等待时间,当等待设一个最大等待时间,当等待超时时,就认为出现了死锁超时时,就认为出现了死锁,此时暂时放弃,此时暂时放弃对本产品的消费,转而消费下一个产品,当对本产品的消费,转而
40、消费下一个产品,当再次对导致死锁的那个产品有消费请求时,再次对导致死锁的那个产品有消费请求时,一般来说已经有空的缓冲区了,生产者已经一般来说已经有空的缓冲区了,生产者已经生产了此产品,可以立即消费,如果还没有生产了此产品,可以立即消费,如果还没有生产,可以等到下一轮再请求,必有可以消生产,可以等到下一轮再请求,必有可以消费的时候,因此不会死锁。费的时候,因此不会死锁。对源程序的改进(对消费者进程的改进)对源程序的改进(对消费者进程的改进)/循环进行所需产品的消费for(i=0;counter!=0;i=(i+1)%m_requestNum)/增加了一个新的变量counter,初始值为请求的个数
41、,counter=m_requestNum;if(m_thread_requesti=-1)/消费请求已经得到满足continue;/请求消费产品printf(“Consumer%2drequesttoconsume%2dproduct.n,m_serial,m_thread_requesti);/如果对应的生产者没有生产,则等待有限的时间(例如5秒),超时后退出该产品的等待,转去消费下一个产品wait_for_semaphore=WaitForSingleObject(h_Semaphorem_thread_requesti,5000);if(wait_for_semaphore=WAIT_
42、TIMEOUT)printf(“Consumer%2dcanntconsume%2dproductnowandbegintocomsumethenextproduct.n”,m_serial,m_thread_requesti);continue;对源程序的改进(对消费者进程的改进)对源程序的改进(对消费者进程的改进)/查询要消费的产品放在哪一个缓冲区中intBufferPos=FindBufferPosition(m_thread_requesti);/开始进行具体缓冲区的消费处理,读和读在该缓冲区上仍然是互斥的;/进入临界区后执行消费动作;并在完成此次请求后,通知另外的消费者本处请求已经满
43、足;同时如果对应的产品使用完毕,就将相应缓冲区清空,并增加代表空缓冲区的信号量;EnterCriticalSection(&PC_CriticalBufferPos);printf(“Consumer%2dbegintoconsume%2dproduct.n,m_serial,m_thread_requesti);(ThreadInfo*)(p)-thread_requesti=-1;counter-;对源程序的改进(对消费者进程的改进)对源程序的改进(对消费者进程的改进)if(!IfInOtherRequest(m_thread_requesti)Buffer_CriticalBuf
44、ferPos=-1;/标记缓冲区为空;printf(“Consumer%2dfinishconsuming%2dproduct.n,m_serial,m_thread_requesti);printf(position%2d:%3dn,BufferPos,Buffer_CriticalBufferPos);ReleaseSemaphore(empty_semaphore,1,NULL);/使空缓冲区的个数加1elseprintf(Consumer%2dfinishconsumingproduct%2dn,m_serial,m_thread_requesti);/离开临界区LeaveCritic
45、alSection(&PC_CriticalBufferPos);1 1、预习要求:、预习要求: 存储管理的基本方法。存储管理的基本方法。2 2、实验目的:、实验目的: (1 1) 理解内存管理机制,掌握页式虚拟存储技术;理解内存管理机制,掌握页式虚拟存储技术;(2 2) 掌握掌握 Windows Windows 环境下内存管理的基本环境下内存管理的基本APIAPI。3 3、实验内容及要求:、实验内容及要求: 按照按照操作系统实验指导操作系统实验指导实验二的要求,设计程序来实现。实验二的要求,设计程序来实现。一、实验目的一、实验目的1 1理解内存分配原理,特别是页式虚拟内存分配(理解内
46、存分配原理,特别是页式虚拟内存分配(4.4 4.4 请求分请求分页存储管理)方法。页存储管理)方法。2 2了解了解Windows 2000/XPWindows 2000/XP的内存管理机制,掌握页式虚拟存储的内存管理机制,掌握页式虚拟存储技术。技术。3 3掌握掌握Windows 2000/XPWindows 2000/XP中内存管理基本中内存管理基本APIAPI的使用方法。的使用方法。二、实验内容及要求二、实验内容及要求1 1实验内容实验内容在程序中,用一个在程序中,用一个线程模拟线程模拟各种虚存活动,如虚存的保留各种虚存活动,如虚存的保留、提交等。、提交等。用一个用一个监控线程监控线程实时监
47、控系统当前的虚存操作,并在控制实时监控系统当前的虚存操作,并在控制台输出虚存操作信息。要求监控线程与模拟虚存活动的线程台输出虚存操作信息。要求监控线程与模拟虚存活动的线程保持同步,即模拟线程出现模拟活动,监控线程应立即监控保持同步,即模拟线程出现模拟活动,监控线程应立即监控到该活动的信息。到该活动的信息。在用监控线程监控内存活动的同时,汇报整个存储系统的在用监控线程监控内存活动的同时,汇报整个存储系统的使用情况。使用情况。2 2实验要求实验要求学习并理解学习并理解WindowsWindows中的虚拟存储技术;中的虚拟存储技术;学习了解虚存页面的状态及操作;学习了解虚存页面的状态及操作;熟悉实验
48、环境,掌握相关熟悉实验环境,掌握相关APIAPI的使用方法;的使用方法;设计程序,实现虚存活动的模拟及监控;设计程序,实现虚存活动的模拟及监控;提交实验报告。提交实验报告。三、相关知识介绍三、相关知识介绍1 1WindowsWindows中的虚拟存储技术中的虚拟存储技术Windows 2000/XPWindows 2000/XP作为作为3232位操作系统,提供位操作系统,提供3232位虚地址,每个位虚地址,每个进程虚地址空间最多进程虚地址空间最多4GB4GB,其中,其中2GB2GB为进程的私有空间(为进程的私有空间(用户可以访问),操作系统占用剩下的用户可以访问),操作系统占用剩下的2GB2G
49、B。Windows 2000/XPWindows 2000/XP以页为单位进行虚拟内存的分配以页为单位进行虚拟内存的分配,WindowsWindows利用利用页面文件(页面文件(pagefile.syspagefile.sys)来实现物理内存的扩来实现物理内存的扩展。需要时,将数据从页面文件移到内存,或者将数据从内存展。需要时,将数据从页面文件移到内存,或者将数据从内存移到页面文件以便释放内存空间。移到页面文件以便释放内存空间。页面文件和内存构成页面文件和内存构成“虚拟内存虚拟内存”/ /地址空间地址空间/ /虚拟存储器虚拟存储器/ /虚虚拟空间。拟空间。三、相关知识介绍三、相关知识介绍2.2
50、.虚拟页面的状态虚拟页面的状态 (1) (1) 页面的种类页面的种类 每个进程的虚拟地址空间中的页面状态可以分为每个进程的虚拟地址空间中的页面状态可以分为3 3种:种:提交页面:已经分得内存块的虚拟页面;提交页面:已经分得内存块的虚拟页面;保留页面:逻辑页面已经分配,但还没有分配内存块;保留页面:逻辑页面已经分配,但还没有分配内存块;空闲页面:可以保留或者提交的可用页面。空闲页面:可以保留或者提交的可用页面。三、相关知识介绍三、相关知识介绍2.2.虚拟页面的状态虚拟页面的状态 (2) (2) 页面的操作页面的操作 保留:保留进程的虚拟地址空间,但不分配物理存储空间;保留:保留进程的虚拟地址空间
51、,但不分配物理存储空间;提交:在内存中为进程的虚拟地址空间分配物理存储空间;提交:在内存中为进程的虚拟地址空间分配物理存储空间;回收回收/ /除配:释放物理内存空间,但是虚拟地址空间仍然保留;除配:释放物理内存空间,但是虚拟地址空间仍然保留;释放:将物理内存空间和虚拟地址空间全部释放;释放:将物理内存空间和虚拟地址空间全部释放;加锁:对已经提交的页面进行加锁操作或者对已经加锁的页面加锁:对已经提交的页面进行加锁操作或者对已经加锁的页面进行解锁。进行解锁。三、相关知识介绍三、相关知识介绍3.3.存储系统的统计指标:存储系统的统计指标:MEMORYSTATUS Structure MEMORYST
52、ATUS Structure 该结构体用来表示系统当前的虚拟内该结构体用来表示系统当前的虚拟内存和物理内存的状态信息。函数存和物理内存的状态信息。函数GlobalMemoryStatusGlobalMemoryStatus从该结构从该结构体中获取数据。体中获取数据。Syntax:typedefstruct_MEMORYSTATUSDWORDdwLength;DWORDdwMemoryLoad;/物理内存使用负荷(百分数表示,当前物理内存已被占用多少)SIZE_TdwTotalPhys;/物理内存总数SIZE_TdwAvailPhys;/可用物理内存数SIZE_TdwTotalPageFile;
53、/页面文件总数SIZE_TdwAvailPageFile;/可用页面文件数SIZE_TdwTotalVirtual;/虚存空间总数:2GSIZE_TdwAvailVirtual;/可用虚存空间数MEMORYSTATUS,*LPMEMORYSTATUS;三、相关知识介绍三、相关知识介绍MEMORYSTATUS StructureMEMORYSTATUS Structure该函数详细用法可以参考下面该函数详细用法可以参考下面MSDNMSDN在线帮助:在线帮助:http:/ Structure MEMORY_BASIC_INFORMATION Structure 该结构体表示进程在某该结构体表示进程
54、在某一个具体的虚拟地址空间的页面状态信息。一个具体的虚拟地址空间的页面状态信息。typedefstruct_MEMORY_BASIC_INFORMATIONPVOIDBaseAddress;PVOIDAllocationBase;DWORDAllocationProtect;SIZE_TRegionSize;DWORDState;/页面状态DWORDProtect;/页面保护属性DWORDType;MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;MSDNMSDN在线帮助:在线帮助: http:/ http:/ (1) _(1) _begi
55、nthreadexbeginthreadex函数:创建新线程(在本实验中,创建了函数:创建新线程(在本实验中,创建了2 2个线程:个线程:simulatorsimulator模拟线程和模拟线程和inspectorinspector监控线程)监控线程)(2) Sleep(2) Sleep函数:使当前线程休眠函数:使当前线程休眠(3) (3) VirtualAllocVirtualAlloc函数函数:保留或提交某一范围的虚拟地址:保留或提交某一范围的虚拟地址(4) (4) VirtualFreeVirtualFree函数:解除已被提交的虚存,或释放被保留函数:解除已被提交的虚存,或释放被保留/ /
56、提交的进程虚拟地址空间提交的进程虚拟地址空间(5) (5) VirtualProtectVirtualProtect函数:改变虚拟内存页的保护方式函数:改变虚拟内存页的保护方式(6) (6) VirtualLockVirtualLock和和VirtualUnlockVirtualUnlock函数:锁定或解锁虚拟内存函数:锁定或解锁虚拟内存页页 (7) (7) VirtualQueryVirtualQuery函数:查询进程的虚拟内存函数:查询进程的虚拟内存 (8) (8) GlobalMemoryStatusGlobalMemoryStatus函数:获取程序存储空间的使用状况函数:获取程序存储空间的使用状况以及系统的使用情况信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国矿业大学徐海学院《口腔局部解剖》2025-2026学年期末试卷
- 运城学院《广播文艺》2025-2026学年期末试卷
- 运城师范高等专科学校《临床药物治疗学》2025-2026学年期末试卷
- 2024年初中教案怎么写地理
- 置入式心律转复除颤器的电容器
- 2021年中考数学一轮复习专题精讲精练专题19 四边形(学案)
- 2#自蒸发器压力控制系统设计
- 数据的分组课件2025-2026学年人教版数学八年级下册
- 通信及基础工程26
- 2024年单位办公楼管理办法(8篇)
- 党务基础知识题库(附参考答案)
- 2025年全国高中生物竞赛试题
- 交通安全教育主题班会课件
- 预防医学高级职称考试试题及答案
- 村干部违法违纪培训课件
- GB 4053.2-2025固定式金属梯及平台安全要求第2部分:斜梯
- 工厂声明协议书
- DB11∕T 2446-2025 滨水慢行系统规划设计导则
- 金融机构安全自查报告
- 物业管理师实操题库及案例分析含答案
- 肝血管瘤的治疗及护理
评论
0/150
提交评论