操作系統(tǒng)實(shí)驗(yàn)四進(jìn)程的同步._第1頁
操作系統(tǒng)實(shí)驗(yàn)四進(jìn)程的同步._第2頁
操作系統(tǒng)實(shí)驗(yàn)四進(jìn)程的同步._第3頁
操作系統(tǒng)實(shí)驗(yàn)四進(jìn)程的同步._第4頁
操作系統(tǒng)實(shí)驗(yàn)四進(jìn)程的同步._第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)實(shí) 驗(yàn) 報(bào) 告課程名稱操作系統(tǒng)實(shí)驗(yàn)課程編號(hào)0920311實(shí)驗(yàn)項(xiàng)目名稱操作系統(tǒng)的啟動(dòng)學(xué)號(hào)年級(jí)2011級(jí)姓名專業(yè)軟件工程學(xué)生所在學(xué)院軟件學(xué)院指導(dǎo)教師王紅濱實(shí)驗(yàn)室名稱地點(diǎn)軟件工程實(shí)驗(yàn)室 21B282 哈爾濱工程大學(xué)軟件學(xué)院第六講 進(jìn)程的同步一、實(shí)驗(yàn)概述1. 實(shí)驗(yàn)名稱實(shí)驗(yàn)系統(tǒng)的啟動(dòng)2. 實(shí)驗(yàn)?zāi)康?).使用 EOS 的信號(hào)量編程解決生產(chǎn)者消費(fèi)者問題,理解進(jìn)程同步的意義。2).調(diào)試跟蹤 EOS 的信號(hào)量的工作過程,理解進(jìn)程同步的原理。3).修改 EOS 的信號(hào)量算法,使之支持等待超時(shí)喚醒功能(有限等待),加深理解進(jìn)程同步的原理。3. 實(shí)驗(yàn)類型(驗(yàn)證、設(shè)計(jì))驗(yàn)證4. 實(shí)驗(yàn)內(nèi)容1).準(zhǔn)備實(shí)驗(yàn)2).使用

2、EOS的信號(hào)量解決生產(chǎn)者消費(fèi)者問題3).調(diào)試EOS信號(hào)量的工作過程創(chuàng)建信號(hào)量等待釋放信號(hào)量等待信號(hào)量(不阻塞)釋放信號(hào)量(不喚醒)等待信號(hào)量(阻塞)釋放信號(hào)量(喚醒)4).修改EOS的信號(hào)量算法在目前EOS Kernel項(xiàng)目的ps/semaphore.c文件中,PsWaitForSemaphore函數(shù)的Milliseconds參數(shù)只能是INFINITE,PsReleaseSemaphore 函數(shù)的ReleaseCount 參數(shù)只能是1?,F(xiàn)在要求同時(shí)修改PsWaitForSemaphore函數(shù)和PsReleaseSemaphore函數(shù)中的代碼,使這兩個(gè)參數(shù)能夠真正起到作用,使信號(hào)量對(duì)象支持等待超

3、時(shí)喚醒功能和批量釋放功能。二、實(shí)驗(yàn)環(huán)境操作系統(tǒng):windows xp編譯環(huán)境:OS Lab三、實(shí)驗(yàn)過程1. 設(shè)計(jì)思路和流程圖準(zhǔn)備實(shí)驗(yàn)使用EOS的信號(hào)量解決生產(chǎn)者消費(fèi)者問題調(diào)試EOS信號(hào)量的工作過程創(chuàng)建信號(hào)量釋放信號(hào)量(喚醒)等待信號(hào)量(阻塞)釋放信號(hào)量(不喚醒)等待信號(hào)量(不阻塞)等待釋放信號(hào)量修改EOS的信號(hào)量算法結(jié)束實(shí)驗(yàn)圖3-1.整體試驗(yàn)流程圖main函數(shù)開始創(chuàng)建Mutex對(duì)象創(chuàng)建Empty信號(hào)量對(duì)象創(chuàng)建Full信號(hào)量對(duì)象創(chuàng)建生產(chǎn)者線程創(chuàng)建消費(fèi)者線程等待生產(chǎn)者線程和消費(fèi)者線程結(jié)束關(guān)閉句柄main函數(shù)結(jié)束Producer函數(shù)開始生產(chǎn)完畢?等待Empty信號(hào)量對(duì)象等待Mutex對(duì)象生產(chǎn)一個(gè)產(chǎn)品

