上機(jī)實(shí)驗(yàn)安排課件_第1頁(yè)
上機(jī)實(shí)驗(yàn)安排課件_第2頁(yè)
上機(jī)實(shí)驗(yàn)安排課件_第3頁(yè)
上機(jī)實(shí)驗(yàn)安排課件_第4頁(yè)
上機(jī)實(shí)驗(yàn)安排課件_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)作作 者:者: 任愛(ài)華,李鵬,劉方毅編著任愛(ài)華,李鵬,劉方毅編著出出 版版 社:社: 清華大學(xué)出版社清華大學(xué)出版社出版時(shí)間:出版時(shí)間: 20042004版次:版次: 1 1 實(shí)驗(yàn)時(shí)間:第實(shí)驗(yàn)時(shí)間:第7 7周周- -第第1212周(周(6 6周),每周二晚上周),每周二晚上7:30-9:007:30-9:00實(shí)驗(yàn)地點(diǎn):文波樓機(jī)房實(shí)驗(yàn)地點(diǎn):文波樓機(jī)房217217 實(shí)驗(yàn)前,認(rèn)真學(xué)習(xí)教材以及實(shí)驗(yàn)指導(dǎo)書(shū)的相關(guān)內(nèi)容,提前做實(shí)驗(yàn)前,認(rèn)真學(xué)習(xí)教材以及實(shí)驗(yàn)指導(dǎo)書(shū)的相關(guān)內(nèi)容,提前做好實(shí)驗(yàn)準(zhǔn)備。好實(shí)驗(yàn)準(zhǔn)備。 實(shí)驗(yàn)結(jié)束后提交實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)報(bào)告內(nèi)容應(yīng)包括(參照實(shí)驗(yàn)結(jié)束后提交實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)

2、報(bào)告內(nèi)容應(yīng)包括(參照實(shí)實(shí)驗(yàn)報(bào)告格式驗(yàn)報(bào)告格式.doc.doc):): 實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容、設(shè)計(jì)思路和流程框圖,源程序(含實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容、設(shè)計(jì)思路和流程框圖,源程序(含注釋)清單、測(cè)試結(jié)果以及實(shí)驗(yàn)總結(jié)。注釋)清單、測(cè)試結(jié)果以及實(shí)驗(yàn)總結(jié)。 實(shí)驗(yàn)報(bào)告杜絕抄襲現(xiàn)象,一經(jīng)發(fā)現(xiàn)雷同,雙方成績(jī)均以實(shí)驗(yàn)報(bào)告杜絕抄襲現(xiàn)象,一經(jīng)發(fā)現(xiàn)雷同,雙方成績(jī)均以0 0分計(jì)分計(jì)算。算。 實(shí)驗(yàn)報(bào)告完成后班長(zhǎng)收齊上交。實(shí)驗(yàn)報(bào)告完成后班長(zhǎng)收齊上交。1 1、預(yù)習(xí)要求:、預(yù)習(xí)要求: 進(jìn)程的基本概念;進(jìn)程的同步和互斥進(jìn)程的基本概念;進(jìn)程的同步和互斥2 2、實(shí)驗(yàn)?zāi)康模?、?shí)驗(yàn)?zāi)康模?(1 1)掌握進(jìn)程同步和互斥的含義;)掌握進(jìn)程同步和互斥

3、的含義;(2 2)能進(jìn)行多進(jìn)程的設(shè)計(jì)。)能進(jìn)行多進(jìn)程的設(shè)計(jì)。3 3、實(shí)驗(yàn)內(nèi)容及要求:、實(shí)驗(yàn)內(nèi)容及要求:參照教材第參照教材第3 3章和章和操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)實(shí)驗(yàn)一實(shí)驗(yàn)一的要求,用信號(hào)的要求,用信號(hào)量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問(wèn)題。量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問(wèn)題。一、實(shí)驗(yàn)?zāi)康囊?、?shí)驗(yàn)?zāi)康恼莆栈镜倪M(jìn)程同步與互斥算法,理解生產(chǎn)者掌握基本的進(jìn)程同步與互斥算法,理解生產(chǎn)者- -消費(fèi)者問(wèn)題消費(fèi)者問(wèn)題。學(xué)習(xí)使用學(xué)習(xí)使用Windows 2000/XPWindows 2000/XP中基本的中基本的同步對(duì)象同步對(duì)象,掌握相關(guān),掌握相關(guān)APIAPI的使用方法。的使用方法。1.1.了解了解Windows 20

4、00/XPWindows 2000/XP中中多線程多線程的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)程的同步與互斥。程的同步與互斥。 線程與進(jìn)程的比較線程與進(jìn)程的比較二、實(shí)驗(yàn)內(nèi)容及要求二、實(shí)驗(yàn)內(nèi)容及要求實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)內(nèi)容:l以生產(chǎn)者以生產(chǎn)者- -消費(fèi)者模型為依據(jù)消費(fèi)者模型為依據(jù),在,在Windows 2000/XPWindows 2000/XP環(huán)境下創(chuàng)建一個(gè)控環(huán)境下創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在該進(jìn)程中創(chuàng)建制臺(tái)進(jìn)程,在該進(jìn)程中創(chuàng)建n n個(gè)線程模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程個(gè)線程模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程( (線線程程) )的同步與互斥。的同步與互斥。實(shí)驗(yàn)要求:實(shí)驗(yàn)要求:l學(xué)習(xí)并理解生產(chǎn)者學(xué)習(xí)并理解生產(chǎn)

5、者- -消費(fèi)者模型及其同步和互斥規(guī)則;消費(fèi)者模型及其同步和互斥規(guī)則;l學(xué)習(xí)了解學(xué)習(xí)了解WindowsWindows同步對(duì)象及其特性;同步對(duì)象及其特性;l熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)APIAPI的使用方法;的使用方法;l設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者- -消費(fèi)者進(jìn)程消費(fèi)者進(jìn)程( (線程線程) )的同步與互斥;的同步與互斥;l每個(gè)人提交一份實(shí)驗(yàn)報(bào)告。每個(gè)人提交一份實(shí)驗(yàn)報(bào)告。 生產(chǎn)者和消費(fèi)者問(wèn)題生產(chǎn)者和消費(fèi)者問(wèn)題生產(chǎn)者進(jìn)程的功能:生產(chǎn)東西,供消費(fèi)者消費(fèi);生產(chǎn)者進(jìn)程的功能:生產(chǎn)東西,供消費(fèi)者消費(fèi);消費(fèi)者進(jìn)程的功能:消費(fèi)生產(chǎn)者生產(chǎn)的東西。消費(fèi)者進(jìn)程的功能:消費(fèi)生產(chǎn)者生產(chǎn)的東西。

6、三、相關(guān)基礎(chǔ)知識(shí)介紹三、相關(guān)基礎(chǔ)知識(shí)介紹同步對(duì)象同步對(duì)象l同步對(duì)象是指同步對(duì)象是指WindowsWindows中用于實(shí)現(xiàn)同步與互斥的實(shí)體,包括中用于實(shí)現(xiàn)同步與互斥的實(shí)體,包括信號(hào)信號(hào)量量(Semaphore)(Semaphore)、互斥量互斥量(Mutex)(Mutex)、臨界區(qū)臨界區(qū)(Critical Section)(Critical Section)和和事件事件(Events)(Events)等。本實(shí)驗(yàn)中使用到信號(hào)量、互斥量和臨界區(qū)三個(gè)等。本實(shí)驗(yàn)中使用到信號(hào)量、互斥量和臨界區(qū)三個(gè)同步對(duì)象。同步對(duì)象。同步對(duì)象的使用步驟:同步對(duì)象的使用步驟:創(chuàng)建創(chuàng)建/ /初始化同步對(duì)象。初始化同步對(duì)象。請(qǐng)求

