2011061324張耀(第五講-進程的同步)資料_第1頁
2011061324張耀(第五講-進程的同步)資料_第2頁
2011061324張耀(第五講-進程的同步)資料_第3頁
2011061324張耀(第五講-進程的同步)資料_第4頁
2011061324張耀(第五講-進程的同步)資料_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

PAGEPAGE14操作系統實驗報告課程名稱操作系統實驗課程編號0906553實驗項目名稱進程的同步學號2011061324年級2011姓名張耀專業計算機科學與技術學生所在學院計算機科學與技術指導教師印桂生實驗室名稱地點21B276哈爾濱工程大學計算機科學與技術學院

第五講進程的同步一、實驗概述1.實驗名稱進程的同步2.實驗目的(1)使用EOS的信號量,編程解決生產者—消費者問題,理解進程同步的意義;(2)調試跟蹤EOS信號量的工作過程,理解進程同步的原理;(3)修改EOS的信號量算法,使之支持等待超時喚醒功能(有限等待),加深理解進程同步的原理。3.實驗類型驗證型和設計型實驗4.實驗內容(1)準備實驗;(2)使用EOS的信號量解決生產者-消費者問題;(3)調試EOS信號量的工作過程;創建信號量等待釋放信號量等待信號量(不阻塞)釋放信號量(不喚醒)等待信號量(阻塞)釋放信號量(喚醒)(4)修改EOS的信號量算法。二、實驗環境(1)OSLab集成實驗環境;(2)EOS操作系統;(2)C語言。三、實驗過程1.設計思路和流程圖mainmain函數開始創建Mutex對象創建Empty信號量對象創建Full信號量對象創建生產者線程創建消費者線程等待生產者線程和消費者線程結束關閉句柄main函數結束Producer函數開始生產完畢?等待Empty信號量對象等待Mutex對象生產一個產品,占用一個緩沖區循環向后移動緩沖區指針釋放Mutex對象釋放Full信號量對象等待500毫秒Producer函數結束Consumer函數開始消費完畢畢?等待Full信號量對象等待Mutex對象消費一個產品,清空一個緩沖區循環向后移動緩沖區指針釋放Mutex對象釋放Empty信號量對象前10個產品?等待2000毫秒等待100毫秒Consumer函數結束圖3.1.12.需要解決的問題及解答(1)生產者在生產了13號產品后本來要繼續生產14號產品,可此時生產者為什么必須等待消費者消費了4號產品后,才能生產14號產品呢?生產者和消費者是怎樣使用同步對象來實現該同步過程的呢?答:因為臨界資源的訪問限制,程序中限定了緩沖池的大小為10,只有緩沖池有空余時生產者才能向里邊放產品,同時只有緩沖池有產品時消費者才能向外取東西。當生產者生產了13號產品后,共生產了從0到13的14個產品,但是只消費了從0到3的4個產品,所以緩沖池中的10個緩沖區就都被占用了,所以不能繼續生產14號產品,而要等到消費者消費掉一個產品后,緩沖池有空余位置,才能繼續生產14號產品。當生產者線程生產了13號產品后,此時Full信號量的值為10,而Empty信號量的值為0,此時若生產者線程要再生產一個產品,先對Empty減1,此時Empty值小于零,生產者線程進入等待隊列;而此時若有一個消費者線程要消費一個產品,先對Full減1,此時Full值為9,大于0,如果沒有線程占用緩沖池,消費者可以消費一個產品。這樣,生產者和消費者就能實現同步過程了。生產者線程和消費者線程是如何使用Mutex、Empty信號量和Full信號量來實現同步的?在兩個線程函數中對這三個同步對象的操作能夠改變順序嗎?答:Mutex、Empty、Full三個信號量的初始值分別為1、10、0,當存在一個生產者線程訪問緩沖池時,首先對Empty減1,如果大于0,則說明還有剩余緩沖區可以讓生產者放入產品,否則生產者線程進入等待隊列;再對Mutex減1,如果大于等于0,則說明沒有線程占用緩沖池,否則生產者線程進入等待隊列。生產完產品后,對Mutex加1,解除封鎖;再對Full加1,說明生產了一個產品占用了一個緩沖區。消費者線程同理,對信號量的操作順序與生產者線程相反。不能對這三個同步對象的操作改變順序,否則可能造成死鎖。(3)思考在ps/semaphore.c文件內的PsWaitForSemaphore和PsReleaseSemaphore函數中,為什么要使用原子操作?答:在執行PsWaitForSemaphore和PsReleaseSemaphore函數的時候,不允許cpu響應外部中斷,如果此時cpu響應了外部中斷,會產生不可預料的結果,無法正常完成函數的功能。(4)繪制ps/semaphore.c文件內PsWaitForSemaphore和PsReleaseSemaphore函數的流程圖。PsWaitForSemaphore流程圖:圖3.2.1PsReleaseSemaphore函數的流程圖:圖3.2.2(5)根據本實驗3.3.2節中設置斷點和調試的方法,自己設計一個類似的調試方案來驗證消費者線程在消費24號產品時會被阻塞,直到生產者線程生產了24號產品后,消費者線程才被喚醒并繼續執行的過程。答:調試方案如下:①刪除所有的斷點。②按F5啟動調試。OSLab會首先彈出一個調試異常對話框。③在調試異常對話框中選擇“是”,調試會中斷。④在Consumer函數中等待Full信號量的代碼行(第173行) WaitForSingleObject(FullSemaphoreHandle,INFINITE);添加一個斷點。⑤在“斷點”窗口(按Alt+F9打開)中此斷點的名稱上點擊右鍵。⑥在彈出的快捷菜單中選擇“條件”。⑦在“斷點條件”對話框(按F1獲得幫助)的表達式編輯框中,輸入表達式“i==24”。⑧點擊“斷點條件”對話框中的“確定”按鈕。⑨按F5繼續調試。只有當消費者線程嘗試消費24號產品時才會在該條件斷點處中斷。3.主要數據結構、實現代碼及其說明修改PsWaitForSemaphore函數: if(Semaphore->Count>0)//如果信號量大于零,說明尚有資源,可以為線程分配Semaphore->Count--; else//否則,說明資源數量不夠,不能再為線程分配資源,因此要使線程等待if(Semaphore->Count==0)s=PspWait(&Semaphore->WaitListHead,Milliseconds);修改PsReleaseSemaphore函數: if(ReleaseCount>0)//ReleaseCount大于0才執行釋放操作 { Semaphore->Count++; while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){ PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);//喚醒線程 PspThreadSchedule();//線程調度 ReleaseCount--; }//循環喚醒線程 Semaphore->Count=Semaphore->Count+ReleaseCount; Status=STATUS_SUCCESS; }elseprintf("Error:ReleaseCountisnegative!"); }//否側輸出ReleaseCount值錯誤修改Producer函數:WaitForSingleObject(EmptySemaphoreHandle,INFINITE);替換為while(WAIT_TIMEOUT==WaitForSingleObject(EmptySemaphoreHandle,300)){printf("Producerwaitforemptysemaphoretimeout\n");}//超時300ms則輸出Producerwaitforemptysemaphoretimeout修改Consumer函數:WaitForSingleObject(FullSemaphoreHandle,INFINITE);替換為while(WAIT_TIMEOUT==WaitForSingleObject(FullSemaphoreHandle,300)){printf("Consumerwaitforfullsemaphoretimeout\n");}//超時300ms則輸出Consumerwaitforfullsemaphoretimeout4.源程序并附上注釋STATUSPsWaitForSemaphore( INPSEMAPHORESemaphore, INULONGMilliseconds )/*++功能描述: 信號量的Wait操作(P操作)。參數: Semaphore--Wait操作的信號量對象。 Milliseconds--等待超時上限,單位毫秒。返回值: STATUS_SUCCESS。 當你修改信號量使之支持超時喚醒功能后,如果等待超時,應該返回STATUS_TIMEOUT。--*/{ BOOLIntState; STATUSs=STATUS_SUCCESS; ASSERT(KeGetIntNesting()==0);//中斷環境下不能調用此函數。 IntState=KeEnableInterrupts(FALSE);//開始原子操作,禁止中斷。 // //目前僅實現了標準記錄型信號量,不支持超時喚醒功能,所以PspWait函數 //的第二個參數的值只能是INFINITE。 // //Semaphore->Count--; //if(Semaphore->Count<0){ // PspWait(&Semaphore->WaitListHead,INFINITE); //} if(Semaphore->Count>0)//如果信號量大于零,說明尚有資源,可以為線程分配Semaphore->Count--; else//否則,說明資源數量不夠,不能再為線程分配資源,因此要使線程等待if(Semaphore->Count==0)s=PspWait(&Semaphore->WaitListHead,Milliseconds); KeEnableInterrupts(IntState);//原子操作完成,恢復中斷。 //returnSTATUS_SUCCESS; returns;}STATUSPsReleaseSemaphore( INPSEMAPHORESemaphore, INLONGReleaseCount, OUTPLONGPreviousCount )/*++功能描述: 信號量的Signal操作(V操作)。參數: Semaphore--Wait操作的信號量對象。 ReleaseCount--信號量計數增加的數量。當前只能為1。當你修改信號量使之支持 超時喚醒功能后,此參數的值能夠大于等于1。 PreviousCount--返回信號量計數在增加之前的值。返回值: 如果成功釋放信號量,返回STATUS_SUCCESS。--*/{ STATUSStatus; BOOLIntState; IntState=KeEnableInterrupts(FALSE);//開始原子操作,禁止中斷。 if(Semaphore->Count+ReleaseCount>Semaphore->MaximumCount){ Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED; }else{ // //記錄當前的信號量的值。 // if(NULL!=PreviousCount){ *PreviousCount=Semaphore->Count; } // //目前僅實現了標準記錄型信號量,每執行一次信號量的釋放操作 //只能使信號量的值增加1。 // //Semaphore->Count++; //if(Semaphore->Count<=0){ // PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS); //} if(ReleaseCount>0)//ReleaseCount大于0才執行釋放操作 { Semaphore->Count++; while((!ListIsEmpty(&Semaphore->WaitListHead))&&(ReleaseCount)){ PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);//喚醒線程 PspThreadSchedule();//線程調度 ReleaseCount--; }//循環喚醒線程 Semaphore->Count=Semaphore->Count+ReleaseCount; Status=STATUS_SUCCESS; }elseprintf("Error:ReleaseCountisnegative!"); }//否側輸出ReleaseCount值錯誤 KeEnableInterrupts(IntState);//原子操作完成,恢復中斷。 returnStatus;}5.程序運行時的初值和運行結果修改PsWaitForSemaphore函數,先用計數值和0比較,當計數值大于0時,將計數值減1后直接返回成功;當計數值等于0時,調用PspWait函數阻塞線程的執行(將參數Milliseconds做為PspWait函數的第二個參數,并使用PspWait函數的返回值做為返回值)。如圖3.1所示。圖3.5.1修改PsReleaseSemaphore函數,編寫一個使用ReleaseCount做為計數器的循環體,在循環體中完成下面的工作:1.如果被阻塞的線程數量大于等于ReleaseCount,則循環結束后,有ReleaseCount個線程會被喚醒,而且信號量計數的值仍然為0;2.如果被阻塞的線程數量(可以為0)小于ReleaseCount,則循環結束后,所有被阻塞的線程都會被喚醒,并且信號量的計數值=ReleaseCount-之前被阻塞線程的數量+之前信號量的計數值。如圖3.2所示。圖3.5.2使用修改完畢的EOSKernel項目生成完全版本的SDK文件夾,并覆蓋之前的生產者-消費者應用程序項目的SDK文件夾。按F5調試執行原有的生產者-消費者應用程序項目,結果與原來一致,如下圖所示。圖3.5.3修改Producer函數中

溫馨提示

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

評論

0/150

提交評論