4、,占用一個(gè)緩沖區(qū)循環(huán)向后移動(dòng)緩沖區(qū)指針釋放Mutex對(duì)象釋放Full信號(hào)量對(duì)象等待500毫秒Producer函數(shù)結(jié)束Consumer函數(shù)開始消費(fèi)完畢畢?等待Full信號(hào)量對(duì)象等待Mutex對(duì)象消費(fèi)一個(gè)產(chǎn)品,清空一個(gè)緩沖區(qū)循環(huán)向后移動(dòng)緩沖區(qū)指針釋放Mutex對(duì)象釋放Empty信號(hào)量對(duì)象前10個(gè)產(chǎn)品?等待2000毫秒等待100毫秒Consumer函數(shù)結(jié)束 圖3-2.Main函數(shù)流程圖、生產(chǎn)者消費(fèi)、消費(fèi)者流程圖2. 需要解決的問題及解答(1).思考在ps/semaphore.c文件內(nèi)的PsWaitForSemaphore和PsReleaseSemaphore函數(shù)中,為什么要使用原子操作? 答:在執(zhí)行

5、等待信號(hào)量和釋放信號(hào)量的時(shí)候,是不允許cpu響應(yīng)外部中斷的,如果此時(shí)cpu響應(yīng)了外部中斷,會(huì)產(chǎn)生不可預(yù)料的結(jié)果,無法正常完成原子操作。(2). 繪制ps/semaphore.c文件內(nèi)PsWaitForSemaphore和PsReleaseSemaphore函數(shù)的流程圖。1).PsWaitForSemaphore函數(shù)流程圖。 開始 1.原子操作前關(guān)中斷2.開始原子操作P操作3.If Wait操作的信號(hào)量大于04.If Wait操作的信號(hào)量大于0執(zhí)行P操作,否則返回執(zhí)行3 5.P操作結(jié)束 結(jié)束 2). PsReleaseSemaphore函數(shù)流程圖 開始 1.原子操作前關(guān)中斷4.如果3成立返回“信

6、號(hào)數(shù)目量超出范圍”函數(shù)結(jié)束,否則記錄當(dāng)前信號(hào)量的值 2.開始原子操作V操作3.if P和V操作的信號(hào)量之和大于緩沖隊(duì)列長(zhǎng)度5.執(zhí)行一次信號(hào)量的釋放操作。使信號(hào)量的值增加1。如果P操作控制的信號(hào)量不大于零喚醒等待進(jìn)程,返回,喚醒成功,函數(shù)結(jié)束。6.if被阻塞進(jìn)程的數(shù)量小于要釋放的信號(hào)量的個(gè)數(shù),喚醒等待隊(duì)列中的進(jìn)程,直到等待隊(duì)列為空。返回,喚醒成功,函數(shù)結(jié)束。7.if被阻塞的線程數(shù)量大于等于ReleaseCount,則循環(huán)結(jié)束后,有ReleaseCount個(gè)線程會(huì)被喚醒,而且信號(hào)量計(jì)數(shù)的值仍然為0;如果被阻塞的線程數(shù)量小于ReleaseCount,則循環(huán)結(jié)束后,所有被阻塞的線程都會(huì)被喚醒,并且信號(hào)