7、該同步對(duì)象,隨即進(jìn)入臨界區(qū)請(qǐng)求該同步對(duì)象,隨即進(jìn)入臨界區(qū)( (這一步相當(dāng)于這一步相當(dāng)于P P操作操作) )。釋放該同步對(duì)象釋放該同步對(duì)象( (這一步相當(dāng)于這一步相當(dāng)于V V操作操作) )。這些對(duì)象在一個(gè)線程中創(chuàng)建,在其它線程中都可以使用。這些對(duì)象在一個(gè)線程中創(chuàng)建,在其它線程中都可以使用。三、相關(guān)基礎(chǔ)知識(shí)介紹三、相關(guān)基礎(chǔ)知識(shí)介紹相關(guān)相關(guān)APIAPI的功能及使用的功能及使用l我們利用我們利用Windows SDKWindows SDK提供的提供的APIAPI編程實(shí)現(xiàn)實(shí)驗(yàn)題目的要求,編程實(shí)現(xiàn)實(shí)驗(yàn)題目的要求,在在VCVC中包含有中包含有Windows SDKWindows SDK的所有工具和定義。要使

8、用這些的所有工具和定義。要使用這些APIAPI,需要包含對(duì)這些函數(shù)進(jìn)行說(shuō)明的,需要包含對(duì)這些函數(shù)進(jìn)行說(shuō)明的SDKSDK頭文件頭文件最常見(jiàn)的是最常見(jiàn)的是Windows.hWindows.h。l下面給出的是本實(shí)驗(yàn)使用到的下面給出的是本實(shí)驗(yàn)使用到的APIAPI的功能和使用方法的簡(jiǎn)單介的功能和使用方法的簡(jiǎn)單介紹。紹。相關(guān)相關(guān)APIAPI的功能及使用(具體的用法可以參考的功能及使用(具體的用法可以參考MSDNMSDN)(1) CreateThread(1) CreateThreadl功能:創(chuàng)建一個(gè)線程,該線程在調(diào)用進(jìn)程的地址空間中執(zhí)行。功能:創(chuàng)建一個(gè)線程,該線程在調(diào)用進(jìn)程的地址空間中執(zhí)行。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參數(shù)說(shuō)明:參數(shù)說(shuō)明:lpThreadAttributeslpThreadAttributes指向一個(gè)指向一個(gè)LPSECURITY_ATTRIBUTES(LPSECURITY_ATTRIBUTES(新線程的安全性描述符新線程的安全性描述符) )。dwStackSizedwStackSize定義原始堆棧大小。定義原始堆棧大小。lpStartAddresslpStartAddress指向使用指向使用LPTHRLPTHREAEAD_START_ROUTINED_START_ROUTINE類

11、型定義的函數(shù)。類型定義的函數(shù)。lpParamiterlpParamiter定義一個(gè)給進(jìn)程傳遞參數(shù)的指針。定義一個(gè)給進(jìn)程傳遞參數(shù)的指針。dwCreationFlagsdwCreationFlags定義控制線程創(chuàng)建的附加標(biāo)志。定義控制線程創(chuàng)建的附加標(biāo)志。lpThreadlpThread保存線程標(biāo)志符保存線程標(biāo)志符(32(32位位) )handle在在windows中表示一個(gè)中表示一個(gè)void型指針,占用型指針,占用32bit空間,空間,用來(lái)標(biāo)示不同的用來(lái)標(biāo)示不同的API對(duì)象,例對(duì)象,例如:信號(hào)量、線程等如:信號(hào)量、線程等相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(2) CreateMutex(2

12、) CreateMutex結(jié)合以下結(jié)合以下2 2個(gè)函數(shù)使用:個(gè)函數(shù)使用:WaitForSingleObjectWaitForSingleObject(對(duì)應(yīng)對(duì)應(yīng)p p操作)互斥量上鎖;操作)互斥量上鎖;ReleaseMutexReleaseMutex(對(duì)應(yīng)對(duì)應(yīng)v v操作)互斥量解鎖。操作)互斥量解鎖。l功能:創(chuàng)建一個(gè)命名的或者匿名的互斥量對(duì)象功能:創(chuàng)建一個(gè)命名的或者匿名的互斥量對(duì)象l格式:格式:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lp

13、MutexAttributes,BOOL bInitialOwner,BOOL bInitialOwner,LPCTSTR lpName);LPCTSTR lpName);l參數(shù)說(shuō)明:參數(shù)說(shuō)明:lpMutexAttributeslpMutexAttributes必須取值必須取值NULLNULL。bInitialOwnerbInitialOwner指示當(dāng)前線程是否馬上擁有該互斥量指示當(dāng)前線程是否馬上擁有該互斥量( (即馬上加鎖即馬上加鎖) )。lpNamelpName互斥量名稱?;コ饬棵Q。相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(3) CreateSemaphore(3) CreateSe

14、maphorel功能:創(chuàng)建一個(gè)命名的或者匿名的信號(hào)量對(duì)象。功能:創(chuàng)建一個(gè)命名的或者匿名的信號(hào)量對(duì)象。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參數(shù)說(shuō)明:參數(shù)說(shuō)明:lpSemaphoreAttributeslpSemaphoreAttributes必須取值必須取值NULLNULL。lInitialCountlInitialCount信號(hào)量的初始值。該值大于信號(hào)量的初始值。該值大于0 0,但小于,但小于l lMaximumCountMaximumCount指定的最大值。指定的最大值。lMaximumCountlMaximumCount信號(hào)量的最大值。信號(hào)量的最大值。lpNamelpName信號(hào)量名稱。信號(hào)量名稱。相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(4) WaitForSingleObject(4) Wait

16、ForSingleObjectl功能功能: :使程序處于等待狀態(tài),直到信號(hào)量或者互斥量出現(xiàn)使程序處于等待狀態(tài),直到信號(hào)量或者互斥量出現(xiàn)或者超過(guò)規(guī)定的等待時(shí)間。信號(hào)量出現(xiàn)指信號(hào)量大于或等于或者超過(guò)規(guī)定的等待時(shí)間。信號(hào)量出現(xiàn)指信號(hào)量大于或等于1 1,互斥量出現(xiàn)指互斥量解鎖。在返回之前將信號(hào)量減,互斥量出現(xiàn)指互斥量解鎖。在返回之前將信號(hào)量減1 1或者或者互斥量加鎖。互斥量加鎖。l格式格式: :DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);DWORD WaitForSingleObject(HANDLE hHandle,

17、 DWORD dwMilliseconds);l參數(shù)說(shuō)明參數(shù)說(shuō)明: :hHandlehHandle信號(hào)量指針。信號(hào)量指針。dwMillisecondsdwMilliseconds等待的最長(zhǎng)時(shí)間等待的最長(zhǎng)時(shí)間(INFINITE(INFINITE為無(wú)限等待為無(wú)限等待) )。相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(5) ReleaseSemaphore(5) ReleaseSemaphorel功能功能: :對(duì)指定信號(hào)量加上一個(gè)指定大小的量。成功執(zhí)行則對(duì)指定信號(hào)量加上一個(gè)指定大小的量。成功執(zhí)行則返回非返回非0 0值。值。l格式格式: :BOOL ReleaseSemaphore( HANDLE

18、hSemaphore,BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LONG lReleaseCount, LPLONG lppreviousCount); LPLONG lppreviousCount);l參數(shù)說(shuō)明參數(shù)說(shuō)明: :hSemaphorehSemaphore信號(hào)量指針。信號(hào)量指針。lReleaseCountlReleaseCount信號(hào)量的增量。信號(hào)量的增量。lppreviousCountlppreviousCount保存信號(hào)量當(dāng)前值。保存信號(hào)量當(dāng)前值。相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(6)

