2023年計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第1頁(yè)
2023年計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第2頁(yè)
2023年計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第3頁(yè)
2023年計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第4頁(yè)
2023年計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩15頁(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)介

操作系統(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論