7、量的計(jì)數(shù)值=ReleaseCount之前被阻塞線程的數(shù)量+之前信號(hào)量的計(jì)數(shù)值。函數(shù)結(jié)束 結(jié)束(3). P143生產(chǎn)者在生產(chǎn)了13號(hào)產(chǎn)品后本來要繼續(xù)生產(chǎn)14號(hào)產(chǎn)品,可此時(shí)生產(chǎn)者為什么必須等待消費(fèi)者消費(fèi)了4號(hào)產(chǎn)品后,才能生產(chǎn)14號(hào)產(chǎn)品呢?生產(chǎn)者和消費(fèi)者是怎樣使用同步對(duì)象來實(shí)現(xiàn)該同步過程的呢?答:這是因?yàn)榕R界資源的限制。緩沖區(qū)只有十個(gè)空間,現(xiàn)在消費(fèi)比生產(chǎn)慢,此時(shí)分別裝了4到13號(hào)產(chǎn)品,而消費(fèi)者只消費(fèi)了3個(gè)。此時(shí)裝入產(chǎn)品與產(chǎn)品的存儲(chǔ)空間成為直接相互制約關(guān)系,再消費(fèi)者消費(fèi)了下一個(gè)產(chǎn)品之前生產(chǎn)者不能繼續(xù)裝入。因此,可解釋生產(chǎn)者為什么必須等待消費(fèi)者消費(fèi)了4號(hào)產(chǎn)品后才能生產(chǎn)14號(hào)產(chǎn)品。(4). 根據(jù)本實(shí)驗(yàn)3.

8、3.2節(jié)中設(shè)置斷點(diǎn)和調(diào)試的方法,自己設(shè)計(jì)一個(gè)類似的調(diào)試方案來驗(yàn)證消費(fèi)者線程在消費(fèi)24號(hào)產(chǎn)品時(shí)會(huì)被阻塞,直到生產(chǎn)者線程生產(chǎn)了24號(hào)產(chǎn)品后,消費(fèi)者線程才被喚醒并繼續(xù)執(zhí)行的過程。 答:可以按照下面的步驟進(jìn)行調(diào)試 (1) 刪除所有的斷點(diǎn)。 (2) 按F5啟動(dòng)調(diào)試。OS Lab會(huì)首先彈出一個(gè)調(diào)試異常對(duì)話框。 (3) 在調(diào)試異常對(duì)話框中選擇“是”,調(diào)試會(huì)中斷。 (4) 在Consumer函數(shù)中等待Full信號(hào)量的代碼行(第173行) WaitForSingleObject(FullSemaphoreHandle, INFINITE); 添加一個(gè)斷點(diǎn)。 (5) 在“斷點(diǎn)”窗口(按Alt+F9打開)中此斷點(diǎn)的

9、名稱上點(diǎn)擊右鍵。 (6) 在彈出的快捷菜單中選擇“條件”。 (7) 在“斷點(diǎn)條件”對(duì)話框(按F1獲得幫助)的表達(dá)式編輯框中,輸入表達(dá)式“i = 24”。 (8) 點(diǎn)擊“斷點(diǎn)條件”對(duì)話框中的“確定”按鈕。 (9) 按F5繼續(xù)調(diào)試。只有當(dāng)消費(fèi)者線程嘗試消費(fèi)24號(hào)產(chǎn)品時(shí)才會(huì)在該條件斷點(diǎn)處中斷。3. 主要數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)代碼及其說明1).對(duì)PsWaitForSemaphore函數(shù)的修改:PsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN ULONG Milliseconds)/*+功能描述:信號(hào)量的 Wait 操作(P 操作)。參數(shù):Semaphore - Wai

10、t 操作的信號(hào)量對(duì)象。Milliseconds - 等待超時(shí)上限,單位毫秒。返回值:STATUS_SUCCESS。當(dāng)你修改信號(hào)量使之支持超時(shí)喚醒功能后,如果等待超時(shí),應(yīng)該返回 STATUS_TIMEOUT。-*/BOOL IntState; STATUS a;ASSERT(KeGetIntNesting() = 0); / 中斷環(huán)境下不能調(diào)用此函數(shù)。IntState = KeEnableInterrupts(FALSE); / 開始原子操作,禁止中斷。/ 目前僅實(shí)現(xiàn)了標(biāo)準(zhǔn)記錄型信號(hào)量,不支持超時(shí)喚醒功能,所以 PspWait 函數(shù)/ 的第二個(gè)參數(shù)的值只能是 INFINITE。/if (Sema

11、phore->Count>0) Semaphore->Count-; a=STATUS_SUCCESS;else if(Semaphore->Count=0) a=PspWait(&Semaphore->WaitListHead, Milliseconds);KeEnableInterrupts(IntState); / 原子操作完成,恢復(fù)中斷。return a;對(duì)PsReleaseSemaphore函數(shù)的修改: PsReleaseSemaphore(IN PSEMAPHORE Semaphore,IN LONG ReleaseCount,OUT PLON

12、G PreviousCount)/*+功能描述:信號(hào)量的 Signal 操作(V 操作)。參數(shù):Semaphore - Wait 操作的信號(hào)量對(duì)象。ReleaseCount - 信號(hào)量計(jì)數(shù)增加的數(shù)量。當(dāng)前只能為 1。當(dāng)你修改信號(hào)量使之支持超時(shí)喚醒功能后,此參數(shù)的值能夠大于等于 1。PreviousCount - 返回信號(hào)量計(jì)數(shù)在增加之前的值。返回值:如果成功釋放信號(hào)量,返回 STATUS_SUCCESS。-*/STATUS Status;BOOL IntState; / int bobo;IntState = KeEnableInterrupts(FALSE); / 開始原子操作,禁止中斷。i