19、ReleaseMutex(6) ReleaseMutexl功能:用來(lái)打開(kāi)互斥鎖(互斥量解鎖),即將互斥量加功能:用來(lái)打開(kāi)互斥鎖(互斥量解鎖),即將互斥量加1 1。成功調(diào)用則。成功調(diào)用則返回返回0 0。l格式:格式:BOOL ReleaseMutex(HANDLE hMutex);BOOL ReleaseMutex(HANDLE hMutex);l參數(shù)說(shuō)明:參數(shù)說(shuō)明:hMutexhMutex互斥量指針。互斥量指針。(7) InitializeCriticalSection(7) InitializeCriticalSectionl功能:初始化臨界區(qū)對(duì)象功能:初始化臨界區(qū)對(duì)象l格式:格式:VOID

20、 InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l參數(shù)說(shuō)明:參數(shù)說(shuō)明:lpCriticalSectionlpCriticalSection指向臨界區(qū)對(duì)象的指針。指向臨界區(qū)對(duì)象的指針。相關(guān)相關(guān)APIAPI的功能及使用的功能及使用(8) EnterCriticalSection(8) EnterCriticalSectionl功能:該函數(shù)用于等待指定臨界區(qū)對(duì)象的所有權(quán)。當(dāng)調(diào)用線程被

21、賦予功能:該函數(shù)用于等待指定臨界區(qū)對(duì)象的所有權(quán)。當(dāng)調(diào)用線程被賦予所有權(quán)時(shí),該函數(shù)返回。所有權(quán)時(shí),該函數(shù)返回。l格式:格式:VOID enterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID enterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l參數(shù)說(shuō)明:參數(shù)說(shuō)明:lpCriticalSectionlpCriticalSection指向臨界區(qū)對(duì)象的指針。指向臨界區(qū)對(duì)象的指針。(9) LeaveCriticalSection(9) LeaveCriticalSec

22、tionl功能功能: :釋放指定臨界區(qū)對(duì)象的所有權(quán)。釋放指定臨界區(qū)對(duì)象的所有權(quán)。l格式格式: :VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);l參數(shù)說(shuō)明參數(shù)說(shuō)明: :lpCriticalSectionlpCriticalSection指向臨界區(qū)對(duì)象的指針。指向臨界區(qū)對(duì)象的指針。四、程序的實(shí)現(xiàn)四、程序的實(shí)現(xiàn)程序的結(jié)構(gòu)包括程序的結(jié)構(gòu)包括:一個(gè)主函數(shù)、分別用于模擬消費(fèi)者和生產(chǎn):一個(gè)主函數(shù)、分別

23、用于模擬消費(fèi)者和生產(chǎn)者的兩個(gè)函數(shù)以及三個(gè)輔助性的函數(shù)。者的兩個(gè)函數(shù)以及三個(gè)輔助性的函數(shù)。主函數(shù)主函數(shù)用于初始化緩沖區(qū)和各個(gè)同步對(duì)象,并完成線程信用于初始化緩沖區(qū)和各個(gè)同步對(duì)象,并完成線程信息的讀入和記錄,最后根據(jù)該組線程記錄啟動(dòng)模擬線程,并息的讀入和記錄,最后根據(jù)該組線程記錄啟動(dòng)模擬線程,并等待所有線程的運(yùn)行結(jié)束后退出整個(gè)程序。等待所有線程的運(yùn)行結(jié)束后退出整個(gè)程序。消費(fèi)者和生產(chǎn)者函數(shù)消費(fèi)者和生產(chǎn)者函數(shù)運(yùn)行于相應(yīng)線程中完成對(duì)緩沖區(qū)的讀運(yùn)行于相應(yīng)線程中完成對(duì)緩沖區(qū)的讀寫(xiě)動(dòng)作。寫(xiě)動(dòng)作。三個(gè)輔助函數(shù)三個(gè)輔助函數(shù)被生產(chǎn)者和消費(fèi)者函數(shù)調(diào)用,是生產(chǎn)和消費(fèi)被生產(chǎn)者和消費(fèi)者函數(shù)調(diào)用,是生產(chǎn)和消費(fèi)函數(shù)中對(duì)緩沖區(qū)訪

24、問(wèn)功能的一些包裝。函數(shù)中對(duì)緩沖區(qū)訪問(wèn)功能的一些包裝。四、程序的實(shí)現(xiàn)四、程序的實(shí)現(xiàn) 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)用一個(gè)整型數(shù)組用一個(gè)整型數(shù)組Buffer_CriticalBuffer_Critical表示緩沖區(qū)。表示緩沖區(qū)。緩沖區(qū)數(shù)組初始化為緩沖區(qū)數(shù)組初始化為-1-1(表示緩沖區(qū)為空)(表示緩沖區(qū)為空)當(dāng)生產(chǎn)者找到一個(gè)空的緩沖區(qū),準(zhǔn)備將生產(chǎn)的產(chǎn)品放入其中前,將該緩當(dāng)生產(chǎn)者找到一個(gè)空的緩沖區(qū),準(zhǔn)備將生產(chǎn)的產(chǎn)品放入其中前,將該緩沖區(qū)的值設(shè)為沖區(qū)的值設(shè)為-2-2,表示該緩沖區(qū)正處于被寫(xiě)的狀態(tài),不允許其他生產(chǎn)者,表示該緩沖區(qū)正處于被寫(xiě)的狀態(tài),不允許其他生產(chǎn)者訪問(wèn)該緩沖區(qū)訪問(wèn)該緩沖區(qū)生產(chǎn)者將自己的生產(chǎn)者將自己的IDI

25、D號(hào)作為產(chǎn)品編號(hào)寫(xiě)入緩沖區(qū),方便消費(fèi)者識(shí)別號(hào)作為產(chǎn)品編號(hào)寫(xiě)入緩沖區(qū),方便消費(fèi)者識(shí)別緩沖區(qū)數(shù)組緩沖區(qū)數(shù)組Buffer_CriticalBuffer_Critical:1-2-1-1.四、程序的實(shí)現(xiàn)四、程序的實(shí)現(xiàn) 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)2.2.用一個(gè)用一個(gè)自定義結(jié)構(gòu)自定義結(jié)構(gòu)ThreadInfoThreadInfo記錄一條線程的信息,多個(gè)線程對(duì)應(yīng)一個(gè)記錄一條線程的信息,多個(gè)線程對(duì)應(yīng)一個(gè)ThreadInfoThreadInfo數(shù)組。數(shù)組。線程信息數(shù)組線程信息數(shù)組ThreadInfo ThreadInfo :線程號(hào)serial線程標(biāo)識(shí)(P/C)entity延遲時(shí)間delay請(qǐng)求個(gè)數(shù)n_request請(qǐng)求數(shù)組

