版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)實(shí)驗(yàn)報(bào)告
學(xué)院:計(jì)算機(jī)與通信工程學(xué)院
專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)
班級(jí):______________________
學(xué)號(hào):______________________
姓名:______________________
指導(dǎo)教師:______________________
成績(jī):______________________
2023年1月1日
實(shí)驗(yàn)一線程的狀態(tài)和轉(zhuǎn)換(5分)
1實(shí)驗(yàn)?zāi)康暮鸵?guī)定
目的:熟悉線程的狀態(tài)及其轉(zhuǎn)換,理解線程狀態(tài)轉(zhuǎn)換與線程調(diào)度的關(guān)系。
規(guī)定:
(1)跟蹤調(diào)試EOS線程在各種狀態(tài)間的轉(zhuǎn)換過(guò)程,分析EOS中線程狀態(tài)及其轉(zhuǎn)換的相關(guān)
源代碼;
(2)修改EOS的源代碼,為線程增長(zhǎng)掛起狀態(tài)。
2完畢的實(shí)驗(yàn)內(nèi)容
2.1EOS線程狀態(tài)轉(zhuǎn)換過(guò)程的跟蹤與源代碼分析
(分析EOS中線程狀態(tài)及其轉(zhuǎn)換的核心源代碼,說(shuō)明EOS定義的線程狀態(tài)以及狀態(tài)轉(zhuǎn)換
的實(shí)現(xiàn)方法:給出在本部分實(shí)驗(yàn)過(guò)程中完畢的重要工作,涉及調(diào)試、跟蹤與思考等)
1.EOS準(zhǔn)備了一個(gè)控制臺(tái)命令"loop",這個(gè)命令的命令函數(shù)是ke/sysproc.
c文獻(xiàn)中的ConsoleCmdLoop函數(shù)(第797行,在此函數(shù)中使用LoopThread
Function函數(shù)(第755行)創(chuàng)建了一個(gè)優(yōu)先級(jí)為8的線程(后面簡(jiǎn)稱為“l(fā)oop線
程”),該線程會(huì)在控制臺(tái)中不斷的(死循環(huán))輸出該線程的ID和執(zhí)行計(jì)數(shù),執(zhí)行計(jì)數(shù)會(huì)
不斷的增長(zhǎng)以表達(dá)該線程在不斷的運(yùn)營(yíng)。loop命令執(zhí)行的效果可以參見(jiàn)下
圖:
2.線程由阻塞狀態(tài)進(jìn)入就緒狀態(tài)
(1)在虛擬機(jī)窗口中按下一次空格鍵。
(2)此時(shí)EOS會(huì)在PspUnwaitThread函數(shù)中的斷點(diǎn)處中斷。在“調(diào)試”菜單
中選擇“快速監(jiān)視”,在快速監(jiān)視對(duì)話框的表達(dá)式編輯框中輸入表達(dá)式“*Thread”,
然后點(diǎn)擊“重新計(jì)算”按鈕,即可查看線程控制塊(TCB)中的信息。其中State域
的值為3(Waiting),雙向鏈表項(xiàng)StateListEntry的Next和Prev指針的值
都不為0,說(shuō)明這個(gè)線程還處在阻塞狀態(tài),并在某個(gè)同步對(duì)象的等待隊(duì)列中;StartA
ddr域的值為lopConsoleDispatchThread,說(shuō)明這個(gè)線程就是控制臺(tái)派遣線程。
(3)關(guān)閉快速監(jiān)視對(duì)話框,激活“調(diào)用堆?!贝翱?。根據(jù)當(dāng)前的調(diào)用堆棧,可以看到
是由鍵盤(pán)中斷服務(wù)程序(Kdblsr)進(jìn)入的。當(dāng)按下空格鍵后,就會(huì)發(fā)生鍵盤(pán)中斷,從而
觸發(fā)鍵盤(pán)中斷服務(wù)程序。在該服務(wù)程序的最后中會(huì)喚醒控制臺(tái)派遣線程,將鍵盤(pán)事件派
遣到活動(dòng)的控制臺(tái)。
(4)在“調(diào)用堆?!贝翱谥须p擊PspWakeThread函數(shù)相應(yīng)的堆棧項(xiàng)??梢钥?/p>
到在此函數(shù)中連續(xù)調(diào)用了PspUnwaitThread函數(shù)和PspReadyThread函數(shù),從而
使處在阻塞狀態(tài)的控制臺(tái)派遣線程進(jìn)入就緒狀態(tài)。
(5)在“調(diào)用堆棧”窗口中雙擊PspUnwaitThread函數(shù)相應(yīng)的堆棧項(xiàng),先來(lái)看
看此函數(shù)是如何改變線程狀態(tài)的。按F10單步調(diào)試直到此函數(shù)的最后,然后再?gòu)目焖俦O(jiān)
視對(duì)話框中觀測(cè)“*Thread”表達(dá)式的值。此時(shí)State域的值為0(Zer。),雙向鏈
表項(xiàng)StateListEntry的Next和Prev指針的值都為0,說(shuō)明這個(gè)線程已經(jīng)處在游離狀態(tài),
并已不在任何線程狀態(tài)的隊(duì)列中。仔細(xì)閱讀PspUnwaitThread函數(shù)中的源代碼,理解
這些源代碼是如何改變線程狀態(tài)的。
(6)按尸5繼續(xù)執(zhí)行,在PspReadyThread函數(shù)中的斷點(diǎn)處中斷。按F10單步調(diào)試
直到此函數(shù)的最后,然后再?gòu)目焖俦O(jiān)視對(duì)話框中觀測(cè)“*Thread”表達(dá)式的值。此時(shí)S
tate域的值為1(Ready),雙向鏈表項(xiàng)StateListEntry的Next和Prev指針的值
都不為0,說(shuō)明這個(gè)線程已經(jīng)處在就緒狀態(tài),并已經(jīng)被放入優(yōu)先級(jí)為24的就緒隊(duì)列中
3.線程由運(yùn)營(yíng)狀態(tài)進(jìn)入就緒狀態(tài)
(1)按F5繼續(xù)執(zhí)行,在PspSe1ectNextThread函數(shù)中的斷點(diǎn)處中斷。在
快速監(jiān)視對(duì)話框中查看“*PspCurrentThread”表達(dá)式的值,觀測(cè)當(dāng)前占用解
決器的線程的情況。其中State域的值為2(Running),雙向鏈表項(xiàng)StateList
Entry的Next和Prev指針的值都為0,說(shuō)明這個(gè)線程仍然處在運(yùn)營(yíng)狀態(tài),由于只能
有一個(gè)處在運(yùn)營(yíng)狀態(tài)的線程,所以這個(gè)線程不在任何線程狀態(tài)的隊(duì)列中;StartAddr
域的值為L(zhǎng)oopThreadFunction,說(shuō)明這個(gè)線程就是1oop線程。注意,在本次斷
點(diǎn)被命中之前,1oop線程就已經(jīng)被中斷執(zhí)行了,并且其上下文已經(jīng)保存在線程控制塊
中。
(2)按F10單步調(diào)試,直到對(duì)當(dāng)前線程的操作完畢(也就是花括號(hào)中的操作完
畢)。再?gòu)目焖俦O(jiān)視對(duì)話框中查看"*PspCurrentThread”表達(dá)式的值。其中
State域的值為1(Ready),雙向鏈表項(xiàng)StateListEntry的Next和Prev指針的
值都不為0,說(shuō)明1oop線程已經(jīng)進(jìn)入了就緒狀態(tài),并已經(jīng)被放入優(yōu)先級(jí)為8的就緒隊(duì)列
中。仔細(xì)閱讀PspSelectNextThread函數(shù)這個(gè)花括號(hào)中的源代碼,理解這些源代
碼是如何改變線程狀態(tài)的,并與PspReadyThread函數(shù)中的源代碼進(jìn)行比較,說(shuō)明這兩
段源代碼的異同,體會(huì)為什么在這里不能直接調(diào)用PspReadyThread函數(shù)。
4.線程由就緒狀態(tài)進(jìn)入運(yùn)營(yíng)狀態(tài)
(1)按F5繼續(xù)執(zhí)行,在PspUnreadyThread函數(shù)中的斷點(diǎn)處中斷。在快速監(jiān)
視對(duì)話框中查看“*Thread”表達(dá)式的值。其中State域的值為1(Ready),雙向鏈表
項(xiàng)StateListEntry的Next和Prev指針的值都不為0,說(shuō)明這個(gè)線程處在就緒狀
態(tài),并在優(yōu)先級(jí)為24的就緒隊(duì)列中;StartAddr域的值為lopConsoleD
ispatchThread,說(shuō)明這個(gè)線程就是控制臺(tái)派遣線程。
(2)關(guān)閉快速監(jiān)視對(duì)話框后,在“調(diào)用堆?!贝翱谥屑せ頟spSelectNextThread
函數(shù)相應(yīng)的堆棧項(xiàng),可以看到在PspSelectNextThread函數(shù)中已經(jīng)將PspCurre
ntThread全局指針指向了控制臺(tái)派遣線程,并在調(diào)用PspUnreadyThread函數(shù)
后,將當(dāng)前線程的狀態(tài)改成了Running。
(3)在“調(diào)用堆棧”窗口中激活PspUnreadyThread函數(shù)相應(yīng)的堆棧項(xiàng),然后
按F10單步調(diào)試,直到返回PspSe1ectNextThread函數(shù)并將線程狀態(tài)修改為Run
ning。再?gòu)目焖俦O(jiān)視對(duì)話框中查看“*PspCurrentThread”表達(dá)式的值,觀測(cè)當(dāng)
前占用解決器的線程的情況。其中State域的值為2(Running),雙向鏈表項(xiàng)State
ListEntry的Next和Prev指針的值都為0,說(shuō)明控制臺(tái)派遣線程己經(jīng)處在運(yùn)營(yíng)
狀態(tài)了。接下來(lái),會(huì)將該線程的上下文從線程控制塊(TCB)復(fù)制到解決器的各個(gè)寄存器
中,解決器就可以從該線程上次停止運(yùn)營(yíng)的位置繼續(xù)運(yùn)營(yíng)
5.線程由運(yùn)營(yíng)狀態(tài)進(jìn)入阻塞狀態(tài).
(1)按F5繼續(xù)執(zhí)行,在PspWait函數(shù)中的斷點(diǎn)處中斷。在快速監(jiān)視對(duì)話框
中查看“*PspCurrentThread”表達(dá)式的值,觀測(cè)當(dāng)前占用解決器的線程的情況。
其中State域的值為2(Running),雙向鏈表項(xiàng)StateListEntry的Next和P
rev指針的值都為0,說(shuō)明這個(gè)線程仍然處在運(yùn)營(yíng)狀態(tài);StartAddr域的值為lopC
onso1eDispatchThread,說(shuō)明這個(gè)線程就是控制臺(tái)派遣線程。
(2)按F10單步調(diào)試,直到左側(cè)的黃色箭頭指向代碼第248行。再?gòu)目焖俦O(jiān)視對(duì)話
框中查看"*PspCurrentThread"表達(dá)式的值。其中State域的值為3(Wai
ting),雙向鏈表項(xiàng)StateListEntry的Next和Prev指針的值都不為0,說(shuō)明控
制臺(tái)派遣線程已經(jīng)處在阻塞狀態(tài)了,并在某個(gè)同步對(duì)象的等待隊(duì)列中。第248行代碼可
以觸發(fā)線程調(diào)度功能,會(huì)中斷執(zhí)行當(dāng)前已經(jīng)處在阻塞狀態(tài)的控制臺(tái)派遣線程,并將解決
器上下文保存到該線程的線程控制塊。
2.2為線程增長(zhǎng)掛起狀態(tài)的實(shí)現(xiàn)
(給出實(shí)現(xiàn)方法的簡(jiǎn)要描述、源代碼、測(cè)試和結(jié)果等)
1.為線程增長(zhǎng)掛起狀態(tài)
(1)刪除之前添加的所有斷點(diǎn)。
(2)按F5啟動(dòng)調(diào)試。
(3)待EOS啟動(dòng)完畢,在EOS控制臺(tái)中輸入命令“l(fā)oop”后按回車(chē)。此時(shí)可以看到
loop線程的執(zhí)行計(jì)數(shù)在不斷增長(zhǎng),說(shuō)明loop線程正在執(zhí)行。記錄下1oop線程的ID。
(4)按Ctr1+F2切換到控制臺(tái)2,輸入命令"suspend31"(假如loop線
程的ID是31)后按回車(chē)。命令執(zhí)行成功的結(jié)果如下圖所示。
(5)按Ct門(mén)+1切換回控制臺(tái)1,可以看到由于1oop線程已經(jīng)成功被掛起,其執(zhí)行計(jì)
數(shù)已經(jīng)停止增長(zhǎng)了。此時(shí)占用解決器的是EOS中的空閑線程。
2.完畢Resume原語(yǔ)后,可以先使用suspend命令掛起1oop線程,然后在控制臺(tái)2
中輸入命令"Resume31"(假如1。op線程的ID是31)后按回車(chē)。命令執(zhí)行成功
的結(jié)果如下圖所示。假如切換回控制臺(tái)1后,發(fā)現(xiàn)loop線程的執(zhí)行計(jì)數(shù)恢復(fù)增長(zhǎng)就說(shuō)
明Resume原語(yǔ)可以正常工作。
OSLabPC-licrosoftVirtualPC2007,|-|x|
ActionEditCDFloppyHelp
COMSOLE-Z(PressCtrl+F1^F8toswitchconsoleuindow...)
UelcometoEOSshell
>suspend31
Suspendthread(31)success.
>resume31
Resumethread(31)success.
設(shè)計(jì)代碼
STATUS
PsResumThread(
INHANDLEhThread
°)
(
STATUSStatus;
BOOLIntState;
PTHREADThread;
Status=ObRefObjectByHandie(hThread,PspThreadType,
(PVOID*)&Thread);
-if(EOS_SUCCESS(Status)){
“IntState=KeEnablelnterrupts(FALSE);〃關(guān)中斷
。if(Zero==Thread->State){
sListRemoveEntry(&Thread->StateListEntry);
ee66PspReadyThread(Thread);
。“oPspThreadSchedu1e();
““Status=STATUS_SUCCESS;
}e1se{
Status=STATUS_NOT_SUPPORTED;
600}
KeEnab1elnterrupts(IntState);//開(kāi)中斷
。ObDerefObject(Thread);
0}
returnStatus;
}
1.一方面調(diào)用ListRemoveEntry函數(shù)將線程從掛起線程隊(duì)列中移除。
2.然后調(diào)用PspReadyThread函數(shù)將線程恢復(fù)為就緒狀態(tài)。
3.最后調(diào)用PspThreadSchedule宏函數(shù)執(zhí)行線程調(diào)度,讓剛剛恢復(fù)的線程有機(jī)會(huì)執(zhí)
行。
3其他需要說(shuō)明的問(wèn)題
€實(shí)驗(yàn)二進(jìn)程的同步(7分)
1實(shí)驗(yàn)?zāi)康暮鸵?guī)定
目的:理解進(jìn)程同步的原理和意義,掌握信號(hào)量的實(shí)現(xiàn)方法和應(yīng)用。
規(guī)定:
(1)使用EOS的信號(hào)量,實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題;
(2)跟蹤調(diào)試EOS信號(hào)量的工作過(guò)程,分析EOS信號(hào)量實(shí)現(xiàn)的源代碼;
(3)修改EOS信號(hào)量的實(shí)現(xiàn)代碼,使之支持等待超時(shí)喚醒和批量釋放功能。
2完畢的實(shí)驗(yàn)內(nèi)容
2.1使用EOS的信號(hào)量實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問(wèn)題
(簡(jiǎn)要說(shuō)明使用EOS的信號(hào)量解決生產(chǎn)者一消費(fèi)者問(wèn)題的實(shí)現(xiàn)方法;給出在本部分實(shí)臉
過(guò)程中完畢的重要工作,涉及調(diào)試、跟蹤、測(cè)試與思考等)
EOS使用CreateThread函數(shù)創(chuàng)建線程,使用CreateMutex^Creates
emaphore創(chuàng)建信號(hào)量。WaitForSingleObject與ReieaseMutex>Re1ea
seSemaphore函數(shù)相稱于P、V原語(yǔ)。
設(shè)計(jì)思緒和流程圖:
按照下面的環(huán)節(jié)查看生產(chǎn)者-消費(fèi)者同步執(zhí)行的過(guò)程:
1.使用pc.c文獻(xiàn)中的源代碼,替換之前創(chuàng)建的EOS應(yīng)用程序項(xiàng)目中EOSApp.
c文獻(xiàn)內(nèi)的源代碼。
2.按F7生成修改后的EOS應(yīng)用程序項(xiàng)目。
3.按F5啟動(dòng)調(diào)試。OSLab會(huì)一方面彈出一個(gè)調(diào)試異常對(duì)話框。
4.在調(diào)試異常對(duì)話框中選擇“否”,繼續(xù)執(zhí)行。
5.立即激活虛擬機(jī)窗口查看生產(chǎn)者一消費(fèi)者同步執(zhí)行的過(guò)程,如圖(3-2o
6.待應(yīng)用程序執(zhí)行完畢后,結(jié)束本次調(diào)試。
1.Mutex、Empty、Fu11三個(gè)信號(hào)量的初始值分別為1、10、0,當(dāng)存在一個(gè)生產(chǎn)者線
程訪問(wèn)緩沖池時(shí),一方面對(duì)Empty減1,假如大于0,則說(shuō)明尚有剩余緩沖區(qū)可以讓生產(chǎn)
者放入產(chǎn)品,否則生產(chǎn)者線程進(jìn)入等待隊(duì)列;再對(duì)Mutex減1,假如大于等于0,則說(shuō)
明沒(méi)有線程占用緩沖池,否則生產(chǎn)者線程進(jìn)入等待隊(duì)列。生產(chǎn)完產(chǎn)品后,對(duì)Mutex加
1,解除封鎖;再對(duì)Full加1,說(shuō)明生產(chǎn)了一個(gè)產(chǎn)品占用了一個(gè)緩沖區(qū)。消費(fèi)者線程同理,
對(duì)信號(hào)量的操作順序與生產(chǎn)者線程相反。不能對(duì)這三個(gè)同步對(duì)象的操作改變順序,否則
也許導(dǎo)致死鎖。
2.由于臨界資源的訪問(wèn)限制,程序中限定了緩沖池的大小為10,只有緩沖池有空余時(shí)
生產(chǎn)者才干向里邊放產(chǎn)品,同時(shí)只有緩沖池有產(chǎn)品時(shí)消費(fèi)者才干向外取東西。當(dāng)生產(chǎn)者
生產(chǎn)了13號(hào)產(chǎn)品后,共生產(chǎn)了從0到13的14個(gè)產(chǎn)品,但是只消費(fèi)了從0至IJ3的4個(gè)產(chǎn)
品,所以緩沖池中的10個(gè)緩沖區(qū)就都被占用了,所以不能繼續(xù)生產(chǎn)14號(hào)產(chǎn)品,而要等到
消費(fèi)者消費(fèi)掉一個(gè)產(chǎn)品后,緩沖池有空余位置,才干繼續(xù)生產(chǎn)14號(hào)產(chǎn)品。當(dāng)生產(chǎn)者線程
生產(chǎn)了13號(hào)產(chǎn)品后,此時(shí)FulI信號(hào)量的值為10,而Empty信號(hào)量的值為0,此時(shí)若生產(chǎn)
者線程要再生產(chǎn)一個(gè)產(chǎn)品,先對(duì)Empty減1,此時(shí)Empty值小于零,生產(chǎn)者線程進(jìn)入等
待隊(duì)列;而此時(shí)若有一個(gè)消費(fèi)者線程要消費(fèi)一個(gè)產(chǎn)品,先對(duì)Full減1,此時(shí)Full值為9,
大于0,假如沒(méi)有線程占用緩沖池,消費(fèi)者可以消費(fèi)一個(gè)產(chǎn)品。這樣,生產(chǎn)者和消費(fèi)者就
能實(shí)現(xiàn)同步過(guò)程了。
2.2EOS信號(hào)量工作過(guò)程的跟蹤與源代碼分析
(分析EOS信號(hào)量實(shí)現(xiàn)的核心源代碼,簡(jiǎn)要闡述其實(shí)現(xiàn)方法;給出在本部分實(shí)驗(yàn)過(guò)程中
完畢的重要工作,涉及調(diào)試、跟蹤與思考等)
EOS的P、V原語(yǔ)實(shí)現(xiàn)是PsWaitForSemaphore、PsReieaseSemaphor
e,這兩個(gè)函數(shù)使用KeEnableInterrupts開(kāi)關(guān)中斷來(lái)實(shí)現(xiàn)原語(yǔ)操作。
PsWaitForSemaphore流程圖:
PsRe1easeSemaphore函數(shù)的流程圖:
2.3支持等待超時(shí)喚醒和批量釋放功能的EOS信號(hào)量實(shí)現(xiàn)
(給出實(shí)現(xiàn)方法的簡(jiǎn)要描述、源代碼、測(cè)試和結(jié)果等)
修改PsWaitForSemaphore函數(shù),先用計(jì)數(shù)值和0比較,當(dāng)計(jì)數(shù)值大于
0時(shí),將計(jì)數(shù)值減1后直接返回成功;當(dāng)計(jì)數(shù)值等于0時(shí),調(diào)用PspWait函數(shù)阻塞
線程的執(zhí)行(將參數(shù)MiHiseconds做為PspWait函數(shù)的第二個(gè)參數(shù),并使用Ps
pWait函數(shù)的返回值做為返回值)。
修改PsWaitForSemaphore函數(shù)如下添加支持超時(shí)。
STATUS
PsWaitForSemaphore(
INPSEMAPHORESemaphore,
INULONGMil1iseconds
)
BOOLIntState;
ASSERT(KeGetIntNestingO0);
IntState=KeEnablelnterrupts(FALSE);
STATUSret;
if(Semaphore->Count>0){
Semaphore->Count-
ret=STATUS_SUCCESS;
}else{
ret=PspWait(&Semaphore—>WaitListHead9Millisecond
s);
}
KeEnableinterrupts(IntState);/
returnret;
)
修改PsReleaseSemaphore函數(shù)如下添加批量釋放支持。
STATUS
PsReleaseSemaphore(
INPSEMAPHORESemaphore,
4NLONGRe1easeCount,
oOUTPLONGPreviousCount
6)
(
oSTATUSStatus;
B0OLIntState;
IntState=KeEnablelnterrupts(FALSE);
if(Semaphore—>Count+ReleaseCount>Semaphore->Maximum
Count){
?Status=STATUS_SEMAPHORE_LIMIT_EXCEEDED;
)else(
if(NULL!=PreviousCount){
o*PreviousCount=Semaphore->Count;
00)
fi6inti;
for(i=ReleaseCount;i—;){
。Semaphore->Count++;
gif(Semaphore—>Count<=0){
。PspWakeThread(&Semaphore->WaitListHead,
STATUS_SUCCESS);
do}
gPspThreadSchedule();
Status=STATUS_SUCCESS;
。}
KeEnablelnterrupts(IntState);
returnStatus;
3其他需要說(shuō)明的問(wèn)題
實(shí)驗(yàn)三時(shí)間片輪轉(zhuǎn)調(diào)度(5分)
1實(shí)驗(yàn)?zāi)康暮鸵?guī)定
目的:理解進(jìn)程(線程)調(diào)度的執(zhí)行時(shí)機(jī)和過(guò)程,掌握調(diào)度程序?qū)崿F(xiàn)的基本方法。
規(guī)定:
(1)跟蹤調(diào)試EOS的線程調(diào)度程序,分析EOS基于優(yōu)先級(jí)的搶占式調(diào)度的源代碼;
(2)修改EOS的調(diào)度程序,添加時(shí)間片輪轉(zhuǎn)調(diào)度。
2完畢的實(shí)驗(yàn)內(nèi)容
2.1EOS基于優(yōu)先級(jí)的搶占式調(diào)度工作過(guò)程的跟蹤與源代碼分析
(分析E。S基于優(yōu)先級(jí)的搶占式調(diào)度的核心源代碼,簡(jiǎn)要闡述其實(shí)現(xiàn)方法;給出在本
部分實(shí)臉過(guò)程中完畢的重要工作,涉及調(diào)試、跟蹤與思考等)
實(shí)驗(yàn)使用EOS提供的rr命令觀測(cè)時(shí)間片的輪轉(zhuǎn)。
1.準(zhǔn)備實(shí)驗(yàn)
(1)啟動(dòng)OSLab?
(2)新建一個(gè)EOSKernel項(xiàng)目。
2.閱讀控制臺(tái)命令“rr”相關(guān)的源代碼
(1)按F7生成在本實(shí)驗(yàn)3.1中創(chuàng)建的EOSKerne1項(xiàng)目。
(2)按F5啟動(dòng)調(diào)試。
(3)待EOS啟動(dòng)完畢,在E0S控制臺(tái)中輸入命令“rr”后按回車(chē)。
OSLabPC-licrosoftVirtualPC如07-|D|x|
ActionEditCDFloppyHelp
CONSOLE-1(PressCtrl+F1~F8toswitchconsolewindow...)
Thread0(8):49740
3.調(diào)試線程調(diào)度程序
a)調(diào)試當(dāng)前線程不被搶先的情況
(1)結(jié)束之前的調(diào)試。
(2)在ke/sysproc.c文獻(xiàn)的ThreadFunction函數(shù)中,調(diào)用fprintf函數(shù)的代碼行
(第680行)添加一個(gè)斷點(diǎn)。
(3)按F5啟動(dòng)調(diào)試。
(4)待EOS啟動(dòng)完畢,在EOS控制臺(tái)中輸入命令“rr”后按回車(chē)?!皉r”命令開(kāi)始執(zhí)行
后,會(huì)在斷點(diǎn)處中斷。
(5)查看ThreadFunction函數(shù)中變量pThreadParameter->Y的值應(yīng)當(dāng)為0,說(shuō)明正在
調(diào)試的是第0個(gè)新建的線程。
(6)激活虛擬機(jī)窗口,可以看到第0個(gè)新建的線程還沒(méi)有在控制臺(tái)中輸出任何內(nèi)容,因素
是fprintf函數(shù)還沒(méi)有執(zhí)行。
(7)激活OSLab窗口后按F5使第0個(gè)新建的線程繼續(xù)執(zhí)行,又會(huì)在斷點(diǎn)處中斷。再
次激活虛擬機(jī)窗口,可以看到第0個(gè)新建的線程已經(jīng)在控制臺(tái)中輸出了第一輪循環(huán)的內(nèi)
容??梢远喟磶状蜦5查看每輪循環(huán)輸出的內(nèi)容。
b)調(diào)試當(dāng)前線程被搶先的情況
(1)選擇“調(diào)試”菜單中的“刪除所有斷點(diǎn)”,刪除之前添加的所有斷點(diǎn)。
(2)在ps/sched.c文獻(xiàn)的PspSelectNextThread函數(shù)的第395行添加一個(gè)斷
點(diǎn)。
(3)按F5繼續(xù)執(zhí)行,激活虛擬機(jī)窗口,可看到第0個(gè)新建的線程正在執(zhí)行。
(4)在虛擬機(jī)窗口中按下一次空格鍵,EOS會(huì)在之前添加的斷點(diǎn)處中斷。
(5)在“監(jiān)視”窗口中查看就緒位圖的值為1,說(shuō)明此時(shí)在優(yōu)先級(jí)為24的就緒隊(duì)列中
存在就緒線程。在“監(jiān)視”窗口中添加表達(dá)式“ListGetCount(&PspReadyLi
stHeads[24])”,其值為1,說(shuō)明優(yōu)先級(jí)為24的就緒隊(duì)列中只有一個(gè)就緒線程。掃描
就緒位圖后獲得的最高優(yōu)先級(jí)的值HighestPri。rity也就應(yīng)當(dāng)是24。
(6)按Fl0單步調(diào)試一次,執(zhí)行的語(yǔ)句會(huì)將當(dāng)前正在執(zhí)行的第0個(gè)新建的線程,放入優(yōu)
先級(jí)為8的就緒隊(duì)列的隊(duì)首?!氨O(jiān)視”窗口中顯示的優(yōu)先級(jí)為8的就緒隊(duì)列中的線程數(shù)
量就會(huì)增長(zhǎng)1,變?yōu)?0。
(7)繼續(xù)按F10單步調(diào)試,直到在第444行中斷執(zhí)行,注意觀測(cè)線程調(diào)度執(zhí)行的每一
個(gè)環(huán)節(jié)。此時(shí),正在執(zhí)行的第0個(gè)新建的線程已經(jīng)進(jìn)入了“就緒”狀態(tài),讓出了CPU。
線程調(diào)度程序接下來(lái)的工作就是選擇優(yōu)先級(jí)最高的非空就緒隊(duì)列的隊(duì)首線程作為當(dāng)前運(yùn)
營(yíng)線程,也就是讓優(yōu)先級(jí)為24的線程在CPU上執(zhí)行。
(8)按F10單步調(diào)試一次,當(dāng)前線程PspCurrentThread指向了優(yōu)先級(jí)為24
的線程??梢栽凇翱焖俦O(jiān)視”窗口中查看表達(dá)式“*PspCurrentThread”的值,注意
線程控制塊中StartAddr域的值為lopConso1eDispatchThread函數(shù)(在文
獻(xiàn)i。/conso1e.c中定義),說(shuō)明這個(gè)優(yōu)先級(jí)為24的線程是控制臺(tái)派遣線程。
(9)繼續(xù)按F10單步調(diào)試,直到在PspSe1ectNextThread函數(shù)返回前(第465行)
中斷執(zhí)行,注意觀測(cè)線程調(diào)度執(zhí)行的每一個(gè)環(huán)節(jié)。此時(shí),優(yōu)先級(jí)為24的線程己經(jīng)進(jìn)入了
“運(yùn)營(yíng)”狀態(tài),在中斷返回后,就可以開(kāi)始執(zhí)行了。在“監(jiān)視”
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版星巴克加盟店設(shè)備維護(hù)合同
- 個(gè)人影視作品版權(quán)轉(zhuǎn)讓合同(2024版)3篇
- 2024示范文本:二手車(chē)買(mǎi)賣(mài)合同車(chē)輛安全檢測(cè)規(guī)范2篇
- 2024試乘試駕活動(dòng)電子合同范本12篇
- 2025年度二手吊車(chē)評(píng)估與交易中介合同3篇
- 項(xiàng)目建議書(shū)(含設(shè)計(jì)任務(wù)書(shū))及可行性研究報(bào)告編制技術(shù)咨詢合同模板
- 2025年度碼頭船舶??颗c貨物倉(cāng)儲(chǔ)一體化租賃合同4篇
- 2025年度臨時(shí)醫(yī)療護(hù)理人員派遣服務(wù)合同4篇
- 2025年稅務(wù)顧問(wèn)服務(wù)合同協(xié)議書(shū)適用于企業(yè)集團(tuán)6篇
- 眾維重工2025年度鋼結(jié)構(gòu)建筑工程智能化控制系統(tǒng)采購(gòu)合同2篇
- 《穿越迷宮》課件
- 《C語(yǔ)言從入門(mén)到精通》培訓(xùn)教程課件
- 2023年中國(guó)半導(dǎo)體行業(yè)薪酬及股權(quán)激勵(lì)白皮書(shū)
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動(dòng)車(chē)棚新(擴(kuò))建及修建充電車(chē)棚施工方案(純方案-)
- 項(xiàng)目推進(jìn)與成果交付情況總結(jié)與評(píng)估
- 鐵路項(xiàng)目征地拆遷工作體會(huì)課件
- 醫(yī)院死亡報(bào)告年終分析報(bào)告
- 建設(shè)用地報(bào)批服務(wù)投標(biāo)方案(技術(shù)方案)
- 工會(huì)工作人年度考核個(gè)人總結(jié)
- 上海民辦楊浦實(shí)驗(yàn)學(xué)校初一新生分班(摸底)語(yǔ)文考試模擬試卷(10套試卷帶答案解析)
評(píng)論
0/150
提交評(píng)論