13、f (Semaphore->Count + ReleaseCount > Semaphore->MaximumCount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / 記錄當(dāng)前的信號(hào)量的值。/if (NULL != PreviousCount) *PreviousCount = Semaphore->Count;/ 目前僅實(shí)現(xiàn)了標(biāo)準(zhǔn)記錄型信號(hào)量,每執(zhí)行一次信號(hào)量的釋放操作/ 只能使信號(hào)量的值增加 1。/ if(ReleaseCount<0) return 0; for(;ReleaseCount>0&am

14、p;&!(ListIsEmpty(&Semaphore->WaitListHead);ReleaseCount-=1) PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);Semaphore->Count+=ReleaseCount; Status = STATUS_SUCCESS;KeEnableInterrupts(IntState); / 原子操作完成,恢復(fù)中斷。return Status;4. 源程序并附上注釋#include "psp.h"VOIDPsInitial

15、izeSemaphore(IN PSEMAPHORE Semaphore,IN LONG InitialCount,IN LONG MaximumCount)/*+功能描述:初始化信號(hào)量結(jié)構(gòu)體。參數(shù):Semaphore - 要初始化的信號(hào)量結(jié)構(gòu)體指針。InitialCount - 信號(hào)量的初始值,不能小于 0 且不能大于 MaximumCount。MaximumCount - 信號(hào)量的最大值,必須大于 0。返回值:無。-*/ASSERT(InitialCount >= 0 && InitialCount <= MaximumCount && Maxi

16、mumCount > 0); Semaphore->Count = InitialCount;Semaphore->MaximumCount = MaximumCount;ListInitializeHead(&Semaphore->WaitListHead);STATUSPsWaitForSemaphore(IN PSEMAPHORE Semaphore,IN ULONG Milliseconds)/*+功能描述:信號(hào)量的 Wait 操作(P 操作)。參數(shù):Semaphore - Wait 操作的信號(hào)量對(duì)象。Milliseconds - 等待超時(shí)上限,單位毫秒

17、。返回值:STATUS_SUCCESS。當(dāng)你修改信號(hào)量使之支持超時(shí)喚醒功能后,如果等待超時(shí),應(yīng)該返回 STATUS_TIMEOUT。-*/BOOL IntState; STATUS a;ASSERT(KeGetIntNesting() = 0); / 中斷環(huán)境下不能調(diào)用此函數(shù)。IntState = KeEnableInterrupts(FALSE); / 開始原子操作,禁止中斷。 / 目前僅實(shí)現(xiàn)了標(biāo)準(zhǔn)記錄型信號(hào)量,不支持超時(shí)喚醒功能,所以 PspWait 函數(shù)/ 的第二個(gè)參數(shù)的值只能是 INFINITE。/if (Semaphore->Count>0) Semaphore->

18、Count-; a=STATUS_SUCCESS;else if(Semaphore->Count=0) a=PspWait(&Semaphore->WaitListHead, Milliseconds); KeEnableInterrupts(IntState); / 原子操作完成,恢復(fù)中斷。 return a;STATUSPsReleaseSemaphore(IN PSEMAPHORE Semaphore,IN LONG ReleaseCount,OUT PLONG PreviousCount)/*+功能描述:信號(hào)量的 Signal 操作(V 操作)。參數(shù):Semaph

19、ore - Wait 操作的信號(hào)量對(duì)象。ReleaseCount - 信號(hào)量計(jì)數(shù)增加的數(shù)量。當(dāng)前只能為 1。當(dāng)你修改信號(hào)量使之支持超時(shí)喚醒功能后,此參數(shù)的值能夠大于等于 1。PreviousCount - 返回信號(hào)量計(jì)數(shù)在增加之前的值。返回值:如果成功釋放信號(hào)量,返回 STATUS_SUCCESS。-*/STATUS Status;BOOL IntState; IntState = KeEnableInterrupts(FALSE); / 開始原子操作,禁止中斷。if (Semaphore->Count + ReleaseCount > Semaphore->MaximumC

20、ount) Status = STATUS_SEMAPHORE_LIMIT_EXCEEDED; else / 記錄當(dāng)前的信號(hào)量的值。/if (NULL != PreviousCount) *PreviousCount = Semaphore->Count; / 目前僅實(shí)現(xiàn)了標(biāo)準(zhǔn)記錄型信號(hào)量,每執(zhí)行一次信號(hào)量的釋放操作/ 只能使信號(hào)量的值增加 1。/ if(ReleaseCount<0) return 0; for(;ReleaseCount>0&&!(ListIsEmpty(&Semaphore->WaitListHead);ReleaseCou

21、nt-=1) PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);Semaphore->Count+=ReleaseCount; Status = STATUS_SUCCESS;KeEnableInterrupts(IntState); / 原子操作完成,恢復(fù)中斷。return Status;/ 下面是和信號(hào)量對(duì)象類型相關(guān)的代碼。/ 信號(hào)量對(duì)象類型指針。/POBJECT_TYPE PspSemaphoreType = NULL;/ 用于初始化 semaphore 結(jié)構(gòu)體的參數(shù)結(jié)構(gòu)體。/typedef struct _

22、SEM_CREATE_PARAMLONG InitialCount;LONG MaximumCount;SEM_CREATE_PARAM, *PSEM_CREATE_PARAM;/ semaphore 對(duì)象的構(gòu)造函數(shù),在創(chuàng)建新 semaphore 對(duì)象時(shí)被調(diào)用。/VOIDPspOnCreateSemaphoreObject(IN PVOID SemaphoreObject,IN ULONG_PTR CreateParam)PsInitializeSemaphore( (PSEMAPHORE)SemaphoreObject, (PSEM_CREATE_PARAM)CreateParam)->

23、;InitialCount, (PSEM_CREATE_PARAM)CreateParam)->MaximumCount );/ semaphore 對(duì)象類型的初始化函數(shù)。/VOIDPspCreateSemaphoreObjectType(VOID)STATUS Status;OBJECT_TYPE_INITIALIZER Initializer;Initializer.Create = PspOnCreateSemaphoreObject;Initializer.Delete = NULL;Initializer.Wait = (OB_WAIT_METHOD)PsWaitForSema