26、thread_request.存放請(qǐng)求產(chǎn)品號(hào)的數(shù)組四、程序的實(shí)現(xiàn)四、程序的實(shí)現(xiàn) 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)3.3.通過(guò)如下同步對(duì)象實(shí)現(xiàn)互斥:通過(guò)如下同步對(duì)象實(shí)現(xiàn)互斥:l設(shè)一個(gè)互斥量設(shè)一個(gè)互斥量h_mutexh_mutex,實(shí)現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)的下一個(gè)空位,實(shí)現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)的下一個(gè)空位置時(shí)進(jìn)行互斥。置時(shí)進(jìn)行互斥。l每 一 個(gè) 生 產(chǎn) 者 用 一 個(gè) 信 號(hào) 量 與 其 消 費(fèi) 者 同 步 , 通 過(guò) 設(shè) 置每 一 個(gè) 生 產(chǎn) 者 用 一 個(gè) 信 號(hào) 量 與 其 消 費(fèi) 者 同 步 , 通 過(guò) 設(shè) 置h_Semaphoreh_SemaphoreMAX_THREAD_NUMMAX_THRE

27、AD_NUM信號(hào)量數(shù)組實(shí)現(xiàn),表示相應(yīng)產(chǎn)品已經(jīng)生信號(hào)量數(shù)組實(shí)現(xiàn),表示相應(yīng)產(chǎn)品已經(jīng)生產(chǎn)。同時(shí)用一個(gè)表示空緩沖區(qū)數(shù)目的信號(hào)量產(chǎn)。同時(shí)用一個(gè)表示空緩沖區(qū)數(shù)目的信號(hào)量empty_semephoreempty_semephore指示是否指示是否存在空位置,以便開(kāi)始下一個(gè)產(chǎn)品的生產(chǎn)。存在空位置,以便開(kāi)始下一個(gè)產(chǎn)品的生產(chǎn)。l每一個(gè)緩沖區(qū)用一個(gè)同步對(duì)象實(shí)現(xiàn)該緩沖區(qū)上消費(fèi)者之間的互斥,通每一個(gè)緩沖區(qū)用一個(gè)同步對(duì)象實(shí)現(xiàn)該緩沖區(qū)上消費(fèi)者之間的互斥,通過(guò)設(shè)置臨界區(qū)對(duì)象數(shù)組過(guò)設(shè)置臨界區(qū)對(duì)象數(shù)組PC_CriticalPC_CriticalMAX_BUFFER_NUMMAX_BUFFER_NUM實(shí)現(xiàn)。實(shí)現(xiàn)。四、程序的實(shí)現(xiàn)四、

28、程序的實(shí)現(xiàn) 實(shí)驗(yàn)環(huán)境:實(shí)驗(yàn)環(huán)境: Windows 2000/XP + Visual C+ 6.0 Windows 2000/XP + Visual C+ 6.0 實(shí)驗(yàn)步驟:實(shí)驗(yàn)步驟: 在在VCVC里新建一個(gè)名為里新建一個(gè)名為R_WP1R_WP1的的win32 console applicationwin32 console application工工程。程。 在工程中創(chuàng)建一個(gè)名為在工程中創(chuàng)建一個(gè)名為R_WP1.cppR_WP1.cpp的源文件,輸入源程序代的源文件,輸入源程序代碼。碼。 編譯連接程序,得到編譯連接程序,得到R_WP1.exeR_WP1.exe文件文件, , 然后把給定的然后把給

29、定的test.txttest.txt文件存入文件存入R_WP1R_WP1工程所在目錄下的工程所在目錄下的debugdebug文件夾里。文件夾里。 在在DOSDOS控制臺(tái)里運(yùn)行該程序??刂婆_(tái)里運(yùn)行該程序。四、程序的實(shí)現(xiàn)四、程序的實(shí)現(xiàn)實(shí)驗(yàn)所用的測(cè)試用例文件實(shí)驗(yàn)所用的測(cè)試用例文件創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在此進(jìn)程中創(chuàng)建創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在此進(jìn)程中創(chuàng)建n n個(gè)線程來(lái)模擬生產(chǎn)者或者消費(fèi)者。這個(gè)線程來(lái)模擬生產(chǎn)者或者消費(fèi)者。這些線程的信息在些線程的信息在“測(cè)試用例文件測(cè)試用例文件”中予以指定。該文件的格式和含義如下:中予以指定。該文件的格式和含義如下: 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說(shuō)明:說(shuō)明:第一行:給出的是程序中設(shè)置的臨界區(qū)的個(gè)數(shù);其余各行分別描述了一個(gè)生產(chǎn)者或者消費(fèi)者線第一行:給出的是程序中設(shè)置的臨界區(qū)的個(gè)數(shù);其余各行分別描述了一個(gè)生產(chǎn)者或者消費(fèi)者線程的信息。每行中的數(shù)據(jù)之間用程的信息。每行中的數(shù)據(jù)之間用TabTab鍵分隔。鍵分隔。第一列:線程號(hào)。(不管是消費(fèi)者還是生產(chǎn)者,都有一個(gè)對(duì)應(yīng)的線程號(hào))。第一列:線程號(hào)。(不管是消費(fèi)者還是生產(chǎn)者,都有一個(gè)對(duì)應(yīng)的線程號(hào))。第二列:第二列:P P生產(chǎn)者,生產(chǎn)者,C C消費(fèi)者。消費(fèi)者。第三列:線程在生產(chǎn)和消費(fèi)前的休眠時(shí)間,單位為秒。設(shè)置這個(gè)參數(shù)的目的是

31、可以通過(guò)調(diào)整這第三列:線程在生產(chǎn)和消費(fèi)前的休眠時(shí)間,單位為秒。設(shè)置這個(gè)參數(shù)的目的是可以通過(guò)調(diào)整這一列參數(shù),控制開(kāi)始進(jìn)行生產(chǎn)和消費(fèi)動(dòng)作的時(shí)間。一列參數(shù),控制開(kāi)始進(jìn)行生產(chǎn)和消費(fèi)動(dòng)作的時(shí)間。如果是生產(chǎn)者,則該行只有三個(gè)字段。如果代表消費(fèi)者,則該行后邊還有若干字段,代表要求如果是生產(chǎn)者,則該行只有三個(gè)字段。如果代表消費(fèi)者,則該行后邊還有若干字段,代表要求消費(fèi)的產(chǎn)品所對(duì)應(yīng)的生產(chǎn)者的線程號(hào)。消費(fèi)的產(chǎn)品所對(duì)應(yīng)的生產(chǎn)者的線程號(hào)。典型測(cè)試用例分析典型測(cè)試用例分析3號(hào)生產(chǎn)者生產(chǎn)產(chǎn)品放到號(hào)生產(chǎn)者生產(chǎn)產(chǎn)品放到0號(hào)緩沖區(qū)單元號(hào)緩沖區(qū)單元4號(hào)消費(fèi)者等待號(hào)消費(fèi)者等待1號(hào)生產(chǎn)者生產(chǎn)號(hào)生產(chǎn)者生產(chǎn)2號(hào)生產(chǎn)者生產(chǎn)產(chǎn)品放到號(hào)生產(chǎn)者生

