版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 操作系統(tǒng)課程設計操作系統(tǒng)課程設計 專業(yè)名稱:專業(yè)名稱:_軟件工程_ 操作系統(tǒng)課程設計操作系統(tǒng)課程設計 基于 nachos 的課程設計 主要完成工作:閱讀代碼,完成基于線程優(yōu)先級調(diào)度,多道程序設計,完成小組課程設計報告 基于線程優(yōu)先級調(diào)度部分 一、問題分析及工作原理一、問題分析及工作原理 線程運行機制圖線程運行機制圖: callScheduler:ReadyToRun (Thread *thread) Scheduler:Run (Thread *nextThread, Yield () bool finishing) voidThread:Sleep Scheduler: (bool fin
2、ishing) ReadyToRun (Thread *thread) 進程的基本狀態(tài):就緒,運行,阻塞 進程程的基本操作:創(chuàng)建,阻塞,喚醒 Fork 方法調(diào)用 StackAllocate,分配一塊固定大小的內(nèi)存作為線程的堆棧,設置棧Thread:Thread() Ready Thread:Yield() Thread:Fork() Thread *Scheduler: FindNextToRun () Running voidThread:Sleep (bool finishing) Blocked 首指針,線程準備好運行后進行線程切換,會切換到 ThreadRoot 函數(shù)。ThreadRo
3、ot函數(shù)將會開中斷,并調(diào)用 func(arg)成為一個獨立的調(diào)度單位。然后設置 PC 指針,從 ThreadRoot 開始運行,初始化宿主機寄存器,為 ThreadRoot 作好準備,ThreadRoot 將分別調(diào)用 InterruptEnable, func(arg)和 ThreadFinish。Yield方法用于本線程放棄處理機。Sleep 方法可以使當前線程轉(zhuǎn)入阻塞態(tài),并放棄 CPU,直到被另一個線程喚醒,把它放回就緒線程隊列。如果沒有就緒線程時,就把時鐘前進到一個中斷發(fā)生的時刻,讓中斷發(fā)生并處理此中斷,這是因為在沒有線程占用CPU 時,只有中斷處理程序可能喚醒一個線程,并把它放入就緒線
4、程隊列。 Scheduler 類用于實現(xiàn)線程的調(diào)度。它維護一個就緒線程隊列,當一個線程可以占用處理機時,就可以調(diào)用 ReadyToRun 方法把這個線程放入就緒線程隊列,并把線程狀態(tài)改成就緒態(tài)。FindNextToRun 方法根據(jù)調(diào)度策略,取出下一個應運行的線程,并把這個線程從就緒線程隊列中刪除。如果就緒線程隊列為空,則此函數(shù)返回空(NULL)?,F(xiàn)有的調(diào)度策略是先進先出策略(FIFO) 二、二、算法思想設計:算法思想設計: 為線程(Thread)添加 priority 屬性,用來描述每個線程的優(yōu)先級,并在線程創(chuàng)建時設置或創(chuàng)建后修改線程的優(yōu)先級,加入就緒隊列(readyList)時,先比較當前線
5、程和就緒隊列里的線程的優(yōu)先級,優(yōu)先級高的插入在前面,如果優(yōu)先級相同,則兩個線程按先后順序排列,相當與先來先服務(FCFS),這樣,當 CPU 空閑時需要從就緒隊列取出一個線程時,取出的總是優(yōu)先級最高的線程。 三、三、詳細設計及關鍵代碼分析詳細設計及關鍵代碼分析: 首先,為線程(Thread)添加 priority 屬性,用來描述每個線程的優(yōu)先級,并添加 int setpriority()設置進程優(yōu)先級和 getpriority()獲得線程優(yōu)先級的函數(shù),并增加新的構(gòu)造函數(shù) Thread(char* threadName ,int prio) /Thread.h/Thread.h /添加了 pri
6、ority 屬性以及 getPriority()和 setpriority() /添加了新的構(gòu)造函數(shù) Thread(char* threadName ,int prio) /thread.cc /在原來的構(gòu)造函數(shù) Thread(char *threadName)中設置默認優(yōu)先級為最高(0) /新的構(gòu)造方法 Thread(char* threadName ,int prio) 然后修改 readyList 為 SortedList 類型(原來為 List 類型),方便插入就緒線程,對線程進行排序。 /Scheduler.h 當一個線程需要加入到就緒隊列時不是采用原來的(thread)將線程加入到
7、最后,而是利用 Insert(thread)將線程按優(yōu)先級插入到就緒隊列 /Scheduler.cc 修改 SelfTest()創(chuàng)建幾個不同優(yōu)先級的進程進行測試 /Thread.cc 以上創(chuàng)建了四個不同優(yōu)先級的線程,按優(yōu)先級高的線程優(yōu)先執(zhí)行,如果優(yōu)先級相同,則按照等待時間長的優(yōu)先運行,線程優(yōu)先級為 t3t1t2=t4t3t1t2=t4 而由于線程2先于線程4加入等待隊列則線程2先執(zhí)行,故執(zhí)行順序應該為: t3t3- -t1t1- -t2t2- -t4t4 四、四、測試測試及結(jié)果分析:及結(jié)果分析: ./nachos -K 實際運行結(jié)果如下: 由以上運行結(jié)果可知進程是按優(yōu)先級高低順序來執(zhí)行的 五、
8、多道程序部分五、多道程序部分 主要完成以下設計: 1.exec 系統(tǒng)調(diào)用 exec 用于執(zhí)行一個可執(zhí)行文件 首先從 4 號寄存器讀取系統(tǒng)調(diào)用的參數(shù)(即傳遞的可執(zhí)行文件名指針,也就是在內(nèi)存的地址),然后從內(nèi)存讀取文件名,打開文件,使用該可執(zhí)行文件初始化一個新的進 程空間,將當前的進程的地址空間覆蓋,初始化所有的寄存器值,恢復到進程空間, 開始執(zhí)行。 2.Open 系統(tǒng)調(diào)用 Open 系統(tǒng)調(diào)用用于打開一個文件,返回文件描述符??梢哉{(diào)用 nachos 系統(tǒng)封裝的 打開文件的方法,這個方法是調(diào)用了底層的操作系統(tǒng)的方法,然后打開的是宿 主系統(tǒng)的文件。然后將打開的文件描述符寫到 2 號寄存器,執(zhí)行下一條指
9、令。 3.Read 系統(tǒng)調(diào)用 read 系統(tǒng)調(diào)用傳遞打開的文件描述符,讀的大小,緩沖區(qū)地址用于存放讀的內(nèi)容, 返回讀得字節(jié)數(shù)。首先從寄存器取得參數(shù),然后調(diào)用 nachos 封裝宿主機的方法讀取 內(nèi)容以及讀到的字節(jié)數(shù),然后將內(nèi)容寫到 nachos 模擬的物理內(nèi)存,地址是 剛剛接受的參數(shù),最后將讀到的字節(jié)數(shù)寫道 2 號寄存器,執(zhí)行下一條指令。 4.Write 系統(tǒng)調(diào)用 先讀取內(nèi)容的地址(在內(nèi)存中),讀取寫入的大小以及要 寫入的文件描述符,然后寫到文件中(調(diào)用 nachos 封裝的方法)。 六六、問題分析問題分析 在實現(xiàn)多道程序時出現(xiàn)了比較多的問題,導致最后沒能完成,首先,我們對多道程序運行機制進行
10、了詳細的了解,并根據(jù)源碼中的樣例 ADD 的執(zhí)行過程,單步跟蹤,深入了解了 NACHOS 是如何執(zhí)行用戶程序的,然后進行算法思想的設計,即如何實現(xiàn)多道程序,在實現(xiàn)系統(tǒng)調(diào)用程序設計階段,主要系統(tǒng)調(diào)用未能實現(xiàn),主要原因是由于對代碼的整體把握出錯,由于在設計及分析階段只了解了 NACHOS 運行用戶程序的詳細流程以及如何進行用戶程序的調(diào)用,而對代碼的整體了解不夠,導致在根據(jù)設計思路完成程序設計的過程中,出現(xiàn)了比較大的問題,比如在實現(xiàn) EXEC系統(tǒng)調(diào)用時,根據(jù) NACHOS 的每個寄存器存的內(nèi)容不同,按規(guī)則讀取寄存的內(nèi)容,然后再進行對其內(nèi)容的操作,模仿源代碼已有的操作 ADD 系統(tǒng)調(diào)用,實現(xiàn) EXEC 系統(tǒng)調(diào)用。在測試程序運行時,出現(xiàn)了 cannot open file 的錯誤,主要原因是:由于在代碼實現(xiàn)時,寫錯了文件名所在寄存器,導致無法打開文件,所以就沒能完成文件調(diào)用的測試。而對 EXEC 系統(tǒng)調(diào)用的其他部分則是正確的,其他幾個系統(tǒng)調(diào)用也出現(xiàn)了同樣的問題,但是這個問題一直未能發(fā)現(xiàn),導致本次設計無法順利進行下去。 七七、心得及體會、心得及體會 本次課程設計對我的提升還是非常大的,首先,由于分析了 NACHOS 的主要代碼以及詳細運行過程,對操作系統(tǒng)中的基本原理和核心算法有一個全面和完整的了解。對操作系統(tǒng)課上的內(nèi)容有了更深了理解,包括線程管理,內(nèi)存管理,系統(tǒng)調(diào)用機制,時鐘中斷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保潔員合同范例
- 入職員工合同范例
- 協(xié)商解除勞務合同范例
- 制作補充合同模板
- 個人借用公司合同范例
- 國內(nèi)商鋪租賃合同模板
- 勞動合同范例 提成
- 企業(yè)購銷糧油合同范例
- 公司合同范例封面
- 地質(zhì)勘察轉(zhuǎn)讓合同范例
- 糧油售后服務承諾書
- 科研倫理與學術規(guī)范-課后作業(yè)答案
- 藥學職業(yè)生涯人物訪談
- 單位職工獨生子女父母一次性退休補貼申請表
- 國有集團公司中層及員工履職追責問責處理辦法模版
- 管理學-第6章-組織設計
- 2020醫(yī)用氧藥典標準
- 七年級生物作業(yè)設計
- 2023年考研英語二真題(含答案及解析)【可編輯】
- 食堂員工規(guī)章制度
- 軟件工程(嵌入式培養(yǎng))專業(yè)職業(yè)生涯規(guī)劃書
評論
0/150
提交評論