24、phore;Initializer.Read = NULL;Initializer.Write = NULL;Status = ObCreateObjectType("SEMAPHORE", &Initializer, &PspSemaphoreType);if (!EOS_SUCCESS(Status) KeBugCheck("Failed to create semaphore object type!"); / semaphore 對(duì)象的構(gòu)造函數(shù)。/STATUSPsCreateSemaphoreObject(IN LONG Init

25、ialCount,IN LONG MaximumCount,IN PSTR Name,OUT PHANDLE SemaphoreHandle)STATUS Status;PVOID SemaphoreObject;SEM_CREATE_PARAM CreateParam; if(InitialCount < 0 | MaximumCount <= 0 | InitialCount > MaximumCount)return STATUS_INVALID_PARAMETER; / 創(chuàng)建信號(hào)量對(duì)象。/CreateParam.InitialCount = InitialCount;

26、CreateParam.MaximumCount = MaximumCount; Status = ObCreateObject( PspSemaphoreType, Name, sizeof(SEMAPHORE), (ULONG_PTR)&CreateParam, &SemaphoreObject);if (!EOS_SUCCESS(Status) return Status;Status = ObCreateHandle(SemaphoreObject, SemaphoreHandle); if (!EOS_SUCCESS(Status) ObDerefObject(Sem

27、aphoreObject); return Status;/ semaphore 對(duì)象的 signal 操作函數(shù)。/STATUSPsReleaseSemaphoreObject(IN HANDLE Handle,IN LONG ReleaseCount,IN PLONG PreviousCount)STATUS Status;PSEMAPHORE Semaphore;if (ReleaseCount < 1) return STATUS_INVALID_PARAMETER; / 由 semaphore 句柄得到 semaphore 對(duì)象的指針。Status = ObRefObjectBy

28、Handle(Handle, PspSemaphoreType, (PVOID*)&Semaphore); if (EOS_SUCCESS(Status) Status = PsReleaseSemaphore(Semaphore, ReleaseCount, PreviousCount);ObDerefObject(Semaphore);return Status;5.程序運(yùn)行時(shí)的初值和運(yùn)行結(jié)果a.使用EOS 的信號(hào)量解決生產(chǎn)者消費(fèi)者問題1).使用 pc.c文件中的源代碼,替換之前創(chuàng)建的EOS 應(yīng)用程序項(xiàng)目中EOSApp.c文件內(nèi)的源代碼2).按 F7生成修改后的EOS應(yīng)用程序項(xiàng)目。

29、 3).按F5啟動(dòng)調(diào)試。OS Lab會(huì)首先彈出一個(gè)調(diào)試異常對(duì)話框。 4).在調(diào)試異常對(duì)話框中選擇“否”,繼續(xù)執(zhí)行。 5).立即激活虛擬機(jī)窗口查看生產(chǎn)者消費(fèi)者同步執(zhí)行的過程,如下圖。 b. 創(chuàng)建信號(hào)量1).按 F5啟動(dòng)調(diào)試EOS應(yīng)用項(xiàng)目。OS Lab會(huì)首先彈出一個(gè)調(diào)試異常對(duì)話框。 2).在調(diào)試異常對(duì)話框中選擇“是”,調(diào)試會(huì)中斷。 3).在 main 函數(shù)中創(chuàng)建Empty信號(hào)量的代碼行(第77行EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一個(gè)斷點(diǎn)。 4).按 F5繼續(xù)調(diào)試,到此斷點(diǎn)處中斷。 5)