32、產(chǎn)產(chǎn)品放到1號(hào)緩沖區(qū)單元號(hào)緩沖區(qū)單元1號(hào)生產(chǎn)者生產(chǎn)產(chǎn)品放到號(hào)生產(chǎn)者生產(chǎn)產(chǎn)品放到2號(hào)緩沖區(qū)單元號(hào)緩沖區(qū)單元 (4號(hào)消費(fèi)者等待號(hào)消費(fèi)者等待1號(hào)生產(chǎn)者生產(chǎn)號(hào)生產(chǎn)者生產(chǎn)),),1號(hào)生產(chǎn)者完成生產(chǎn)后號(hào)生產(chǎn)者完成生產(chǎn)后,4號(hào)消費(fèi)者被激活號(hào)消費(fèi)者被激活,此時(shí),此時(shí)4號(hào)消費(fèi)者所要求的號(hào)消費(fèi)者所要求的1、3、2號(hào)生號(hào)生產(chǎn)者的產(chǎn)品都已經(jīng)放在緩沖區(qū)單元中,所以產(chǎn)者的產(chǎn)品都已經(jīng)放在緩沖區(qū)單元中,所以4號(hào)消費(fèi)者依次號(hào)消費(fèi)者依次進(jìn)行進(jìn)行3個(gè)產(chǎn)品的消費(fèi)。個(gè)產(chǎn)品的消費(fèi)。 消費(fèi)完成后如果沒(méi)有其他的消費(fèi)者請(qǐng)求消費(fèi)該產(chǎn)品,則釋消費(fèi)完成后如果沒(méi)有其他的消費(fèi)者請(qǐng)求消費(fèi)該產(chǎn)品,則釋放該產(chǎn)品所占用的緩沖區(qū)單元。放該產(chǎn)品所占用的緩沖區(qū)單元。

33、同步和互斥同步和互斥-11.生產(chǎn)者請(qǐng)求生產(chǎn),首先要判斷當(dāng)前緩沖區(qū)中是否有一生產(chǎn)者請(qǐng)求生產(chǎn),首先要判斷當(dāng)前緩沖區(qū)中是否有一個(gè) 空 的 緩 沖 區(qū) 單 元 , 設(shè) 置 一 個(gè) 同 步 信 號(hào) 量個(gè) 空 的 緩 沖 區(qū) 單 元 , 設(shè) 置 一 個(gè) 同 步 信 號(hào) 量empty_semaphore來(lái)表示緩沖區(qū)中空的緩沖區(qū)單元的來(lái)表示緩沖區(qū)中空的緩沖區(qū)單元的數(shù)量,初始值是緩沖區(qū)的數(shù)目。數(shù)量,初始值是緩沖區(qū)的數(shù)目。 對(duì)應(yīng)的對(duì)應(yīng)的P操作為(操作為(在生產(chǎn)者進(jìn)程中):): 對(duì)應(yīng)的對(duì)應(yīng)的V操作為(操作為(在消費(fèi)者進(jìn)程中):):同步和互斥同步和互斥-22.在為生產(chǎn)者分配空的緩沖區(qū)單元時(shí),生產(chǎn)者之間要互斥,設(shè)置一個(gè)

34、互斥信號(hào)量h_mutex來(lái)實(shí)現(xiàn)對(duì)空的緩沖區(qū)單元的互斥訪問(wèn)。 對(duì)應(yīng)的P操作為: 對(duì)應(yīng)的V操作為:同步和互斥同步和互斥-33.對(duì)于每一個(gè)生產(chǎn)者,生產(chǎn)完產(chǎn)品后要告訴消費(fèi)者生產(chǎn)已經(jīng)完成,使它生產(chǎn)的產(chǎn)品可以被多個(gè) 消 費(fèi) 者 使 用 , 設(shè) 置 一 個(gè) 同 步 信 號(hào) 量h_Semaphore來(lái)實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者之間的同步。 對(duì)應(yīng)的P操作為(在消費(fèi)者進(jìn)程中): 對(duì)應(yīng)的V操作為(在生產(chǎn)者進(jìn)程中):同步和互斥同步和互斥-3 信號(hào)量數(shù)組h_Semaphore初始化為0,最大值是線程的實(shí)際數(shù)目,消費(fèi)者在消費(fèi)相應(yīng)的產(chǎn)品時(shí),先要對(duì)對(duì)應(yīng)的生產(chǎn)者的信號(hào)量進(jìn)行測(cè)試,看生產(chǎn)者是否已經(jīng)生產(chǎn)此產(chǎn)品,如果生產(chǎn)則消費(fèi),如果沒(méi)有生產(chǎn)

35、則等待(如果一直等待有可能會(huì)出現(xiàn)死鎖),為了不出現(xiàn)死鎖,可將等待的最長(zhǎng)時(shí)間設(shè)為5秒,如果超時(shí)則認(rèn)為出現(xiàn)死鎖,此時(shí)放棄對(duì)此產(chǎn)品的消費(fèi),進(jìn)而消費(fèi)下一個(gè)沒(méi)有消費(fèi)的產(chǎn)品。 生產(chǎn)者生產(chǎn)了產(chǎn)品時(shí),為對(duì)應(yīng)的信號(hào)量一次增加的值是線程的實(shí)際數(shù)目n_Thread,因此同一個(gè)產(chǎn)品最多允許n_Thread個(gè)消費(fèi)者消費(fèi)。同步和互斥同步和互斥-44.消費(fèi)者和消費(fèi)者之間的互斥: 緩沖區(qū)是一個(gè)臨界資源,每一次只允許一個(gè)消費(fèi)者進(jìn)入到某一個(gè)緩沖區(qū)單元消費(fèi)產(chǎn)品,設(shè)置一個(gè)臨界區(qū)數(shù)組PC_Critical來(lái)實(shí)現(xiàn)對(duì)緩沖區(qū)的互斥訪問(wèn)。 對(duì)應(yīng)的P操作(進(jìn)入臨界區(qū)): 對(duì)應(yīng)的V操作(離開(kāi)臨界區(qū)):l 要求:要求: 分析程序結(jié)構(gòu),看懂源程序,把

36、程序調(diào)通;分析程序結(jié)構(gòu),看懂源程序,把程序調(diào)通; 自己設(shè)計(jì)不同的測(cè)試用例,分析、觀察程序運(yùn)行的自己設(shè)計(jì)不同的測(cè)試用例,分析、觀察程序運(yùn)行的結(jié)果(程序運(yùn)行的結(jié)果和分析要在實(shí)驗(yàn)報(bào)告中寫(xiě)出結(jié)果(程序運(yùn)行的結(jié)果和分析要在實(shí)驗(yàn)報(bào)告中寫(xiě)出來(lái));來(lái)); 在某些情況下會(huì)出現(xiàn)死鎖,修改程序,解決死鎖。在某些情況下會(huì)出現(xiàn)死鎖,修改程序,解決死鎖。每個(gè)同學(xué)交一份實(shí)驗(yàn)報(bào)告。(每個(gè)同學(xué)交一份實(shí)驗(yàn)報(bào)告。(11.111.1號(hào)之前交)號(hào)之前交)解決生產(chǎn)者和消費(fèi)者模型解決生產(chǎn)者和消費(fèi)者模型中的死鎖問(wèn)題中的死鎖問(wèn)題死鎖例子死鎖例子 消費(fèi)者C請(qǐng)求3號(hào)產(chǎn)品而等待,而生產(chǎn)3號(hào)產(chǎn)品的生產(chǎn)者3因請(qǐng)求空緩沖區(qū)而等待(緩沖區(qū)滿),相互等待,出

