版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
華先電力#號(hào)課程設(shè)計(jì)(綜合實(shí)驗(yàn))報(bào)告(2023--2023年度第一學(xué)期)名稱:操作系統(tǒng)綜合實(shí)驗(yàn)題目:OSlab綜合實(shí)驗(yàn)院系:計(jì)算機(jī)系班級(jí):計(jì)科1202學(xué)號(hào):學(xué)生姓名:指導(dǎo)教師:趙文清王新奇設(shè)計(jì)周數(shù):第八、九周成績(jī):日期:2023年10月29日3.使用低優(yōu)先級(jí)線程也能獲得執(zhí)行機(jī)會(huì)的調(diào)度算法:在ke/sysproc.c文獻(xiàn)中的ConsoleCmdRoundRobin函數(shù)調(diào)用Sleep函數(shù)語句的后面添加下面的語言,即可以演優(yōu)先級(jí)線程搶占解決器后,低優(yōu)先級(jí)線程無法運(yùn)營(yíng)的情況,待高優(yōu)先級(jí)線程結(jié)束后,低優(yōu)先級(jí)線程才可以繼續(xù)運(yùn)營(yíng)。HANDLEThreadHandie;THREAD_PARAMETERThreadParameter;_asm("cli");ThreadParameter.Y=20;ThreadParameter.StdHandle=StdHandle;ThreadParameter=(HANDLE)CreatcThread{0,ThreadFunction,(PVOID)&ThreadParameter,0,NULL);PsSetThreadPi'iority(ThreeadHandie,9);_asm(“sti”);Slecp(10*1000);TerminateThread(ThreadHandle,0);CloseHandle(ThreadHand1e);Sleep(10*1000);解決該問題的最簡(jiǎn)樸的方法是實(shí)現(xiàn)動(dòng)態(tài)優(yōu)先級(jí)算法。動(dòng)態(tài)優(yōu)先級(jí)是指在創(chuàng)建進(jìn)程時(shí)所賦予的優(yōu)先級(jí),可以隨線程的推動(dòng)而改變,以便獲得良好的調(diào)度性能。例如,可用規(guī)定,在就緒隊(duì)列中的線程,隨著其等待時(shí)間的增長(zhǎng),其優(yōu)先級(jí)以速率X增長(zhǎng),并且正在執(zhí)行的線程,其優(yōu)先級(jí)以速率y下降。這樣,在各個(gè)線程具有不同優(yōu)先級(jí)的情況下,對(duì)于優(yōu)先級(jí)低的線程,在等待足夠的時(shí)間后,其優(yōu)先級(jí)便也許升為最高,從而獲得被執(zhí)行的機(jī)會(huì)。此時(shí),在基于優(yōu)先級(jí)的搶占式調(diào)度算法、時(shí)間片輪轉(zhuǎn)調(diào)度算法和動(dòng)態(tài)優(yōu)先級(jí)算法的共同作用下,可防止一個(gè)高優(yōu)先級(jí)的長(zhǎng)作業(yè)長(zhǎng)期的壟斷解決器。4.EOS內(nèi)核時(shí)間片大小取60ms(和Wind。ws操作系統(tǒng)完全相同),在線程比較多時(shí),就可以觀測(cè)出線程輪流執(zhí)行的情況(由于此時(shí)一次輪轉(zhuǎn)需要60ms,20個(gè)線程輪流執(zhí)行一次需要60X20=1200ms,也就是需要1秒多的時(shí)間,所以EOS的控制臺(tái)上可以清楚地觀測(cè)到線程輪流執(zhí)行的情況)。但是在Windows、Linux等操作系統(tǒng)啟動(dòng)后,正常情況下都有上百個(gè)線程在并發(fā)執(zhí)行,為什么覺察不到它們被輪流執(zhí)行,并且每個(gè)程序都運(yùn)營(yíng)的很順利呢?答:在Windows、linux等操作系統(tǒng)中,雖然都提供了時(shí)間片輪轉(zhuǎn)調(diào)度算法卻很少真正被派上用場(chǎng),下面解釋因素,在Windows任務(wù)管理器中,即使系統(tǒng)中已經(jīng)運(yùn)營(yíng)了數(shù)百個(gè)線程,但CPU的運(yùn)用率仍然很低,甚至為0.由于這些線程在大部分時(shí)間都處在阻塞狀態(tài),阻塞的因素是各種各樣的,最重要的因素是等待I/O完畢或者等待命令消息的到達(dá)。例如,在編輯Word文檔時(shí),每敲擊一次鍵盤,Kord就會(huì)立即作出反映,并且文檔中插入字符。此時(shí)會(huì)感覺Word運(yùn)營(yíng)的非常流暢。事實(shí)上,并非如此,Word主線程大部分時(shí)間都處在阻塞等待狀態(tài),等待用戶敲擊鍵盤。在用戶沒有敲擊鍵盤或沒有使用鼠標(biāo)點(diǎn)擊時(shí),Nord主線程處在阻塞狀態(tài),它將讓出解決器給其它需要的線程。當(dāng)用戶敲擊一個(gè)按鍵后,Word主線程將會(huì)立刻被操作系統(tǒng)喚醒,此時(shí)Word開始解決請(qǐng)求。Word在解決輸入請(qǐng)求時(shí)所用的CPU時(shí)間是非常短的(由于CPU非??欤?,是微秒級(jí)的,遠(yuǎn)遠(yuǎn)低于時(shí)間片輪轉(zhuǎn)調(diào)度的時(shí)間片大?。╓indows下是60亳秒),解決完畢后W。rd又立刻進(jìn)入阻塞狀態(tài),等待用戶下一次敲擊鍵盤。或者拿音樂播放器來分析,表面上感覺播放器在不斷地播放音樂,但是CPU的運(yùn)用率仍然會(huì)很低。這是由于播放器將一段聲音編碼交給聲卡,由聲卡來播放,在聲卡播放完這段聲音之前,播放器都是處在阻塞等待狀態(tài)的。當(dāng)聲卡播放完片段后,播放器將被喚醒,然后它將下一個(gè)聲音片段交給聲卡繼續(xù)播放。掌握了上面的知識(shí)后,就可以很容易解釋為什么這么多線程同時(shí)在運(yùn)營(yíng)而一點(diǎn)都感覺不到輪替現(xiàn)象。實(shí)驗(yàn)7物理存儲(chǔ)器與進(jìn)程邏輯地址空間的管理一、實(shí)驗(yàn)?zāi)康耐ㄟ^杳看物理存儲(chǔ)器的使用情況,并練習(xí)分派和回收物理內(nèi)存,從而掌握物理存儲(chǔ)器的管理方法。通過杳看進(jìn)程邏輯地址空間的使用情況,并練習(xí)分派和1口|收虛擬內(nèi)存,從而掌握進(jìn)程邏輯地址空間的管理方法。二、實(shí)驗(yàn)內(nèi)容1、準(zhǔn)備實(shí)驗(yàn)2、閱讀控制臺(tái)命令“pm”相關(guān)的源代碼,并查看其執(zhí)行的結(jié)果(pm命令的執(zhí)行結(jié)果)3、分派物理頁和釋放物理頁(配物理頁或者釋放物理頁后物理存儲(chǔ)器的變化情況)4、閱讀控制臺(tái)命令“vni”相關(guān)的源代碼,并查看其執(zhí)行的結(jié)果使用“vm”命令查看系統(tǒng)進(jìn)程虛擬地址描述符的結(jié)果5、在系統(tǒng)進(jìn)程中分派虛擬頁和釋放虛擬頁6、在應(yīng)用程序進(jìn)程中分派虛擬頁和釋放虛擬頁三、問題答案及參考代碼INT*d;aif(d=Virtua1A11oc(0,sizeof(int),MEMRESERVE|MEM.COMMIT)){//調(diào)用API函數(shù)VirtualAl1oc,分派一個(gè)整型變量所需的空間,并使用一個(gè)整型變顯的指針指向這個(gè)空間printf("Al1ocated%dbytesvirtua1memoryofOx%x\n\n”,sizeof(int),d);printfCvirtualmemoryoriginalvalue:Ox%x\n\n〃,*d);*d=OxFFFFFFFF;//修改整型變量的值為OxFFFFFFFFprintf(uvirtualmemorynewvalue:0x%x\n\nz,,*d);printf(,z\nWaitfor10seconds\n"):Sleop(lOOOO);//調(diào)用API函數(shù)Sleep,等待10秒鐘。if(VirtualFree(d,0,MEM_RELEASE))//調(diào)用API函數(shù)VirtualFree,ft放之前分派的整型變量的空間printf("\nRealeasevirtualmemorysuccess!\n");aelseaprintf(z,realeaseerror\n");printfC\nEndlessloop!");afor;
e1seaprintf("error\n");areturnT;〃若不能成功分派,打印出crror,返回T.a}aprintf("HolloworId!\n");ae1seaprintf("error\n");aretur.在本實(shí)驗(yàn)3.3中,假如分派了物理頁后,沒有回收,會(huì)對(duì)EOS操作系統(tǒng)導(dǎo)致什么樣的影響?目前EOS操作系統(tǒng)內(nèi)核函數(shù)MiAllocateAnyPages能解決所有物理頁被分派完畢的情況嗎?例如在沒有可分派的物理頁的情況下調(diào)用該內(nèi)核函數(shù),是否會(huì)返回失敗?假如內(nèi)核函數(shù)MiAllocateAnyPages還不能解決這種極端情況,嘗試修改代碼解決這個(gè)問題。答:假如分派了物理頁后沒有回收,EOS操作系統(tǒng)將不能再使用未回收的物理頁,假如分派的物理頁都沒有進(jìn)行剛攵也許會(huì)導(dǎo)致EOS沒有可用的物理貝,從而導(dǎo)致EOS停止運(yùn)營(yíng)。目前E0S操作系統(tǒng)內(nèi)核函數(shù)MiAl1ocateAnyPages還沒有解決沒有物理頁可分派的情況。.在本實(shí)驗(yàn)3.3中,在分派物理頁時(shí)是調(diào)用的內(nèi)核函數(shù)MiAl1ocateAnyPages,該函數(shù)會(huì)優(yōu)先分派空閑頁,嘗試修改代碼,調(diào)用內(nèi)核函數(shù)MiAl1ocateZeroedPages優(yōu)先分派零頁,并調(diào)試分派零頁的情況。嘗試從性能的角度分析內(nèi)核函數(shù)MiA1locateAnyPages和MiA1locateZeroedPages0嘗試從安全性的角度分析分派零頁的必要性。答:從性能的角度來分析,調(diào)用MIAU。cateAnyPages函數(shù)分派物理頁在某些情況下比調(diào)用MiAllocateZerocdPagos.函數(shù)要快速。從安全行的角度來分析,分派零頁更加安全。例如,一個(gè)物理頁被操作系統(tǒng)存儲(chǔ)過重要的密碼信息后被釋放,假如沒有清零就被分派給用戶程序,則用戶程序就也許從這個(gè)物理頁中獲得重要的密碼信息。.觀測(cè)本實(shí)驗(yàn)3.4中使用“vm”命令輸出的系統(tǒng)進(jìn)程的虛擬地址描述符(圖15-3),可以看到在2號(hào)描述符和3號(hào)描述符之間有兩個(gè)虛擬頁的空隙,嘗試結(jié)合虛擬頁的分派和釋放說明產(chǎn)生這個(gè)空隙的因素。答:產(chǎn)生的空隙是由于有虛擬頁被釋放導(dǎo)致的,在EOS啟動(dòng)時(shí)有一個(gè)初始化線程在初始化完畢后就退出了,線程的堆棧所占用的虛擬頁就被釋放了。5.在本實(shí)驗(yàn)3.5中,調(diào)用MmA1locateVirtuaIMemory函數(shù)分派虛擬頁時(shí)只使用了MEM_RESERVE標(biāo)志,沒有使用MEM_COM\IIT標(biāo)志,嘗試說明這兩個(gè)標(biāo)志的區(qū)別。修改代碼,在調(diào)用MmAl1ocateVirtualMemory函數(shù)時(shí)增長(zhǎng)使用MEM_COMM1T標(biāo)志,并調(diào)試為虛擬頁映射物理頁的過程。答:使用MEM_RESERVE標(biāo)志分派虛擬頁時(shí),沒有為其映射實(shí)際的物理頁。使用MEM_COMUIT表達(dá)分派虛擬頁時(shí),會(huì)為其映射實(shí)際的物理頁。實(shí)驗(yàn)8分頁存儲(chǔ)器管理一、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)i386解決器的二級(jí)貞表硬件機(jī)制,理解分貝存儲(chǔ)器管理原理。查看EOS應(yīng)用程序進(jìn)程和系統(tǒng)進(jìn)程的二級(jí)頁表映射信息,理解頁目錄和頁表的管理方式。編程修改頁目錄和頁表的映射關(guān)系,理解分頁地址變換原理。二、實(shí)驗(yàn)內(nèi)容1、準(zhǔn)備實(shí)驗(yàn)2、查看EOS應(yīng)用程序進(jìn)程的頁目錄和頁表三、問題答案及參考代碼1.觀測(cè)之前輸出的頁目錄和頁表的映射關(guān)系,可以看到頁目錄的第Ox300個(gè)PDE映射的頁框號(hào)就是頁FI錄自身,說明頁目錄被復(fù)用為了頁表。而恰恰就是這種映射關(guān)系決定了4K的頁目錄映射在虛擬地址空間的0x0)300000—OxC0300FFF,4M的頁表映射在0XC0000000-0xC03FFFFF?,F(xiàn)在,假設(shè)修改了頁目錄,使其第0x100個(gè)PDE映射的頁框號(hào)是頁目錄自身,此時(shí)頁目錄和頁表會(huì)映射在4G虛擬地址空間的什么位置呢?說明計(jì)算方法。答:假設(shè)修改了頁目錄,使其第0x10()個(gè)PDE映射的頁框號(hào)是頁目錄自身,此時(shí)頁目錄和頁表會(huì)映射在4G虛擬地址空間的什么位置呢?說明計(jì)算方法。頁目錄:PDE標(biāo)號(hào)0x100做為虛擬地址的高10位,PTE標(biāo)號(hào)0x100做為虛擬地址的12-22位,得到虛擬地址0x40100000。頁表:PDE標(biāo)號(hào)0x100做為虛擬地址的高10位,PTE標(biāo)號(hào)0x0做為虛擬地址的12-22位,得到虛擬地址0x40000000。3.修改EOSApp.c中的源代碼,通過編程的方式記錄并輸出頁目錄和頁表的數(shù)目。注意頁目錄被復(fù)用為頁表答:編寫代碼將申請(qǐng)到的物理頁從二級(jí)頁表映射中移除,并讓內(nèi)核回收這些物理頁。參見源代碼文獻(xiàn)MapNcwPagcEx.c。使用該文獻(xiàn)中的ConsoleCmdMemoryMap函數(shù)替換ke/sysproc.c中的ConsoleCmdMemoryMap函數(shù)即可。在移除映射的物理頁時(shí),只需要將PTE/PDE的存在標(biāo)志位設(shè)立為0即可,要先修改PTE,再修改PDE。此外,要注意刷新快表。調(diào)用MiFreePages函數(shù)即可|可收物理頁,具體的用法可以參考其函數(shù)定義處的注釋和源代碼(mm/pfn1ist.c第248行)。.既然所有1024個(gè)頁表(共4M)映射在虛擬地址空間的OxC0000000-0xC03FFFFF,為什么不能從頁表基址0xC0000000開始遍歷,來查找有效的頁表呢?而必須先在頁目錄中查找有效的頁表呢?編寫代碼嘗試一下,看看會(huì)有什么結(jié)果。答:不能從頁表基址OxC0000000開始遍歷查找有效的頁表由于:只有當(dāng)一個(gè)虛擬地址通過二級(jí)頁表映射關(guān)系可以映射到實(shí)際的物理地址時(shí),該虛擬地址才可以被訪問,否則會(huì)觸發(fā)異常。由于并不是所有的頁表都有效,所以不能從頁表基址OxC000()000開始遍歷。.學(xué)習(xí)EOS操作系統(tǒng)內(nèi)核統(tǒng)一管理未用物理頁的方法(可以參考本書第6章的第6.5節(jié))。嘗試在本實(shí)驗(yàn)第3.5節(jié)中ConsoleCmdMemoryMap函數(shù)源代碼的基礎(chǔ)上進(jìn)行修改,將申請(qǐng)到的物理頁從二級(jí)頁表映射中移除,并讓內(nèi)核回收這些物理頁。參見源代碼文獻(xiàn)MapNewPagcEx.c。使用該文獻(xiàn)中的ConsoleCmdMemoryMap函數(shù)替換ke/sysproc.c中的ConsoleCmdMemoryMap函數(shù)即可。在移除映射的物理頁時(shí),只需要將PTE/PDE的存在標(biāo)志位設(shè)立為0即可,要先修改PTE,再修改PDE。調(diào)用UiFrccPages函數(shù)即可回收物理頁,具體的用法可以參考其函數(shù)定義處的注釋和源代碼(mm/pfn1ist.c第248行)。源代碼:ULONGPfnArray[2];//訪問未映射物理內(nèi)存的虛擬地址會(huì)觸發(fā)異常。//必須注釋或者刪除該行代碼才干執(zhí)行后面的代碼。//*((PINT)OxEOOOOOOO)=100;。。////從內(nèi)核申請(qǐng)兩個(gè)未用的物理頁。//由PfnArray數(shù)組返回兩個(gè)物理頁的頁框號(hào)。//MiA11ocateZeroedPages(2,PfnArray);OutputFormat="Newpageframenumber:0x%X,0x%X\n";fprintf(StdHandle,OutputFormat?PfnArray[0],PfnArray[1]);KdbPrint(OutputFormat,PfnArray[0],PfnArray[1]);////使用PfnArray[0]頁做為頁表,映射基址為OxE00000000的4M虛擬地址。//Index()fDirEntry=(0xE0000000?22);//虛擬地址的高10位是PDE標(biāo)號(hào)((PMMPTEHARDWARE)0xC0300000)[IndexOfDirEntry].PageFrameNumber=PfnArray[0];((PMMPTE_HARDWARE)OxC0300000)[IndexOfDirEntry].Valid=1;。//有效((PMMPTE_HARDWARE)OxC0300000)[IndexOfDirEntry].Writable=1;〃可寫MiFlushEntireT1b();<>//刷新快表//根據(jù)PDE的標(biāo)號(hào)計(jì)算其映射的頁表所在虛擬地址的基址//PagcTablcBase=0xCOOOO000+IndcxOfDirEntry*PAGESIZE;////將PfnArray[1]放入頁表PfnArray[0]的兩個(gè)PTE中,//分別映射基址為OxE0000000和OxE0001000的4K虛擬地址//IndexOfTab1eEntry=(0xE0000000>>12)&0x3FF;。//虛擬地址的12-22位是PTE標(biāo)號(hào)((PMMPTEHARDWARE)PageTableBasc)[IndexOfTableEntry].PageFrameNumber=PfnArmy[1];((PMMPTE_HARDWARE)PageTab1oBase)[IndexOfTab1eEntry].Va1id=1;。。〃有效((PMMPTE_HARDWARE)PageTab1eBase)[IndexOfTableEntry].Writab1e=1;//可寫MiFlushEntireTlbO;//刷新快表IndexOfTableEntry=(OxE0001000?12)&()x3FF〃虛擬地址的12-22位是PTE標(biāo)號(hào)((PMMPTEHARDWARE)PageTableBasc)[IndexOfTablcEntry].PagcFrameNumber=PfnArray[1];((PMMPTE_HARDWARE)PagcTab1eBase)[IndexOfTableEntry].Va1id=1;。//有效((PMMPTE_HARDWARE)PageTab1eBase)[IndexOfTableEntry].Writab1e=1;〃可寫MiF1ushEntireTlb();<>//刷新快表////測(cè)試//0utputFormat="RoadMemoryOxEOOOlOOO:%d\n”;fprintf(StdHandle,OutputFormat,*((PINT)OxEOOOlOOO));KdbPrint(OutputFormat,*((PINT)0xE0001000));*((PINT)OxEOOOOOOO)=100;//寫共享內(nèi)存fprintf(StdHandie,OutputFormat,*((PINT)0xE0001000));KdbPrint(OutputFormat,*((PINT)OxE0001000));7.思考頁式存儲(chǔ)管理機(jī)制的優(yōu)缺陷。答:優(yōu)點(diǎn):1、由于它不規(guī)定作業(yè)或進(jìn)程的程序段和數(shù)據(jù)在內(nèi)存中連續(xù)存放,從而有效地解決了碎片問題。2、動(dòng)態(tài)頁式管理提供了內(nèi)存和外存統(tǒng)一管理的虛存實(shí)現(xiàn)方式,使用戶可以運(yùn)用的存儲(chǔ)空間大大增長(zhǎng)。這既提高了主存的運(yùn)用紐,又有助于組織多道程序執(zhí)行。缺陷:1、規(guī)定有相應(yīng)的硬件支持。例如地址變換機(jī)構(gòu),缺頁中斷的產(chǎn)生和選擇淘汰頁面等都規(guī)定有相應(yīng)的硬件支持。這增長(zhǎng)了機(jī)器成本。2、增長(zhǎng)了系統(tǒng)開銷,例如缺頁中斷解決機(jī),3、請(qǐng)求調(diào)頁的算法如選擇不妥,有也許產(chǎn)生抖動(dòng)現(xiàn)象.4、雖然消除了碎片,但每個(gè)作業(yè)或進(jìn)程的最后一頁內(nèi)總有一部分空間得不到運(yùn)用果頁面較大,則這一部分的損失仍然較大。實(shí)驗(yàn)9串口設(shè)備驅(qū)動(dòng)程序一、實(shí)驗(yàn)?zāi)康恼{(diào)試EOS串口驅(qū)動(dòng)程序向串口發(fā)送數(shù)據(jù)的功能,了解設(shè)備驅(qū)動(dòng)程序的工作原理。為EOS串口驅(qū)動(dòng)程序添加從串口接受數(shù)據(jù)的功能,進(jìn)一步加深對(duì)設(shè)備驅(qū)動(dòng)程序工作原理的理解。二、實(shí)驗(yàn)內(nèi)容1準(zhǔn)備實(shí)驗(yàn)2練習(xí)使用EOS應(yīng)用程序向串口發(fā)送數(shù)據(jù)3調(diào)試EOS串口驅(qū)動(dòng)程序向串口發(fā)送數(shù)據(jù)的功能4為EOS串口驅(qū)動(dòng)程序添加從串口接受數(shù)據(jù)的功能CONSOLE-1(PressCtrl+F1~F8tosuitchconsolewindow...)UelcometoEOSshe11>serialThisprogramisusedtotestserialport,andit'susedwisureterminal.exeisrunningonUindous.>>hello<<hello>>howareyou?<<Ianfine,thankyou,andyou?>>Ianfinetoo.?-EOSTerainalhellohellohowareyou?Iamfine,thankyou,andyou?Iamfinetoo.三、問題答案及參考代碼在向串口發(fā)送數(shù)據(jù)時(shí)可以不使用緩沖區(qū),將SrIWite函數(shù)體修改為CHARData;ULONGCout;PDEVICE_EXTENSIONExt=(PDEVICE_EXTENSION)DeviceObject->DeviceExtension;PsResetEvent(&Ext->CompietionEvent);For(Count=0;Count<Request;Count++){Data=((PCHAR)Buffer)[count];WRITE_PORT_UCIIAR(REG_P0RT(DeviceObjict.TIIR),Date);實(shí)驗(yàn)3進(jìn)程的創(chuàng)建一、實(shí)驗(yàn)?zāi)康木毩?xí)使用EOSAPI函數(shù)CreateProcess創(chuàng)建一個(gè)進(jìn)程,掌握創(chuàng)建進(jìn)程的方法,理解進(jìn)程和程序的區(qū)別。調(diào)試跟蹤C(jī)roatcProcess函數(shù)的執(zhí)行過程,了解進(jìn)程的創(chuàng)建過程,理解進(jìn)程是資源分派的單位。二、實(shí)驗(yàn)內(nèi)容1準(zhǔn)備實(shí)驗(yàn)2練習(xí)使用控制臺(tái)命令創(chuàng)建EOS應(yīng)用程序的進(jìn)程3練習(xí)通過編程的方式讓應(yīng)用程序創(chuàng)建另一個(gè)應(yīng)用程序的進(jìn)程調(diào)試CreateProcess函數(shù)調(diào)試PsCreateProcess函數(shù)6練習(xí)通過編程的方式創(chuàng)建應(yīng)用程序的多個(gè)進(jìn)程三、問題答案及參考代碼1.在源代碼文獻(xiàn)NewT*oProc,c提供的源代碼基礎(chǔ)上進(jìn)行修改,規(guī)定使用hello,exe同時(shí)創(chuàng)建10個(gè)進(jìn)程。提醒:可以使用PROCESS.INFORMATION類型定義一個(gè)有10個(gè)元素的數(shù)組,每一個(gè)元素相應(yīng)一個(gè)進(jìn)程。使用一個(gè)循環(huán)創(chuàng)建10個(gè)子進(jìn)程,然后再使用一個(gè)循環(huán)等待1。個(gè)子進(jìn)程結(jié)束,得到退出碼后關(guān)閉句柄。STARTUPINFOStartupInfo;PROCESS_INFORMATIONProcinfo[l0];ULONGulExitCode;INTnResult=0;。inti,j;//#ifdcf_DEBUG_asm("intS3\nnop");#endifprintf(^Create1Op//rocessesandwaitfortheprocessesexit...\n\n");PsWaitForEven(&Ext—>Comp1etionEvent,INFINITE);*Rcsu1t=Count;ReturnSTATUS_SUCCESS;)4.在io/driver/seria1.c文獻(xiàn)的SrlRead函數(shù)中,訪問接受數(shù)據(jù)緩沖區(qū)時(shí)必須關(guān)閉中斷,思考這樣做的因索。在SrlWrite函數(shù)中訪問緩沖區(qū)時(shí)為什么不需要關(guān)閉中斷呢?思考中斷在設(shè)備I/0中的重要作用和意義。答:由于SrlWrite函數(shù)和Srllsr函數(shù)對(duì)發(fā)送數(shù)據(jù)緩沖區(qū)的訪問是同步進(jìn)行的,在Sr1Write函數(shù)中訪問發(fā)送數(shù)據(jù)緩沖區(qū)時(shí)就不需要關(guān)閉中斷了。使用中斷方式可以讓進(jìn)程在等待硬件設(shè)備的響應(yīng)時(shí)讓出解決器,調(diào)度程序會(huì)選擇其他進(jìn)程在解決器上繼續(xù)執(zhí)行,從而提高解決器的運(yùn)用率,并支持多道程序和I/O設(shè)備并行操作。同時(shí),由于中斷方式是異步執(zhí)行的,所以在訪問臨界資源時(shí)需要進(jìn)行同步。實(shí)驗(yàn)10磁盤調(diào)度算法一、實(shí)驗(yàn)?zāi)康耐ㄟ^學(xué)習(xí)EOS實(shí)現(xiàn)磁盤調(diào)度算法的機(jī)制,掌握磁盤調(diào)度算法執(zhí)行的條件和時(shí)機(jī)。觀測(cè)EOS實(shí)現(xiàn)的FCFS、SSTF和SCAN磁盤調(diào)度算法,了解常用的磁盤調(diào)度算法。編寫CSCAN和N-Step-SCAN磁盤調(diào)度算法,加深對(duì)各種掃描算法的理解。二、實(shí)驗(yàn)內(nèi)容1、準(zhǔn)備實(shí)驗(yàn)2、驗(yàn)證先來先服務(wù)(FCFS)磁盤調(diào)度算法3、驗(yàn)證最短尋道時(shí)間優(yōu)先(SSTF)磁盤調(diào)度算法4、驗(yàn)證SSTF算法導(dǎo)致的線程“饑餓”現(xiàn)象三、問題答案及參考代碼1.在執(zhí)行SCAN、N?Step-SCAN磁盤調(diào)度算法時(shí),假如在EOS控制臺(tái)中多次輸入“ds”命令,調(diào)度的順序會(huì)發(fā)生變化,說明導(dǎo)致這種現(xiàn)象的因素(提醒:注意這兩種算法使用的全局變量)。嘗試修改源代碼,使這兩種算法在多次執(zhí)行時(shí),都能保證調(diào)度的順序一致(提醒:可以參考io/b1ock.c文獻(xiàn)中IopReceiveRequest函數(shù)和IopProcessNextRequest函數(shù)判斷磁盤調(diào)度算法開始工作和結(jié)束工作的方法)。答:SCAN算法使用了全局變最Scanlnside記錄磁頭移動(dòng)的方向,每次執(zhí)行“ds”時(shí),磁頭的移動(dòng)方向都也許不同樣,所在磁道也也許不同樣,所以在每次執(zhí)行時(shí)距離最短的線程也不同,所以調(diào)度的順序會(huì)發(fā)生變化,例如在第一次執(zhí)行“ds”命令時(shí),Scaninside初始化為true則開始磁頭是從外向內(nèi)移動(dòng)的,結(jié)束時(shí)磁頭變?yōu)閺膬?nèi)向外移動(dòng),所以在下次執(zhí)行“ds”命令時(shí),開始磁頭就繼續(xù)從內(nèi)向外移動(dòng)了。要解決這個(gè)問題,可以lopProcessNextRcquest函數(shù)中,每次檢測(cè)到磁盤調(diào)度算法結(jié)束工作時(shí),將這些全局變量恢復(fù)為默認(rèn)值。4.分析已經(jīng)實(shí)現(xiàn)的各種磁盤調(diào)度算法的優(yōu)缺陷,嘗試實(shí)現(xiàn)更多其它的磁盤調(diào)度算法。先來先服務(wù)FCFS:公平,簡(jiǎn)樸,每個(gè)進(jìn)程的請(qǐng)求都能依次得到解決。沒有對(duì)尋道優(yōu)化,平均尋道時(shí)間長(zhǎng)。最短時(shí)間優(yōu)先調(diào)度算法SSTF:規(guī)定訪問的磁道是當(dāng)前磁頭所在的磁道最近,每次尋道時(shí)間最短,但不能保證平均尋道時(shí)間最短。也許導(dǎo)致一些請(qǐng)求無限期推延,產(chǎn)生饑餓現(xiàn)象。電梯調(diào)度算法SCAN:不僅考慮當(dāng)前磁道的距離,優(yōu)先考慮在磁道前進(jìn)方向的最短時(shí)間,排除磁頭在盤面上的往復(fù)運(yùn)動(dòng),避免了出現(xiàn)“饑餓”現(xiàn)象。電梯原理。C-SCAN:磁頭單項(xiàng)移動(dòng)。實(shí)驗(yàn)總結(jié):操作系統(tǒng)實(shí)驗(yàn)中我們親自動(dòng)手操作,分別實(shí)現(xiàn)了進(jìn)程、存儲(chǔ)器管理等功能,將課上所學(xué)到的知識(shí)與實(shí)際操作結(jié)合到一起,領(lǐng)略到了各個(gè)功能實(shí)現(xiàn)的過程原理,加深了對(duì)于操作系統(tǒng)意義、作用的理解,對(duì)于此后計(jì)算機(jī)的相關(guān)課程的學(xué)習(xí)打下了基礎(chǔ)。實(shí)驗(yàn)的課程中思考題的部分更是對(duì)課程內(nèi)容的進(jìn)一步理解,讓我們有許多收獲。最后,感謝老師的悉心教導(dǎo)。Startupinfo.StdInput=GetStdHand1e(STD.INPUT_HANDLE);StartupInfo.StdOutput=GetStdHand1e(STD_OUTPUT_HANDLE);StartupInfo.StdError=GetStdlland1c(STD_ERRORHANDLE);for(i=0;i<10;i++)if(CreateProcess("A:\\Hello.exe",NULL,0,&StartupInfo,&ProcInfo[i]));else{for(j=0;j<i;j++){WaitForSingleObject(Proclnfo[j].ProcessHandie,INFINITE);GetExitCodeProcess(ProcInfo[j].ProcessHand1e,ftulExitCode);printf(,z\nTheprocess%dexitwith%d.\nj,ulExitCode);CloseIIand1e(ProcInfo[j].ProcessHandie);CloseHandle(Proclnfo[j].ThreadHandle);}printf("CreateProcessFailed,Errorcode:Ox%X.\n”,GetLastError());nResuIt=1;returnnResuit;}for(i=0;i<10:i++){WaitForSingleObject(Proclnfo[i].Proccssllandle,INFINITE);GetExitCodeProcess(Proclnfo[i].ProcessHandie,&ulExitCode);}for(i=0i<10:i++)(printf("\nTheprocess%dexitwith%d.\n”,i,ulExitCode);C1oseHand1e(ProcInfo[i].ProcessHandle);CloseHandle(ProcInfo[i].Threadllandle);}returnnResult;3.在PsCreateProcess函數(shù)中調(diào)用TPspCreateProcessEnvironmenl函數(shù)后又先后調(diào)用了PspLoadProcessimage和PspCreateThread函數(shù),學(xué)習(xí)這些函數(shù)的重要功能??梢曰Q這些函數(shù)被調(diào)用的順序嗎?思考其中的因素。PspCreateProcessEnvironment的重要功能是創(chuàng)建進(jìn)程控制塊,并且為進(jìn)程創(chuàng)建了地址空間和分派了句柄表。PspLoadProcessImage是將進(jìn)程的可執(zhí)行映像加載到了進(jìn)程的地址空間中。PspCreateThread創(chuàng)建了進(jìn)程的主線程。這三個(gè)函數(shù)被調(diào)用的順序是不可以改變的。就向上面描述的加載可執(zhí)行映像之前必須已經(jīng)為進(jìn)程創(chuàng)建了地址空間,這樣才可以擬定可執(zhí)行映像可以被加載到內(nèi)存的什么位置。在創(chuàng)建主線程之前必須已經(jīng)加載了可執(zhí)行映像,這樣主線程才可以知道自己要從哪里開始執(zhí)行,執(zhí)行哪些指令。因此不能互換他們的順序。實(shí)驗(yàn)4線程的狀態(tài)和轉(zhuǎn)換一、實(shí)驗(yàn)?zāi)康恼{(diào)試線程在各種狀態(tài)間的轉(zhuǎn)換過程,熟悉線程的狀態(tài)和轉(zhuǎn)換。通過為線程增長(zhǎng)掛起狀態(tài),加深對(duì)線程狀態(tài)的理解。二、實(shí)驗(yàn)內(nèi)容1準(zhǔn)備實(shí)驗(yàn)2調(diào)試線程狀態(tài)的轉(zhuǎn)換過程(阻塞一就緒、運(yùn)營(yíng)一就緒、就緒一運(yùn)營(yíng)、運(yùn)營(yíng)一阻塞)3為線程增長(zhǎng)掛起狀態(tài)三、問題答案及參考代碼PsResumThread(INHANDLEhThread){STATUSStatus;BOOLIntState;PTHREADThread;Status=0bRefObjectByHand1e(hThrcad,PspThreadType,(PV0ID*)&Thread);if(EOS_SUCCESS(Status)){IntState=KeEncibleInterrupts(FALSE);if(Zero==Thread—>Statc){ListRemoveEntry(&Thread->StateListEntry);PspReadyThread(Thread);PspThreadSchedule();Status=STATUS_SUCCESS;}elsetStatus=STATUS_NOT_SUPPORTED;)KoEnab1elnterrupts(IntState);//開中斷0bDerefObject(Thread);}returnStatus;}resume命令執(zhí)行的效果如圖:1.思考一下,在本實(shí)驗(yàn)中,當(dāng)1??诰€程處在運(yùn)營(yíng)狀態(tài)時(shí),EOS中尚有哪些線程,它們分別處在什么狀態(tài)??梢允褂每刂婆_(tái)命令pt查看線程的狀態(tài)。,OSLabPC-MicrosoftVirtualPC2007ActionEditCDFloppyHelpCONSOLE-2(PressCtrl*Fl~F8toswitchconsolewindow...)Ue1cometoEOSshel1>pt********ProcessList(1Process)xxmxxxIDtSystem?!PriorityIThreadCount?PrimaryThreadID?ImageNane1Y24112M\AD0123456781一*****ThreadList(111System?;PriorityThread)****;State1ParentProcessID:StartAddressY0Ready10x8001817CY24Uaiting10x80015E9A丫24Waiting10x8001826DY24Running10x80018Z6D¥24Uaiting10x8001826DY24Uaiting10x80018Z6DY24Uaiting10x80018Z6D¥24Uaiting10x80018Z6D丫Z4Uaiting10x80018Z6DY24Uaiting10x80018Z6D丫8Ready10x80018D9AI22222222223>2.當(dāng)1oop線程在控制臺(tái)1中執(zhí)行,并且在控制臺(tái)2中執(zhí)行suspend命令時(shí),為什么控制臺(tái)1中的loop線程處在就緒狀態(tài)而不是運(yùn)營(yíng)狀態(tài)?答:當(dāng)在控制臺(tái)2中執(zhí)行suspend命令時(shí),實(shí)質(zhì)上是優(yōu)先級(jí)為24的控制臺(tái)2線程搶占了解決器,也就是控制臺(tái)2線程處在運(yùn)營(yíng)狀態(tài),所以此時(shí)1。op線程處在就緒狀態(tài)了。4.總結(jié)一下在圖5-3中顯示的轉(zhuǎn)換過程,哪些需要使用線程控制塊中的上下文(將線程控制塊中的上下文恢復(fù)到解決器中,或者將解決器的狀態(tài)復(fù)制到線程控制塊的上下文中),哪些不需要使用,并說明因素。答:一個(gè)進(jìn)程在運(yùn)營(yíng)過程中或執(zhí)行系統(tǒng)調(diào)用,或產(chǎn)生了一個(gè)中斷事件,解決器都進(jìn)行一次模式切換,操作系統(tǒng)接受控制權(quán),有關(guān)系統(tǒng)例程完畢必須的操作后,或恢復(fù)被中斷進(jìn)程或切換到新進(jìn)程。當(dāng)系統(tǒng)調(diào)度新進(jìn)程占有解決器時(shí),新老進(jìn)程隨之發(fā)生上下文切換,因此,進(jìn)程的運(yùn)營(yíng)被認(rèn)為是在進(jìn)程的上下文中執(zhí)行,這時(shí)的控制權(quán)在操作系統(tǒng)手中,它在完畢必要的操作后,可以恢復(fù)被中斷的進(jìn)程或切換到別的進(jìn)程。實(shí)驗(yàn)5進(jìn)程的同步一、實(shí)驗(yàn)?zāi)康氖褂肊OS的信號(hào)量,編程解決生產(chǎn)者一消費(fèi)者問題,理解進(jìn)程同步的意義。調(diào)試跟蹤EOS信號(hào)量的工作過程,理解進(jìn)程同步的原理“修改EOS的信號(hào)量算法,使之支持等待超時(shí)喚醒功能(有限等待),加深理解進(jìn)程同步的原理。二、實(shí)驗(yàn)內(nèi)容1、準(zhǔn)備實(shí)驗(yàn)2、使用EOS的信號(hào)量解決生產(chǎn)者一消費(fèi)者問題3、調(diào)試EOS信號(hào)量的工作過程4、修改EOS的信號(hào)量算法if(Semaphore->Count>0){Semaphore->Count—;aflag=STATUS_SUCCESS;2〃假如信號(hào)量大于零,說明尚有資源,可認(rèn)為線程分派elseflag=PspWait(&Semaphore->WaitListHead,Milliseconds);KeEnablelnterrupts(IntState);//原子操作完畢,恢復(fù)中斷。returnf1ag;}〃否則,說明資源數(shù)量不夠,不能再為線程分派資源,因此要使線程等待if(Semaphore->Count+Re1easeCount>Semaphore->MaximumCount){Status=STATUS_SI':MAPH0RE_LIMiT_EXCEEDEI);}Else{a//記錄當(dāng)前的信號(hào)量的值//if(NULL!=PreviousCount){*PreviousCount=Semaphore->Count;}intmm=Semaphore—>Count;//目前僅實(shí)現(xiàn)了標(biāo)準(zhǔn)記錄型信號(hào)最,每執(zhí)行一次信號(hào)晟?的釋放操作只能使信號(hào)量的值增長(zhǎng)1.〃while((!ListIsEmpty(&Semaphore->WaitListHead))&&(Re1easeCount)){PspWakeThread(&Semaphore->WaitListHead,STATUS_SUCCESS);APspThre
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版消防工程設(shè)計(jì)合同范本(含環(huán)保要求)3篇
- 二零二五年度旅游度假村建設(shè)項(xiàng)目服務(wù)合同3篇
- 二零二五版土地使用權(quán)轉(zhuǎn)讓居間合同范本(土地交易中介服務(wù)協(xié)議書)6篇
- 二零二五年度個(gè)人住宅舊房改造裝修工程合同
- 藥劑室設(shè)計(jì)方案
- 二零二五年度個(gè)人二手房交易房屋交易糾紛調(diào)解服務(wù)合同2篇
- 水電吧臺(tái)改造方案
- 二零二五年度大米加工技術(shù)交流與合作合同4篇
- 鐵路舊小區(qū)改造方案
- 鄭州教育機(jī)構(gòu)標(biāo)識(shí)施工方案
- 2024年全國(guó)職業(yè)院校技能大賽高職組(研學(xué)旅行賽項(xiàng))考試題庫(含答案)
- 2025年溫州市城發(fā)集團(tuán)招聘筆試參考題庫含答案解析
- 2025年中小學(xué)春節(jié)安全教育主題班會(huì)課件
- 2025版高考物理復(fù)習(xí)知識(shí)清單
- 計(jì)量經(jīng)濟(jì)學(xué)練習(xí)題
- 除數(shù)是兩位數(shù)的除法練習(xí)題(84道)
- 2025年度安全檢查計(jì)劃
- 2024年度工作總結(jié)與計(jì)劃標(biāo)準(zhǔn)版本(2篇)
- 全球半導(dǎo)體測(cè)試探針行業(yè)市場(chǎng)研究報(bào)告2024
- 2025年全國(guó)高考體育單招考試模擬政治試卷試題(含答案詳解)
- 反走私課件完整版本
評(píng)論
0/150
提交評(píng)論