30、.按 F11 調(diào)試進(jìn)入 CreateSemaphore 函數(shù)。可以看到此 API 函數(shù)只是調(diào)用了 EOS 內(nèi)核中的PsCreateSemaphoreObject函數(shù)來創(chuàng)建信號(hào)量對(duì)象。 6).按 F11 調(diào)試進(jìn)入 semaphore.c 文件中的 PsCreateSemaphoreObject 函數(shù)。在此函數(shù)中,會(huì)在 EOS內(nèi)核管理的內(nèi)存中創(chuàng)建一個(gè)信號(hào)量對(duì)象(分配一塊內(nèi)存),而初始化信號(hào)量對(duì)象中各個(gè)成員的操作是在 PsInitializeSemaphore函數(shù)中完成的。 7).在 semaphore.c文件的頂部查找到PsInitializeSemaphore函數(shù)的定義(第 19 行),在此函數(shù)

31、的第一行(第39行)代碼處添加一個(gè)斷點(diǎn)。 8).按 F5繼續(xù)調(diào)試,到斷點(diǎn)處中斷。觀察PsInitializeSemaphore函數(shù)中用來初始化信號(hào)量結(jié)構(gòu)體成員的值,應(yīng)該和傳入CreateSemaphore函數(shù)的參數(shù)值是一致的。 9).按 F10 單步調(diào)試 PsInitializeSemaphore 函數(shù)執(zhí)行的過程,查看信號(hào)量結(jié)構(gòu)體被初始化的過程。打開“調(diào)用堆?!贝翱冢榭春瘮?shù)的調(diào)用層次。 c. 等待、釋放信號(hào)量1).結(jié)束之前的調(diào)試。 2).刪除所有的斷點(diǎn)。 3).按 F5重新啟動(dòng)調(diào)試。OS Lab會(huì)首先彈出一個(gè)調(diào)試異常對(duì)話框。 4).在調(diào)試異常對(duì)話框中選擇“是”,調(diào)試會(huì)中斷。 5).在 sem