37、現(xiàn)死鎖。死鎖分析 源程序中之所以會(huì)產(chǎn)生死鎖,是因?yàn)樵闯绦蛑兄詴?huì)產(chǎn)生死鎖,是因?yàn)橄M(fèi)者對(duì)產(chǎn)品的消費(fèi)消費(fèi)者對(duì)產(chǎn)品的消費(fèi)是按次序執(zhí)行的是按次序執(zhí)行的,當(dāng)生產(chǎn)者生產(chǎn)的產(chǎn)品占滿緩沖區(qū),緩沖,當(dāng)生產(chǎn)者生產(chǎn)的產(chǎn)品占滿緩沖區(qū),緩沖區(qū)中卻沒(méi)有消費(fèi)者所需要的產(chǎn)品時(shí),消費(fèi)者等待,同時(shí)其區(qū)中卻沒(méi)有消費(fèi)者所需要的產(chǎn)品時(shí),消費(fèi)者等待,同時(shí)其他生產(chǎn)者因得不到緩沖區(qū)而被阻塞,因此造成了死鎖。他生產(chǎn)者因得不到緩沖區(qū)而被阻塞,因此造成了死鎖。 如果,如果,讓消費(fèi)者在當(dāng)前沒(méi)有所需產(chǎn)品的情況下先跳過(guò)該產(chǎn)讓消費(fèi)者在當(dāng)前沒(méi)有所需產(chǎn)品的情況下先跳過(guò)該產(chǎn)品,而去消費(fèi)下一個(gè)要消費(fèi)的產(chǎn)品品,而去消費(fèi)下一個(gè)要消費(fèi)的產(chǎn)品,如此進(jìn)行下去,緩沖,如

38、此進(jìn)行下去,緩沖區(qū)中的產(chǎn)品肯定是消費(fèi)者所需的某個(gè)產(chǎn)品。消費(fèi)后,緩沖區(qū)中的產(chǎn)品肯定是消費(fèi)者所需的某個(gè)產(chǎn)品。消費(fèi)后,緩沖區(qū)得以釋放,其他生產(chǎn)者也可繼續(xù)運(yùn)行。然后再循環(huán)消費(fèi)區(qū)得以釋放,其他生產(chǎn)者也可繼續(xù)運(yùn)行。然后再循環(huán)消費(fèi)消費(fèi)者所需的產(chǎn)品,直到進(jìn)程結(jié)束即可。消費(fèi)者所需的產(chǎn)品,直到進(jìn)程結(jié)束即可。死鎖分析 用上述解決死鎖的方案,既然消費(fèi)者得不到用上述解決死鎖的方案,既然消費(fèi)者得不到3號(hào)生產(chǎn)者的產(chǎn)品,號(hào)生產(chǎn)者的產(chǎn)品,可跳過(guò)此產(chǎn)品可跳過(guò)此產(chǎn)品,先去消費(fèi),先去消費(fèi)下一個(gè)(即下一個(gè)(即1號(hào))生產(chǎn)者的產(chǎn)品,此時(shí)緩沖區(qū)號(hào))生產(chǎn)者的產(chǎn)品,此時(shí)緩沖區(qū)中存在中存在1號(hào)生產(chǎn)者的產(chǎn)品,因此可以消費(fèi),消號(hào)生產(chǎn)者的產(chǎn)品,因此可以

39、消費(fèi),消費(fèi)后相應(yīng)的緩沖區(qū)得到釋放,費(fèi)后相應(yīng)的緩沖區(qū)得到釋放,3號(hào)生產(chǎn)者得到號(hào)生產(chǎn)者得到緩沖區(qū)而不必阻塞。然后消費(fèi)者循環(huán)消費(fèi)所緩沖區(qū)而不必阻塞。然后消費(fèi)者循環(huán)消費(fèi)所需的產(chǎn)品即可,直到整個(gè)進(jìn)程的結(jié)束。需的產(chǎn)品即可,直到整個(gè)進(jìn)程的結(jié)束。 顯然死鎖問(wèn)題被解決了。顯然死鎖問(wèn)題被解決了。解決死鎖的基本思路解決死鎖的基本思路 改變消費(fèi)者對(duì)產(chǎn)品的消費(fèi)順序改變消費(fèi)者對(duì)產(chǎn)品的消費(fèi)順序,為等待消費(fèi),為等待消費(fèi)的產(chǎn)品信號(hào)量的產(chǎn)品信號(hào)量設(shè)一個(gè)最大等待時(shí)間,當(dāng)?shù)却O(shè)一個(gè)最大等待時(shí)間,當(dāng)?shù)却瑫r(shí)時(shí),就認(rèn)為出現(xiàn)了死鎖超時(shí)時(shí),就認(rèn)為出現(xiàn)了死鎖,此時(shí)暫時(shí)放棄,此時(shí)暫時(shí)放棄對(duì)本產(chǎn)品的消費(fèi),轉(zhuǎn)而消費(fèi)下一個(gè)產(chǎn)品,當(dāng)對(duì)本產(chǎn)品的消費(fèi),轉(zhuǎn)而

40、消費(fèi)下一個(gè)產(chǎn)品,當(dāng)再次對(duì)導(dǎo)致死鎖的那個(gè)產(chǎn)品有消費(fèi)請(qǐng)求時(shí),再次對(duì)導(dǎo)致死鎖的那個(gè)產(chǎn)品有消費(fèi)請(qǐng)求時(shí),一般來(lái)說(shuō)已經(jīng)有空的緩沖區(qū)了,生產(chǎn)者已經(jīng)一般來(lái)說(shuō)已經(jīng)有空的緩沖區(qū)了,生產(chǎn)者已經(jīng)生產(chǎn)了此產(chǎn)品,可以立即消費(fèi),如果還沒(méi)有生產(chǎn)了此產(chǎn)品,可以立即消費(fèi),如果還沒(méi)有生產(chǎn),可以等到下一輪再請(qǐng)求,必有可以消生產(chǎn),可以等到下一輪再請(qǐng)求,必有可以消費(fèi)的時(shí)候,因此不會(huì)死鎖。費(fèi)的時(shí)候,因此不會(huì)死鎖。對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))/循環(huán)進(jìn)行所需產(chǎn)品的消費(fèi)for(i=0;counter!=0;i=(i+1)%m_requestNum)/增加了一個(gè)新的變量counter,初始值為請(qǐng)求的個(gè)數(shù)

41、,counter=m_requestNum;if(m_thread_requesti=-1)/消費(fèi)請(qǐng)求已經(jīng)得到滿足continue;/請(qǐng)求消費(fèi)產(chǎn)品printf(“Consumer%2drequesttoconsume%2dproduct.n,m_serial,m_thread_requesti);/如果對(duì)應(yīng)的生產(chǎn)者沒(méi)有生產(chǎn),則等待有限的時(shí)間(例如5秒),超時(shí)后退出該產(chǎn)品的等待,轉(zhuǎn)去消費(fèi)下一個(gè)產(chǎn)品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;對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))/查詢要消費(fèi)的產(chǎn)品放在哪一個(gè)緩沖區(qū)中intBufferPos=FindBufferPosition(m_thread_requesti);/開(kāi)始進(jìn)行具體緩沖區(qū)的消費(fèi)處理,讀和讀在該緩沖區(qū)上仍然是互斥的;/進(jìn)入臨界區(qū)后執(zhí)行消費(fèi)動(dòng)作;并在完成此次請(qǐng)求后,通知另外的消費(fèi)者本處請(qǐng)求已經(jīng)滿

