付費下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
設(shè)計代碼STATUSBdi工IFloppyHelpPsResumThread(INHANDLEhThreadSTATUSStatus;BOOLIntState;PTHREADThread;1.2.3.Status=ObRefObjectByHandle(hThread,PspThreadType,(PVOID*)&Thread);if(EOS_SUCCESS(Status)){IntState=KeEnablelnterrupts(FALSE);if(Zero==Thread->State){//關(guān)中斷ListRemoveEntry(&Thread->StateListEntry);PspReadyThread(Thread);PspThreadSchedule();Status=STATUS_SUCCESS;}else{Status=STATUS_NOT_SUPPORTED;KeEnableInterrupts(lntState);ObDerefObject(Thread);}設(shè)計代碼STATUSBdi工IFloppyHelpPsResumThread(INHANDLEhThreadSTATUSStatus;BOOLIntState;PTHREADThread;1.2.3.Status=ObRefObjectByHandle(hThread,PspThreadType,(PVOID*)&Thread);if(EOS_SUCCESS(Status)){IntState=KeEnablelnterrupts(FALSE);if(Zero==Thread->State){//關(guān)中斷ListRemoveEntry(&Thread->StateListEntry);PspReadyThread(Thread);PspThreadSchedule();Status=STATUS_SUCCESS;}else{Status=STATUS_NOT_SUPPORTED;KeEnableInterrupts(lntState);ObDerefObject(Thread);}returnStatus;首先調(diào)用然后調(diào)用最后調(diào)用//開中斷ListRemoveEntry函數(shù)將線程從掛起線程隊列中移除。PspReadyThread函數(shù)將線程恢復為就緒狀態(tài)。PspThreadSchedule宏函數(shù)執(zhí)行線程調(diào)度,讓剛剛恢復的線程有機會執(zhí)行。3其他需要說明的問題1實驗目的和要求目的:要求:1實驗目的和要求目的:要求:(1)使用EOS的信號量,實現(xiàn)生產(chǎn)者-消費者問題;實驗二進程的同步(7分)理解進程同步的原理和意義,掌握信號量的實現(xiàn)方法和應(yīng)用。(2)跟蹤調(diào)試EOS信號量的工作過程,分析 EOS信號量實現(xiàn)的源代碼;(2)修改EOS信號量的實現(xiàn)代碼,使之支持等待超時喚醒和批量釋放功能。2完成的實驗內(nèi)容2.1使用EOS的信號量實現(xiàn)生產(chǎn)者-消費者問題(簡要說明使用 EOS的信號量解決生產(chǎn)者-消費者問題的實現(xiàn)方法;給出在本部分實驗過程中完成的主要工作,包括調(diào)試、跟蹤 、測試與思考等)EOS使用CreateThread函數(shù)創(chuàng)建線程,使用 CreateMutex、CreateSemaphore創(chuàng)建信號量。WaitForSingleObject 與ReleaseMutex、ReleaseSemaphore函數(shù)相當于P、V原語。設(shè)計思路和流程圖:按照下面的步驟查看生產(chǎn)者一消費者同步執(zhí)行的過程:1.使用pc.c文件中的源代碼,件內(nèi)的源代碼。替換之前創(chuàng)建的EOS應(yīng)用程序項目中 EOSAPP.C文2.按F7生成修改后的EOS應(yīng)用程序項目。3.按F5啟動調(diào)試。OSLab會首先彈出一個調(diào)試異常對話框。4.5.6.在調(diào)試異常對話框中選擇“否”,繼續(xù)執(zhí)行。立即激活虛擬機窗口查看生產(chǎn)者-消費者同步執(zhí)行的過程,如圖待應(yīng)用程序執(zhí)行完畢后,結(jié)束此次調(diào)試。13-2。EDnSQLE-1tP-pess 縣tosultchconfiscLeulndou.__3ciixmtuEDLisJirJI>AuVirginA卜也■Ct>nsurie4a1
a2BL3a1
a2BL3CrmaiinrafroJjiiccPrudi^ctFraduccrruliit;cFrnrlLirrPruliicca14)FfrMocca11Fpolticcft12GonsuK4hPrortdrtiH13Cbnsunca1.Mutex、Empty、Full三個信號量的初始值分別為 1、10、0,當存在一個生產(chǎn)者線程訪問緩沖池時,首先對 Empty減1,如果大于0,則說明還有剩余緩沖區(qū)可以讓生產(chǎn)者放入產(chǎn)品,否則生產(chǎn)者線程進入等待隊列;再對 Mutex減1,如果大于等于0,則說明沒有線程占用緩沖池,否則生產(chǎn)者線程進入等待隊列。生產(chǎn)完產(chǎn)品后,對 Mutex加1,解除封鎖;再對Full加1,說明生產(chǎn)了一個產(chǎn)品占用了一個緩沖區(qū)。消費者線程同理,對信號量的操作順序與生產(chǎn)者線程相反。 不能對這三個同步對象的操作改變順序, 否則可能造成死鎖。因為臨界資源的訪問限制,程序中限定了緩沖池的大小為 10,只有緩沖池有空余時生產(chǎn)者才能向里邊放產(chǎn)品,同時只有緩沖池有產(chǎn)品時消費者才能向外取東西。當生產(chǎn)者生產(chǎn)了13號產(chǎn)品后,共生產(chǎn)了從 0到13的14個產(chǎn)品,但是只消費了從 0到3的4個產(chǎn)品,所以緩沖池中的10個緩沖區(qū)就都被占用了,所以不能繼續(xù)生產(chǎn) 14號產(chǎn)品,而要等到消費者消費掉一個產(chǎn)品后,緩沖池有空余位置,才能繼續(xù)生產(chǎn) 14號產(chǎn)品。當生產(chǎn)者線程生產(chǎn)了 13號產(chǎn)品后,此時Full信號量的值為10,而Empty信號量的值為0,此時若生產(chǎn)者線程要再生產(chǎn)一個產(chǎn)品,先對Empty減1,此時Empty值小于零,生產(chǎn)者線程進入等待隊列;而此時若有一個消費者線程要消費一個產(chǎn)品,先對 Full減1,此時Full值為9,大于0,如果沒有線程占用緩沖池,消費者可以消費一個產(chǎn)品。這樣,生產(chǎn)者和消費者就能實現(xiàn)同步過程了。2.2EOS信號量工作過程的跟蹤與源代碼分析(分析EOS信號量實現(xiàn)的核心源代碼, 簡要闡述其實現(xiàn)方法;給出在本部分實驗過程中完成的主要工作,包括調(diào)試、跟蹤與思考等)EOS的P、V原語實現(xiàn)是PsWaitForSemaphore、PsReleaseSemaphore,這兩個函數(shù)使用KeEnableInterrupts開關(guān)中斷來實現(xiàn)原語操作。PsWaitForSemaphore流程圖:
卩1t]-nrSefnaphore.隔數(shù)升妬 ■丿I'傭賺F操作—[:J: W—:<僭號星血小J^?>—VES 1 原了詁乍完成—k」j廂數(shù)結(jié)束'\U'PsReleaseSemaphore函數(shù)的流程圖:'\U'2.3支持等待超時喚醒和批量釋放功能的 EOS信號量實現(xiàn)(給出實現(xiàn)方法的簡要描述、源代碼、測試和結(jié)果等)修改PsWaitForSemaphore函數(shù),先用計數(shù)值和0比較,當計數(shù)值大于 0時,將計數(shù)值減1后直接返回成功; 當計數(shù)值等于0時,調(diào)用PspWait函數(shù)阻塞線程的執(zhí)行(將參數(shù)Milliseconds做為PspWait函數(shù)的第二個參數(shù),并使用PspWait函數(shù)的返回值做為返回值)。修改PsWaitForSemaphore函數(shù)如下添加支持超時。STATUSPsWaitForSemaphore(INPSEMAPHORESemaphore.
INULONGMillisecondsBOOLIntState;ASSERT(KeGetlntNesting()==0);IntState=KeEnablelnterrupts(FALSE);STATUSret;if(Semaphore->Count>0){Semaphore->Count--;ret=STATUS_SUCCESS;}else{ret=PspWait(&Semaphore->WaitListHead,Milliseconds);}KeEnableInterrupts(IntState);/returnret;修改PsReleaseSemaphore函數(shù)如下添加批量釋放支持。STATUSPsReleaseSemaphore(INPSEMAPHORESemaphore.INLONGReleaseCount,OUTPLONGPreviousCountSTATUSStatus;BOOLIntState;IntState=KeEnablelnterrupts(FALSE);if(Semaphore->Count+ReleaseCount>Semaphore->MaximumCount){Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED;}else{if(NULL!=PreviousCount){*PreviousCount=Semaphore->Count;}inti;for(i=ReleaseCount;i--;){Semaphore->Count++;if(Semaphore->Count<=0){PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);PspThreadScheduleO;Status=STATUS_SUCCESS;KeEnablelnterrupts(IntState);returnStatus;3IKai].Et(Frt^ClrliM^Ffltu cuuuke?ii』血亠.JUttlinb4皿Co畛Mg413CmwM420QiWEunr■石ICoBBurwa2Cdbvml423iJlirr:■廚*nrrwklucc1Sb^urtULiriErHElfnrflipridiifullCnEUFEaCuwunuJ型>tLurrmtn^i-nrrWlinZdLiCfi#ZBfCurunnerwtltE/llILT■妙fprfurUlifuJICo疇LiW42h?戢EA^ptinrrtLnrrwtxcMjitiurrtlncLHtCnEurraZBCbpLirtz■29exitulth3其他需要說明的問題1實驗目的和要求目的:要求:(1)1實驗目的和要求目的:要求:(1)(2)修改EOS的調(diào)度程序,添加時間片輪轉(zhuǎn)調(diào)度。理解進程(線程)調(diào)度的執(zhí)行時機和過程,掌握調(diào)度程序?qū)崿F(xiàn)的基本方法。跟蹤調(diào)試EOS的線程調(diào)度程序,分析EOS基于優(yōu)先級的搶占式調(diào)度的源代碼;2完成的實驗內(nèi)容2.1EOS基于優(yōu)先級的搶占式調(diào)度工作過程的跟蹤與源代碼分析(分析EOS基于優(yōu)先級的搶占式調(diào)度的核心源代碼, 簡要闡述其實現(xiàn)方法; 給出在本部分實驗過程中完成的主要工作,包括調(diào)試、跟蹤與思考等)實驗使用EOS提供的rr命令觀察時間片的輪轉(zhuǎn)。準備實驗(1) 啟動OSLab。(2) 新建一個EOSKernel項目。閱讀控制臺命令“rr”相關(guān)的源代碼(1) 按F7生成在本實驗3.1中創(chuàng)建的EOSKernel項目。(2) 按F5啟動調(diào)試。-laiXI(3) 待EOS啟動完畢,在EOS控制臺中輸入命令“rr-laiXI?osL訕PC-■讓ro“班Virtu*!TC£DDTCOMSOLE-1(PressCtr1+F1?F8tosultchconsoleuindou...)Thread0CBJ:45740調(diào)試線程調(diào)度程序a)調(diào)試當前線程不被搶先的情況(1) 結(jié)束之前的調(diào)試。(2) 在ke/sysproc.c文件的ThreadFunction函數(shù)中,調(diào)用fprintf函數(shù)的代碼行(第680行)添加一個斷點。(3) 按F5啟動調(diào)試。(4) 待EOS啟動完畢,在EOS$制臺中輸入命令“rr”后按回車。“rr”命令開始執(zhí)行后,會在斷點處中斷。(5) 查看ThreadFunction函數(shù)中變量pThreadParameter->Y的值應(yīng)該為0,說明正在調(diào)試的是第0個新建的線程。原因(6)激活虛擬機窗口, 可以看到第0個新建的線程還沒有在控制臺中輸出任何內(nèi)容,原因是fprintf 函數(shù)還沒有執(zhí)行。
(7)激活OSLab窗口后按F5使第0個新建的線程繼續(xù)執(zhí)行,又會在斷點處中斷。再次激活虛擬機窗口,可以看到第 0個新建的線程已經(jīng)在控制臺中輸出了第一輪循環(huán)的內(nèi)容??梢远喟磶状蜦5查看每輪循環(huán)輸出的內(nèi)容。b)調(diào)試當前線程被搶先的情況(1) 選擇“調(diào)試”菜單中的“刪除所有斷點”,刪除之前添加的所有斷點。(2) 在Ps/sched.c文件的PspSelectNextThread函數(shù)的第395行添加一個斷點。(3)按F5繼續(xù)執(zhí)行,激活虛擬機窗口,可看到第 0個新建的線程正在執(zhí)行。(4)在虛擬機窗口中按下一次空格鍵, EOS會在之前添加的斷點處中斷。(5)在“監(jiān)視”窗口中查看就緒位圖的值為 1000000000000000100000001,說明此時在優(yōu)先級為24的就緒隊列中存在就緒線程。在“監(jiān)視”窗口中添加表達式“ListGetCount(&PspReadyListHeads[24]) ",其值為1,說明優(yōu)先級為24的就緒隊HighestPriority 也就列中只有一個就緒線程。掃描就緒位圖后獲得的最高優(yōu)先級的值應(yīng)該是24HighestPriority 也就0個新建的線程,放入8的就緒隊列中的線程(60個新建的線程,放入8的就緒隊列中的線程優(yōu)先級為8的就緒隊列的隊首。 “監(jiān)視”窗口中顯示的優(yōu)先級為數(shù)量就會增加1,變?yōu)?0。(7)繼續(xù)按F10單步調(diào)試,直到在第 444行中斷執(zhí)行,注意觀察線程調(diào)度執(zhí)行的每CPU個步驟。此時,正在執(zhí)行的第 0個新建的線程已經(jīng)進入了“就緒”狀態(tài),讓出了CPU線程調(diào)度程序接下來的工作就是選擇優(yōu)先級最高的非空就緒隊列的隊首線程作為當前運行線程,也就是讓優(yōu)先級為 24的線程在CPU上執(zhí)行。(8)按F10單步調(diào)試一次,當前線程 PspCurrentThread指向了優(yōu)先級為24的線程??梢栽凇翱焖俦O(jiān)視”窗口中查看表達式“ *PspCurrentThread”的值,注意線程控制塊中StartAddr域的值為IopConsoleDispatchThread 函數(shù)(在文件io/console.c 中定義),說明這個優(yōu)先級為 24的線程是控制臺派遣線程。(9)繼續(xù)按F10單步調(diào)試,直到在 PspSelectNextThread 函數(shù)返回前(第465行)中斷執(zhí)行,注意觀察線程調(diào)度執(zhí)行的每一個步驟。此時,優(yōu)先級為 24的線程已經(jīng)進入了“運行”狀態(tài),在中斷返回后,就可以開始執(zhí)行了。在“監(jiān)視”窗口中,就緒位圖的值變?yōu)?00000001,優(yōu)先級為24的就緒隊列中線程的數(shù)量變?yōu)?0,就緒位圖和就緒隊列都是在剛剛被調(diào)用過的 PspUnreadyThread函數(shù)內(nèi)更新的。(10) 刪除所有斷點后結(jié)束調(diào)試。22為EOS添加時間片輪轉(zhuǎn)調(diào)度的實現(xiàn)(給出實現(xiàn)方法的簡要描述、源代碼、測試和結(jié)果等)修改PspRoundRobin函數(shù)如下:VOIDPspRoundRobin(VOIDif(NULL==PspCurrentThread||Running!=PspCurrentThread->State){return;
PspCurrentThread->RemainderTicks
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)設(shè)備的安裝制度
- 產(chǎn)品合規(guī)管理制度
- 中國師范生認證制度
- 二甲復審內(nèi)審員培訓課件
- 中國社會科學院世界經(jīng)濟與政治研究所2026年度公開招聘第一批專業(yè)技術(shù)人員6人備考題庫及完整答案詳解一套
- 2025-2030中國氣體滾筒干燥機行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 三明市農(nóng)業(yè)科學研究院關(guān)于2025年公開招聘專業(yè)技術(shù)人員備考題庫及參考答案詳解一套
- 2025-2030中國直流電子負載行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 中國熱帶農(nóng)業(yè)科學院院屬單位2026年第一批公開招聘工作人員備考題庫有答案詳解
- 2025至2030新能源電池行業(yè)競爭格局分析及未來趨勢與投資機會研究報告
- 2025北京陳經(jīng)綸中學高一9月月考物理(貫通班)試題含答案
- 中國鋁礦行業(yè)現(xiàn)狀分析報告
- 物業(yè)人員消防安全培訓課件
- 服裝銷售年底總結(jié)
- 2025年大學大四(預防醫(yī)學)環(huán)境衛(wèi)生學階段測試試題及答案
- 文物安全保護責任書范本
- 產(chǎn)房護士長年度工作業(yè)績總結(jié)與展望
- 【初中 歷史】2025-2026學年統(tǒng)編版八年級上學期歷史總復習 課件
- 2025~2026學年黑龍江省哈爾濱市道里區(qū)第七十六中學校九年級上學期9月培優(yōu)(四)化學試卷
- 2025年律師事務(wù)所黨支部書記年終述職報告
- 中國腦小血管病診治指南2025
評論
0/150
提交評論