32、aphore.c文件中的PsWaitForSemaphore函數(shù)的 PspWait(&Semaphore->WaitListHead, INFINITE); 代碼行(第78行)添加一個(gè)斷點(diǎn)。 6).按 F5繼續(xù)調(diào)試,并立即激活虛擬機(jī)窗口查看輸出。開始時(shí)生產(chǎn)者、消費(fèi)者都不會(huì)被信號(hào)量阻塞,同步執(zhí)行一段時(shí)間后才在斷點(diǎn)處中斷。 7).中斷后,查看“調(diào)用堆?!贝翱冢?Producer 函數(shù)對(duì)應(yīng)的堆棧幀,說明此次調(diào)用是從生產(chǎn)者線程函數(shù)進(jìn)入的。 8).在“調(diào)用堆?!贝翱谥须p擊 Producer 函數(shù)所在的堆棧幀,綠色箭頭指向等待 Empty 信號(hào)量的代碼行,查看Producer函數(shù)中變量i

33、的值為14,表示生產(chǎn)者線程正在嘗試生產(chǎn)14 號(hào)產(chǎn)品。 9).在“調(diào)用堆棧”窗口中雙擊 PsWaitForSemaphore 函數(shù)的堆棧幀,查看 Empty 信號(hào)量計(jì)數(shù)(Semaphore->Count)的值為-1,所以會(huì)調(diào)用PspWait函數(shù)將生產(chǎn)者線程放入Empty信號(hào)量的等待隊(duì)列中進(jìn)行等待(讓出CPU)。10) .激活虛擬機(jī)窗口查看輸出的結(jié)果。生產(chǎn)了從0到13的14個(gè)產(chǎn)品,但是只消費(fèi)了從0到 3的 4個(gè)產(chǎn)品,所以緩沖池中的10個(gè)緩沖區(qū)就都被占用了,這與之前調(diào)試的結(jié)果是一致的。d 釋放信號(hào)量(喚醒)1).刪除所有斷點(diǎn)。 2).在 eosapp.c文件的Consumer函數(shù)中,釋放Empty信號(hào)量的代碼行(第180行) ReleaseSemaphore(EmptySemaphoreHandle, 1, NULL); 添加一個(gè)斷點(diǎn)。 3).按 F5繼續(xù)調(diào)試,到斷點(diǎn)處中斷。 4) .查看Consumer函數(shù)中變量i 的值為4,說明已經(jīng)消費(fèi)了4 號(hào)產(chǎn)品。5).進(jìn)入PsReleaseSemaphore函數(shù)。 6).查看 PsReleaseSemaphore 函數(shù)中 Empty 信號(hào)量計(jì)數(shù)(Semaphore->Count)的值為-1,和生產(chǎn)者線程被阻塞時(shí)的值是一致的。 7).按 F10單步調(diào)試PsReleaseSema

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論