43、足;同時(shí)如果對(duì)應(yīng)的產(chǎn)品使用完畢,就將相應(yīng)緩沖區(qū)清空,并增加代表空緩沖區(qū)的信號(hào)量;EnterCriticalSection(&PC_CriticalBufferPos);printf(“Consumer%2dbegintoconsume%2dproduct.n,m_serial,m_thread_requesti);(ThreadInfo*)(p)-thread_requesti=-1;counter-;對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))對(duì)源程序的改進(jìn)(對(duì)消費(fèi)者進(jìn)程的改進(jìn))if(!IfInOtherRequest(m_thread_requesti)Buffer_CriticalBuf

44、ferPos=-1;/標(biāo)記緩沖區(qū)為空;printf(“Consumer%2dfinishconsuming%2dproduct.n,m_serial,m_thread_requesti);printf(position%2d:%3dn,BufferPos,Buffer_CriticalBufferPos);ReleaseSemaphore(empty_semaphore,1,NULL);/使空緩沖區(qū)的個(gè)數(shù)加1elseprintf(Consumer%2dfinishconsumingproduct%2dn,m_serial,m_thread_requesti);/離開(kāi)臨界區(qū)LeaveCritic

45、alSection(&PC_CriticalBufferPos);1 1、預(yù)習(xí)要求:、預(yù)習(xí)要求: 存儲(chǔ)管理的基本方法。存儲(chǔ)管理的基本方法。2 2、實(shí)驗(yàn)?zāi)康模?、?shí)驗(yàn)?zāi)康模?(1 1) 理解內(nèi)存管理機(jī)制,掌握頁(yè)式虛擬存儲(chǔ)技術(shù);理解內(nèi)存管理機(jī)制,掌握頁(yè)式虛擬存儲(chǔ)技術(shù);(2 2) 掌握掌握 Windows Windows 環(huán)境下內(nèi)存管理的基本環(huán)境下內(nèi)存管理的基本APIAPI。3 3、實(shí)驗(yàn)內(nèi)容及要求:、實(shí)驗(yàn)內(nèi)容及要求: 按照按照操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)實(shí)驗(yàn)二的要求,設(shè)計(jì)程序來(lái)實(shí)現(xiàn)。實(shí)驗(yàn)二的要求,設(shè)計(jì)程序來(lái)實(shí)現(xiàn)。一、實(shí)驗(yàn)?zāi)康囊弧?shí)驗(yàn)?zāi)康? 1理解內(nèi)存分配原理,特別是頁(yè)式虛擬內(nèi)存分配(理解內(nèi)

46、存分配原理,特別是頁(yè)式虛擬內(nèi)存分配(4.4 4.4 請(qǐng)求分請(qǐng)求分頁(yè)存儲(chǔ)管理)方法。頁(yè)存儲(chǔ)管理)方法。2 2了解了解Windows 2000/XPWindows 2000/XP的內(nèi)存管理機(jī)制,掌握頁(yè)式虛擬存儲(chǔ)的內(nèi)存管理機(jī)制,掌握頁(yè)式虛擬存儲(chǔ)技術(shù)。技術(shù)。3 3掌握掌握Windows 2000/XPWindows 2000/XP中內(nèi)存管理基本中內(nèi)存管理基本APIAPI的使用方法。的使用方法。二、實(shí)驗(yàn)內(nèi)容及要求二、實(shí)驗(yàn)內(nèi)容及要求1 1實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)內(nèi)容在程序中,用一個(gè)在程序中,用一個(gè)線程模擬線程模擬各種虛存活動(dòng),如虛存的保留各種虛存活動(dòng),如虛存的保留、提交等。、提交等。用一個(gè)用一個(gè)監(jiān)控線程監(jiān)控線程實(shí)時(shí)監(jiān)

47、控系統(tǒng)當(dāng)前的虛存操作,并在控制實(shí)時(shí)監(jiān)控系統(tǒng)當(dāng)前的虛存操作,并在控制臺(tái)輸出虛存操作信息。要求監(jiān)控線程與模擬虛存活動(dòng)的線程臺(tái)輸出虛存操作信息。要求監(jiān)控線程與模擬虛存活動(dòng)的線程保持同步,即模擬線程出現(xiàn)模擬活動(dòng),監(jiān)控線程應(yīng)立即監(jiān)控保持同步,即模擬線程出現(xiàn)模擬活動(dòng),監(jiān)控線程應(yīng)立即監(jiān)控到該活動(dòng)的信息。到該活動(dòng)的信息。在用監(jiān)控線程監(jiān)控內(nèi)存活動(dòng)的同時(shí),匯報(bào)整個(gè)存儲(chǔ)系統(tǒng)的在用監(jiān)控線程監(jiān)控內(nèi)存活動(dòng)的同時(shí),匯報(bào)整個(gè)存儲(chǔ)系統(tǒng)的使用情況。使用情況。2 2實(shí)驗(yàn)要求實(shí)驗(yàn)要求學(xué)習(xí)并理解學(xué)習(xí)并理解WindowsWindows中的虛擬存儲(chǔ)技術(shù);中的虛擬存儲(chǔ)技術(shù);學(xué)習(xí)了解虛存頁(yè)面的狀態(tài)及操作;學(xué)習(xí)了解虛存頁(yè)面的狀態(tài)及操作;熟悉實(shí)驗(yàn)

48、環(huán)境,掌握相關(guān)熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)APIAPI的使用方法;的使用方法;設(shè)計(jì)程序,實(shí)現(xiàn)虛存活動(dòng)的模擬及監(jiān)控;設(shè)計(jì)程序,實(shí)現(xiàn)虛存活動(dòng)的模擬及監(jiān)控;提交實(shí)驗(yàn)報(bào)告。提交實(shí)驗(yàn)報(bào)告。三、相關(guān)知識(shí)介紹三、相關(guān)知識(shí)介紹1 1WindowsWindows中的虛擬存儲(chǔ)技術(shù)中的虛擬存儲(chǔ)技術(shù)Windows 2000/XPWindows 2000/XP作為作為3232位操作系統(tǒng),提供位操作系統(tǒng),提供3232位虛地址,每個(gè)位虛地址,每個(gè)進(jìn)程虛地址空間最多進(jìn)程虛地址空間最多4GB4GB,其中,其中2GB2GB為進(jìn)程的私有空間(為進(jìn)程的私有空間(用戶可以訪問(wèn)),操作系統(tǒng)占用剩下的用戶可以訪問(wèn)),操作系統(tǒng)占用剩下的2GB2G

49、B。Windows 2000/XPWindows 2000/XP以頁(yè)為單位進(jìn)行虛擬內(nèi)存的分配以頁(yè)為單位進(jìn)行虛擬內(nèi)存的分配,WindowsWindows利用利用頁(yè)面文件(頁(yè)面文件(pagefile.syspagefile.sys)來(lái)實(shí)現(xiàn)物理內(nèi)存的擴(kuò)來(lái)實(shí)現(xiàn)物理內(nèi)存的擴(kuò)展。需要時(shí),將數(shù)據(jù)從頁(yè)面文件移到內(nèi)存,或者將數(shù)據(jù)從內(nèi)存展。需要時(shí),將數(shù)據(jù)從頁(yè)面文件移到內(nèi)存,或者將數(shù)據(jù)從內(nèi)存移到頁(yè)面文件以便釋放內(nèi)存空間。移到頁(yè)面文件以便釋放內(nèi)存空間。頁(yè)面文件和內(nèi)存構(gòu)成頁(yè)面文件和內(nèi)存構(gòu)成“虛擬內(nèi)存虛擬內(nèi)存”/ /地址空間地址空間/ /虛擬存儲(chǔ)器虛擬存儲(chǔ)器/ /虛虛擬空間。擬空間。三、相關(guān)知識(shí)介紹三、相關(guān)知識(shí)介紹2.2

50、.虛擬頁(yè)面的狀態(tài)虛擬頁(yè)面的狀態(tài) (1) (1) 頁(yè)面的種類頁(yè)面的種類 每個(gè)進(jìn)程的虛擬地址空間中的頁(yè)面狀態(tài)可以分為每個(gè)進(jìn)程的虛擬地址空間中的頁(yè)面狀態(tài)可以分為3 3種:種:提交頁(yè)面:已經(jīng)分得內(nèi)存塊的虛擬頁(yè)面;提交頁(yè)面:已經(jīng)分得內(nèi)存塊的虛擬頁(yè)面;保留頁(yè)面:邏輯頁(yè)面已經(jīng)分配,但還沒(méi)有分配內(nèi)存塊;保留頁(yè)面:邏輯頁(yè)面已經(jīng)分配,但還沒(méi)有分配內(nèi)存塊;空閑頁(yè)面:可以保留或者提交的可用頁(yè)面??臻e頁(yè)面:可以保留或者提交的可用頁(yè)面。三、相關(guān)知識(shí)介紹三、相關(guān)知識(shí)介紹2.2.虛擬頁(yè)面的狀態(tài)虛擬頁(yè)面的狀態(tài) (2) (2) 頁(yè)面的操作頁(yè)面的操作 保留:保留進(jìn)程的虛擬地址空間,但不分配物理存儲(chǔ)空間;保留:保留進(jìn)程的虛擬地址空間

51、,但不分配物理存儲(chǔ)空間;提交:在內(nèi)存中為進(jìn)程的虛擬地址空間分配物理存儲(chǔ)空間;提交:在內(nèi)存中為進(jìn)程的虛擬地址空間分配物理存儲(chǔ)空間;回收回收/ /除配:釋放物理內(nèi)存空間,但是虛擬地址空間仍然保留;除配:釋放物理內(nèi)存空間,但是虛擬地址空間仍然保留;釋放:將物理內(nèi)存空間和虛擬地址空間全部釋放;釋放:將物理內(nèi)存空間和虛擬地址空間全部釋放;加鎖:對(duì)已經(jīng)提交的頁(yè)面進(jìn)行加鎖操作或者對(duì)已經(jīng)加鎖的頁(yè)面加鎖:對(duì)已經(jīng)提交的頁(yè)面進(jìn)行加鎖操作或者對(duì)已經(jīng)加鎖的頁(yè)面進(jìn)行解鎖。進(jìn)行解鎖。三、相關(guān)知識(shí)介紹三、相關(guān)知識(shí)介紹3.3.存儲(chǔ)系統(tǒng)的統(tǒng)計(jì)指標(biāo):存儲(chǔ)系統(tǒng)的統(tǒng)計(jì)指標(biāo):MEMORYSTATUS Structure MEMORYST

52、ATUS Structure 該結(jié)構(gòu)體用來(lái)表示系統(tǒng)當(dāng)前的虛擬內(nèi)該結(jié)構(gòu)體用來(lái)表示系統(tǒng)當(dāng)前的虛擬內(nèi)存和物理內(nèi)存的狀態(tài)信息。函數(shù)存和物理內(nèi)存的狀態(tài)信息。函數(shù)GlobalMemoryStatusGlobalMemoryStatus從該結(jié)構(gòu)從該結(jié)構(gòu)體中獲取數(shù)據(jù)。體中獲取數(shù)據(jù)。Syntax:typedefstruct_MEMORYSTATUSDWORDdwLength;DWORDdwMemoryLoad;/物理內(nèi)存使用負(fù)荷(百分?jǐn)?shù)表示,當(dāng)前物理內(nèi)存已被占用多少)SIZE_TdwTotalPhys;/物理內(nèi)存總數(shù)SIZE_TdwAvailPhys;/可用物理內(nèi)存數(shù)SIZE_TdwTotalPageFile;

53、/頁(yè)面文件總數(shù)SIZE_TdwAvailPageFile;/可用頁(yè)面文件數(shù)SIZE_TdwTotalVirtual;/虛存空間總數(shù):2GSIZE_TdwAvailVirtual;/可用虛存空間數(shù)MEMORYSTATUS,*LPMEMORYSTATUS;三、相關(guān)知識(shí)介紹三、相關(guān)知識(shí)介紹MEMORYSTATUS StructureMEMORYSTATUS Structure該函數(shù)詳細(xì)用法可以參考下面該函數(shù)詳細(xì)用法可以參考下面MSDNMSDN在線幫助:在線幫助:http:/ Structure MEMORY_BASIC_INFORMATION Structure 該結(jié)構(gòu)體表示進(jìn)程在某該結(jié)構(gòu)體表示進(jìn)程

54、在某一個(gè)具體的虛擬地址空間的頁(yè)面狀態(tài)信息。一個(gè)具體的虛擬地址空間的頁(yè)面狀態(tài)信息。typedefstruct_MEMORY_BASIC_INFORMATIONPVOIDBaseAddress;PVOIDAllocationBase;DWORDAllocationProtect;SIZE_TRegionSize;DWORDState;/頁(yè)面狀態(tài)DWORDProtect;/頁(yè)面保護(hù)屬性DWORDType;MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;MSDNMSDN在線幫助:在線幫助: http:/ http:/ (1) _(1) _begi

55、nthreadexbeginthreadex函數(shù):創(chuàng)建新線程(在本實(shí)驗(yàn)中,創(chuàng)建了函數(shù):創(chuàng)建新線程(在本實(shí)驗(yàn)中,創(chuàng)建了2 2個(gè)線程:個(gè)線程:simulatorsimulator模擬線程和模擬線程和inspectorinspector監(jiān)控線程)監(jiān)控線程)(2) Sleep(2) Sleep函數(shù):使當(dāng)前線程休眠函數(shù):使當(dāng)前線程休眠(3) (3) VirtualAllocVirtualAlloc函數(shù)函數(shù):保留或提交某一范圍的虛擬地址:保留或提交某一范圍的虛擬地址(4) (4) VirtualFreeVirtualFree函數(shù):解除已被提交的虛存,或釋放被保留函數(shù):解除已被提交的虛存,或釋放被保留/ /

56、提交的進(jìn)程虛擬地址空間提交的進(jìn)程虛擬地址空間(5) (5) VirtualProtectVirtualProtect函數(shù):改變虛擬內(nèi)存頁(yè)的保護(hù)方式函數(shù):改變虛擬內(nèi)存頁(yè)的保護(hù)方式(6) (6) VirtualLockVirtualLock和和VirtualUnlockVirtualUnlock函數(shù):鎖定或解鎖虛擬內(nèi)存函數(shù):鎖定或解鎖虛擬內(nèi)存頁(yè)頁(yè) (7) (7) VirtualQueryVirtualQuery函數(shù):查詢進(jìn)程的虛擬內(nèi)存函數(shù):查詢進(jìn)程的虛擬內(nèi)存 (8) (8) GlobalMemoryStatusGlobalMemoryStatus函數(shù):獲取程序存儲(chǔ)空間的使用狀況函數(shù):獲取程序存儲(chǔ)空間的使用狀況以及系統(tǒng)的使用情況信息

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論