版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目錄</b></p><p><b> 一、背景知識(shí)1</b></p><p> 1、1 Nachos的介紹1</p><p> 1、2 Nachos的目錄結(jié)構(gòu)2</p><p> 1、3 線程基礎(chǔ)知識(shí)3</p><p>
2、 二、設(shè)計(jì)要求和目的4</p><p> 2、1 Nachos的線程管理模塊4</p><p> 2、2 Nachos的線程線程調(diào)度算法分析4</p><p> 2、3 編程語言選擇對(duì)比5</p><p> 2、4 開發(fā)環(huán)境配置6</p><p> 2、5 NachOS 系統(tǒng)和交叉編譯器安
3、裝6</p><p> 2、5、1 NachOS 系統(tǒng)安裝6</p><p> 2、5、2 交叉編譯器環(huán)境的安裝7</p><p> 三、 設(shè)計(jì)思路和程序結(jié)構(gòu)8</p><p> 3、1 線程的生成和狀態(tài)轉(zhuǎn)換8</p><p> 3、1、1 基于五狀態(tài)模型8</p><
4、p> 3、1、2 線程創(chuàng)建過程8</p><p> 3、2 線程調(diào)度機(jī)制8</p><p> 四、 關(guān)鍵代碼分析9</p><p> 4、1 擴(kuò)充線程管理9</p><p> 4、2 擴(kuò)充線程調(diào)度機(jī)制10</p><p> 4、3 擴(kuò)充線程調(diào)度機(jī)制改進(jìn)12</p>
5、<p> 4、3、1 信號(hào)量機(jī)制12</p><p> 4、3、2 實(shí)現(xiàn)用戶更改進(jìn)程優(yōu)先級(jí)13</p><p><b> 五、 測(cè)試13</b></p><p> 5、1 測(cè)試NachOS 環(huán)境和交叉編譯器13</p><p> 5、2 測(cè)試創(chuàng)建線程14</p><
6、;p> 5、3 測(cè)試線程優(yōu)先級(jí)15</p><p><b> 六、 總結(jié)15</b></p><p><b> 一、背景知識(shí)</b></p><p> 1、1 Nachos的介紹</p><p> Nachos的全稱是“Not Another Completely Heuri
7、stic Operating System”,是一個(gè)可修改和跟蹤的操作系統(tǒng)教學(xué)軟件。它給出了一個(gè)支持多線程和虛擬存儲(chǔ)的操作系統(tǒng)骨架,可讓學(xué)生在較短的時(shí)間內(nèi)對(duì)操作系統(tǒng)中的基本原理和核心算法有一個(gè)全面和完整的了解。</p><p> NachOS 提供了可重復(fù)的調(diào)試環(huán)境和模擬操作系統(tǒng)及底層硬件。目的是為學(xué)習(xí)者展示真實(shí)的操作系統(tǒng)運(yùn)行時(shí)的環(huán)境,這個(gè)簡(jiǎn)單的操作系統(tǒng)軟件可以讓學(xué)習(xí)者在較短的時(shí)間內(nèi)理解并能夠用自己的想法來完善
8、它。</p><p> 免費(fèi)的開源開發(fā)包可通過網(wǎng)絡(luò)下載,通常包括以下幾部分:</p><p><b> NachOS 概述</b></p><p> 簡(jiǎn)單可運(yùn)行的操作系統(tǒng)代碼</p><p> 模擬器——個(gè)人電腦或工作站</p><p> 任務(wù)樣本:任務(wù)說明和現(xiàn)代操作系統(tǒng)涉及的所有項(xiàng),包
9、括線程和并發(fā),多道程序,系統(tǒng)調(diào)用,虛擬內(nèi)存管理,文件系統(tǒng)管理,網(wǎng)絡(luò)協(xié)議,遠(yuǎn)程過程調(diào)用和分布式系統(tǒng)。</p><p> C++ 編程索引(NachOS 是C++ 子集編程,簡(jiǎn)單易學(xué)。這個(gè)索引將對(duì)C 語言程序員有所幫助)</p><p> Nachos操作系統(tǒng)本身只提供了一套框架,很多地方的實(shí)現(xiàn)都需要我們自己來完善,因此我們可以通過修改其源代碼,來豐富和增強(qiáng)Nachos操作系統(tǒng)的功能.更可
10、以在完善這些功能的同時(shí),了解操作系統(tǒng)的內(nèi)部運(yùn)行機(jī)制.</p><p> Nachos 模擬了MIPS R2/3000的指令集、主存、中斷系統(tǒng)、網(wǎng)絡(luò)以及磁盤系統(tǒng)等操作系統(tǒng)所必須的硬件系統(tǒng)。用軟件模擬硬件的可靠性比真實(shí)硬件高得多,不會(huì)因?yàn)橛布收隙鴮?dǎo)致系統(tǒng)出錯(cuò),便于調(diào)試。虛擬機(jī)可以在運(yùn)行時(shí)報(bào)告詳盡的出錯(cuò)信息,更重要的是采用虛擬機(jī)使Nachos的移植變得非常容易,在不同機(jī)器上移植Nachos,只需對(duì)虛擬機(jī)部分作移植即
11、可。</p><p> MIPS R2/3000的指令集的優(yōu)勢(shì):RISC指令集,指令書目少,Nachos 模擬其中的63條。</p><p> 編譯器:GCC 可直接將C/C++源程序編譯成該指令集的目標(biāo)代碼,而不必重寫編譯器。</p><p> Nachos 是一個(gè)在宿主機(jī)上運(yùn)行的進(jìn)程,采用雙CPU,即一個(gè)宿主CPU,一個(gè)虛擬機(jī)CPU,不確定性是操作系統(tǒng)
12、所必須具有的特征,而Nachos 采用隨機(jī)因子模擬真實(shí)操作系統(tǒng)的不確定性,使系統(tǒng)運(yùn)行更加真實(shí)。</p><p> Nachos 是一個(gè)可擴(kuò)展的操作系統(tǒng),可發(fā)揮自己的創(chuàng)造性進(jìn)行擴(kuò)展。</p><p> Nachos 限制:只有一級(jí)索引結(jié)構(gòu)限制了系統(tǒng)中最大文件的大小。Nachos 可以用面向?qū)ο蟮乃枷雽?shí)現(xiàn),面向?qū)ο蟮姆椒芮宄拿枋霾僮飨到y(tǒng)的各個(gè)部分的接口,但是又沒有全面的運(yùn)用到面向?qū)ο蟮?/p>
13、性質(zhì),例如繼承性、多態(tài)性,這使得代碼更易讀和理解。</p><p> Nachos 分五個(gè)功能模塊:機(jī)器模擬、線程管理、文件系統(tǒng)管理、用戶程序和虛擬存儲(chǔ)以及網(wǎng)絡(luò)系統(tǒng)。</p><p> 由于Nachos開發(fā)沒有針對(duì)windows平臺(tái)的移植,Nachos 需要在虛擬機(jī)上實(shí)現(xiàn),所以需要首先實(shí)現(xiàn)創(chuàng)建虛擬機(jī),創(chuàng)建linux 虛擬機(jī)來實(shí)現(xiàn)nachos代碼的編譯運(yùn)行。</p><
14、;p> Nachos 運(yùn)行時(shí)更像一個(gè)進(jìn)程,但是它是完全按照操作系統(tǒng)思想開發(fā)的操作系統(tǒng)內(nèi)核,具有完整的操作系統(tǒng)結(jié)構(gòu)。</p><p> Nachos 系統(tǒng)結(jié)構(gòu),作為一個(gè)簡(jiǎn)單的系統(tǒng)編程,網(wǎng)絡(luò)協(xié)議和文件系統(tǒng)只需夠用即可,這里主要設(shè)計(jì)線程管理和虛擬內(nèi)存,在設(shè)計(jì)時(shí)虛擬內(nèi)存可以暫時(shí)不要考慮。而其他的則可以由現(xiàn)有系統(tǒng)提供,為此,線程管理為主要任務(wù)。</p><p> 1、2 Nachos的
15、目錄結(jié)構(gòu)</p><p> copyright 文件 Nachos 的版權(quán)信息</p><p> readme 文件 Nachos 的readme 信息</p><p> nachos.ps 文件 Nachos 的介紹文檔(Postscript 格式)</p><p> c+
16、+example 目錄 有關(guān)C++介紹和實(shí)例</p><p> doc 目錄 Nachos 各個(gè)部分介紹和原有的作業(yè)要求</p><p> code 目錄 Nachos 各個(gè)部分的源代碼</p><p> 最主要的Nachos 的源代碼部分</p><p><
17、;b> Makefile</b></p><p> Makefile.dep</p><p> Nachos 的Makefile 文件,當(dāng)Nachos 需要移植到其它系統(tǒng)時(shí),可以修改Makefile.dep 中的HOST 參數(shù)</p><p> machine 目錄 Nachos 虛擬機(jī)模擬部分源代碼</p>&
18、lt;p> threads 目錄 Nachos 線程管理部分源代碼</p><p> filesys 目錄 Nachos 文件系統(tǒng)管理部分源代碼</p><p> userprog 目錄 Nachos 用戶程序部分源代碼</p><p> network 目錄 Nachos 網(wǎng)絡(luò)管理部分源代碼<
19、;/p><p> vm 目錄 Nachos 虛擬內(nèi)存管理部分源代碼</p><p> test 目錄 一些測(cè)試用應(yīng)用程序</p><p> bin 目錄 包含有用戶程序目標(biāo)碼變換的程序</p><p> 1、3 線程基礎(chǔ)知識(shí)</p><p> 線
20、程基本概念:是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。</p><p> 線程狀態(tài):就緒、阻塞和運(yùn)行三種基本狀態(tài)。 線程是程序中一個(gè)單一的順序控制流程.在單個(gè)程
21、序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程. 線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文.多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用,根據(jù)具體情況而定. 線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU</p><p><b> 線程的周期 </b></p><p> 新
22、建 就緒 運(yùn)行 阻塞 死亡</p><p><b> 線程調(diào)度與優(yōu)先級(jí) </b></p><p> 有線程進(jìn)入了就緒狀態(tài),需要有線程調(diào)度程序來決定何時(shí)執(zhí)行,根據(jù)優(yōu)先級(jí)來調(diào)度.</p><p> 線程組 每個(gè)線程都是一個(gè)線程組的一個(gè)成員,線程組把多個(gè)線程集成一個(gè)對(duì)象,通過線程組可以同時(shí)對(duì)其中的多個(gè)線程進(jìn)行操作.在生成線程時(shí)必須將線程放在指
23、定的線程組,也可以放在缺省的線程組中,缺省的就是生成該線程的線程所在的線程組.一旦一個(gè)線程加入了某個(gè)線程組,不能被移出這個(gè)組.</p><p><b> 進(jìn)程和線程的關(guān)系</b></p><p> 在引入線程機(jī)制后,進(jìn)程不再是單一的動(dòng)態(tài)實(shí)體,而是由兩部分組成:</p><p> 各線程活動(dòng)的環(huán)境,包括:統(tǒng)一的地址控件
24、、全局變量、打開文件和計(jì)時(shí)器等。</p><p> 若干個(gè)線程,它們是進(jìn)程中的活動(dòng)部分,也是處理機(jī)的調(diào)度單位,而進(jìn)程不再是處理機(jī)</p><p><b> 的最小調(diào)度單位。</b></p><p> 一個(gè)進(jìn)程中的所有線程在同一地址空間中活動(dòng),共享該地址空間中的全局變量,共享打開文</p><p&g
25、t; 件和計(jì)時(shí)器等。它們總是相互協(xié)作,各自承擔(dān)一個(gè)作業(yè)中的某個(gè)部分。與傳統(tǒng)的進(jìn)程相似,</p><p> 線程具有狀態(tài)的變化。通常,這些狀態(tài)是:運(yùn)行、阻塞、就緒或終止。</p><p><b> 二、設(shè)計(jì)要求和目的</b></p><p> Nachos的運(yùn)宿主機(jī)通過軟件模擬了各種硬件系統(tǒng),包括中斷系統(tǒng)、存儲(chǔ)系統(tǒng)、磁盤文件行必須借助于、
26、網(wǎng)絡(luò)等。它的運(yùn)行是可以跟蹤的,因此,我們可以一步一步的觀察操作系統(tǒng)是如何運(yùn)行的.</p><p> 對(duì)于線程的管理,主要涉及到線程的擴(kuò)充、nachos線程的調(diào)度機(jī)制和線程優(yōu)先級(jí)。</p><p> 2、1 Nachos的線程管理模塊</p><p> Nachos平臺(tái)所使用的是非搶占式調(diào)度,線程一旦占用CPU,就會(huì)一直運(yùn)行到結(jié)束或者被阻塞(等待I/O事件);
27、Nachos平臺(tái)中的線程數(shù)據(jù)結(jié)構(gòu)定義非常簡(jiǎn)單,并無用戶ID、線程ID等數(shù)據(jù)成員,也就是說,無法基于線程的ID來實(shí)現(xiàn)通信、同步互斥等機(jī)制。Nachos平臺(tái)中并無全局性的線程管理機(jī)制,并未限制線程的數(shù)目,也無法了解有多少線程存在。</p><p> 通過修改Nachos系統(tǒng)平臺(tái)的底層源代碼來實(shí)現(xiàn)以下目標(biāo):</p><p> 1.擴(kuò)充線程數(shù)據(jù)結(jié)構(gòu)。增加“用戶ID、線程ID”兩個(gè)數(shù)據(jù)成員,同時(shí)
28、在Nachos現(xiàn)有的線程管理機(jī)制中增加對(duì)這兩個(gè)數(shù)據(jù)成員的維護(hù)機(jī)制。</p><p> 2.擴(kuò)展現(xiàn)有的線程狀態(tài)。Nachos平臺(tái)中的線程狀態(tài)只有“初啟態(tài)”、“就緒態(tài)”、“阻塞態(tài)”、“運(yùn)行態(tài)”四種情況。請(qǐng)?jiān)黾印皰炱穑╯uspending)”這個(gè)狀態(tài),所謂“掛起”是指當(dāng)前的線程映象保存在磁盤文件而不是內(nèi)存中?!皰炱稹睜顟B(tài)是未來實(shí)現(xiàn)“虛擬內(nèi)存管理”的重要基礎(chǔ)。</p><p> 3.修改線程調(diào)
29、度算法。將Nachos平臺(tái)的線程管理機(jī)制調(diào)整為“搶占式”。具體可選擇“時(shí)間片輪轉(zhuǎn)”、“優(yōu)先級(jí)調(diào)度”、“多級(jí)隊(duì)列”等不同的調(diào)度算法。</p><p> 4.增加全局性的線程管理機(jī)制。擴(kuò)充Nachos平臺(tái)的現(xiàn)有操作命令,例如可以增加一個(gè)名為“ThreadView”的命令,執(zhí)行該命令,可以在屏幕上顯示目前所有存在的線程信息,包括“用戶ID“、“線程ID”、“當(dāng)前狀態(tài)”等。</p><p>
30、5.實(shí)現(xiàn)一個(gè)同步與互斥的例子。在完成以上修改后,可編寫一個(gè)實(shí)例程序,來實(shí)現(xiàn)某個(gè)“同步-互斥”經(jīng)典問題的正確解法。例如可選擇“哲學(xué)家就餐”問題,實(shí)例程序會(huì)創(chuàng)建5個(gè)哲學(xué)家線程,這些線程擁有同樣的用戶ID,可以遵循“信號(hào)量”機(jī)制來正確的運(yùn)行。也可以選擇“生產(chǎn)者-消費(fèi)者”問題等其他經(jīng)典IPC問題。</p><p> 2、2 Nachos的線程線程調(diào)度算法分析</p><p> Nachos平
31、臺(tái)所使用的是非搶占式調(diào)度,線程一旦占用CPU,就會(huì)一直運(yùn)行到結(jié)束或者被阻塞(等待I/O事件);Nachos平臺(tái)中的線程數(shù)據(jù)結(jié)構(gòu)定義非常簡(jiǎn)單,并無用戶ID、線程ID等數(shù)據(jù)成員,也就是說,無法基于線程的ID來實(shí)現(xiàn)通信、同步互斥等機(jī)制。Nachos平臺(tái)中并無全局性的線程管理機(jī)制,并未限制線程的數(shù)目,也無法了解有多少線程存在。</p><p> Sysdep模塊實(shí)現(xiàn)機(jī)制分析:sysdep.cc sysdep.h<
32、;/p><p> 屏蔽OS間的系統(tǒng)調(diào)用或函數(shù)調(diào)用在形式和內(nèi)容上可能有的細(xì)微差別</p><p> 中斷處理模塊實(shí)現(xiàn)機(jī)制分析:interrupt.cc .h</p><p> 模擬底層中斷機(jī)制——時(shí)鐘中斷、磁盤中斷、終端讀/寫中斷、網(wǎng)絡(luò)接收/發(fā)送中斷</p><p> 時(shí)鐘中斷模塊實(shí)現(xiàn)機(jī)制分析:timer.cc .h</p&g
33、t;<p> 模擬時(shí)鐘中斷,在nachos指定線程隨機(jī)切換時(shí)啟動(dòng)時(shí)鐘中斷,在每次的時(shí)鐘中斷處理的最后加入線程的切換</p><p> 終端設(shè)備模塊實(shí)現(xiàn)機(jī)制分析:console.cc .h</p><p> 模擬終端輸入和輸出,鍵盤的輸入和顯示輸出,異步,當(dāng)發(fā)出終端的輸入輸出請(qǐng)求后系統(tǒng)即返回,需要等待中斷發(fā)生后才是真正完成了整個(gè)過程。</p><
34、p> 磁盤設(shè)備模塊實(shí)現(xiàn)機(jī)制分析:disk.cc .h</p><p> 模擬物理磁盤,nachos用宿主機(jī)種的一個(gè)文件模擬單面物理磁盤,異步</p><p> 工具模塊:list.cc .h utility.cc .h</p><p><b> 定義鏈表結(jié)構(gòu)及操作</b></p><p>
35、 線程啟動(dòng)和調(diào)度模塊:switch.s switch.h</p><p> 線程定義模塊:thread.cc .h</p><p> 線程調(diào)度算法模塊:scheduler.cc .h</p><p> nachos主控模塊:main.cc system.cc system.h</p><p> nachos系統(tǒng)入口,分
36、析nachos命令行參數(shù),根據(jù)不同的選項(xiàng)進(jìn)行不同功能的初始化設(shè)置</p><p> 同步磁盤:文件synchdisk.cc .h</p><p> 文件系統(tǒng)模塊:filesys.cc .h</p><p> 模擬創(chuàng)建文件、刪除文件、打開文件操作</p><p> 文件頭模塊:文件filehdr.cc .h</p&g
37、t;<p> 打開文件結(jié)構(gòu):文件openfile.cc .h</p><p> 目錄模塊:directory.cc .h</p><p> machine.h:包含了內(nèi)存的相關(guān)定義</p><p> machine.cc:包含了對(duì)內(nèi)存和頁表的初始化</p><p> translate.h:定義了頁表結(jié)
38、構(gòu)</p><p> translate.cc:包含了地址轉(zhuǎn)換的實(shí)現(xiàn)以及讀、寫內(nèi)存的操作</p><p> address.cc:包含了用戶程序頁表的操作</p><p> 2、3 編程語言選擇對(duì)比</p><p> Java編程的優(yōu)勢(shì):1.簡(jiǎn)單,面向?qū)ο?,穩(wěn)定,跨平臺(tái),多線程,動(dòng)態(tài)</p><p>
39、2.面向?qū)ο蠡趯?duì)象的編程更符合人的思維模式,更容易編寫程序</p><p> 3.類運(yùn)行時(shí)動(dòng)態(tài)加載,使得Java 可以在分布式環(huán)境下動(dòng)態(tài)的維護(hù)程序及類庫(kù),當(dāng)類庫(kù)升級(jí)時(shí)也不必重新修改、編譯。</p><p> 缺點(diǎn):程序速度較慢,不適合做實(shí)時(shí)性很強(qiáng)的開發(fā)</p><p> C++編程的優(yōu)勢(shì):1.增加了面向?qū)ο蟮乃枷?,但是又兼具面向過程的方法</p>
40、<p><b> 2.兼容C</b></p><p> 缺點(diǎn):指針調(diào)用完成后需要手工釋放內(nèi)存,容易造成內(nèi)存泄露而程序崩潰</p><p> 2、4 開發(fā)環(huán)境配置</p><p><b> 開發(fā)環(huán)境配置:</b></p><p><b> 運(yùn)行環(huán)境配置:</b
41、></p><p> 2、5 NachOS 系統(tǒng)和交叉編譯器安裝</p><p> 2、5、1 NachOS 系統(tǒng)安裝</p><p> ubuntu10.04</p><p> gcc -v Reading specs from /usr/lib/gcc-lib/i486-linux-gnu/2.95.4/specs&
42、lt;/p><p> gcc version 2.95.4 20011002 (Debian prerelease)</p><p> 1、解壓NachOS-4.1.tgz</p><p> root@ubuntu:~$ tar -zxvf NachOS-4.1.gz</p><p> 2、運(yùn)行make depend</p>
43、<p> root@ubuntu:~/桌面/NachOS-4.1/code/build.linux# make depend</p><p><b> 3、運(yùn)行make</b></p><p> root@ubuntu:~/桌面/NachOS-4.1/code/build.linux# make</p><p> 4、運(yùn)行n
44、achos</p><p> root@ubuntu:~/桌面/NachOS-4.1/code/build.linux# ./nachos</p><p> tests summary: ok:0</p><p> Machine halting!</p><p> Ticks: total 10, idle 0, system 10
45、, user 0</p><p> Disk I/O: reads 0, writes 0</p><p> Console I/O: reads 0, writes 0</p><p> Paging: faults 0</p><p> Network I/O: packets received 0, sent 0</p&g
46、t;<p> 2、5、2 交叉編譯器環(huán)境的安裝</p><p> 在編譯前直接解壓到local根目錄下</p><p> 1、編譯生成coff2noff工具:</p><p> 運(yùn)行configre</p><p> 2.運(yùn)行make生成coff2noff</p><p> 3.編譯test
47、目錄下文件</p><p> 修改test/Makefile.dep中變量cpp和GCCDIR為正確的交叉編譯器路徑</p><p> root@ubuntu:~/NachOS-4.1/code/test# vim Makefile.dep</p><p> 4.編譯test目錄中的程序</p><p> root@ubuntu:~/
48、NachOS-4.1/code/test# make</p><p> root@ubuntu:~/NachOS-4.1/code/test# ls *.noff</p><p> add.noff halt.noff open.noff shell.noff write.noff</p><p> exec.noff matmult.nof
49、f read.noff sort.noff</p><p> 5、執(zhí)行NachOS格式文件</p><p> root@ubuntu:~/NachOS-4.1/code/build.linux# ./nachos -x ../test/halt.noff</p><p> tests summary: ok:0</p><p>
50、Machine halting!</p><p> Ticks: total 21, idle 0, system 10, user 11</p><p> Disk I/O: reads 0, writes 0</p><p> Console I/O: reads 0, writes 0</p><p> Paging: faul
51、ts 0</p><p> Network I/O: packets received 0, sent 0</p><p><b> 設(shè)計(jì)思路和程序結(jié)構(gòu)</b></p><p> 3、1 線程的生成和狀態(tài)轉(zhuǎn)換</p><p> 3、1、1 基于五狀態(tài)模型</p><p> 3、1、2
52、 線程創(chuàng)建過程</p><p> 擴(kuò)充線程管理,使其最多同時(shí)存在128個(gè)線程,測(cè)試創(chuàng)建線程</p><p> 在Thread類中增加靜態(tài)成員變量threadNum表示當(dāng)前線程的總數(shù)量</p><p> Fork()創(chuàng)建一個(gè)線程時(shí),threadNum加1,當(dāng)線程總數(shù)超過128個(gè)線程時(shí),程序終止。并打印終止信息</p><p> 當(dāng)一個(gè)
53、線程終止時(shí)threadNum減1</p><p> 當(dāng)系統(tǒng)關(guān)閉時(shí),所有線程都結(jié)束</p><p> 3、2 線程調(diào)度機(jī)制</p><p> 當(dāng)前的NachOS 系統(tǒng)中,線程沒有優(yōu)先級(jí),每次將線程放入到就緒隊(duì)列時(shí)即是將線程放到隊(duì)尾,因此若要改變系統(tǒng)調(diào)用的線程順序則需要確定各線程的優(yōu)先級(jí)。</p><p> 擴(kuò)充線程調(diào)度機(jī)制,測(cè)試線程數(shù)
54、為3個(gè)</p><p> 在Scheduler類中增加一個(gè)成員函數(shù),表示線程的優(yōu)先級(jí),增加靜態(tài)的優(yōu)先級(jí)調(diào)度</p><p> 在Thread類中增加一個(gè)函數(shù)來對(duì)就緒隊(duì)列中的線程根據(jù)優(yōu)先級(jí)進(jìn)行排序,將優(yōu)先級(jí)最高的放到隊(duì)首</p><p> 先將線程放入就緒隊(duì)列,然后排序,最后從中選擇下一條要執(zhí)行的線程</p><p> 具有優(yōu)先級(jí)的線程
55、將不再按照順序執(zhí)行而是根據(jù)線程的優(yōu)先級(jí)執(zhí)行</p><p><b> 關(guān)鍵代碼分析</b></p><p> 4、1 擴(kuò)充線程管理</p><p> code/threads/下的thread.cc和thread.h是線程管理部分的文件</p><p><b> 代碼修改:</b><
56、/p><p><b> Thread.h</b></p><p> 定義靜態(tài)成員變量threadNum表示線程數(shù)量</p><p><b> Thread.cc</b></p><p> SelfTest () 測(cè)試創(chuàng)建線程</p><p> 4、2 擴(kuò)充線程調(diào)度機(jī)制
57、</p><p><b> 代碼修改:</b></p><p> Scheduler類中添加全局靜態(tài)優(yōu)先級(jí)</p><p><b> Thread.h</b></p><p><b> Thread.cc</b></p><p> 4、3 擴(kuò)
58、充線程調(diào)度機(jī)制改進(jìn)</p><p> 4、3、1 信號(hào)量機(jī)制</p><p> class Semaphore {</p><p><b> public:</b></p><p><b> void P();</b></p><p><b> 核心操作
59、:</b></p><p> //禁止中斷,并保存初始中斷狀態(tài)。因?yàn)殚_始時(shí)中斷也可能處于被禁止//狀態(tài),所以操作結(jié)束后要恢復(fù)到初始狀態(tài)而不是使能中斷。</p><p> IntStatus oldLevel = interrupt->SetLevel(IntOff);</p><p> //當(dāng)信號(hào)量為0時(shí),將當(dāng)前進(jìn)程放到等待隊(duì)列里面,并設(shè)置
60、為睡眠模式,</p><p> //參數(shù)值為FALSE表示,進(jìn)程沒有正常結(jié)束而要被掛起。</p><p><b> void V();</b></p><p><b> 核心操作:</b></p><p><b> //禁止中斷</b></p><p
61、> IntStatus oldLevel = interrupt->SetLevel(IntOff);</p><p> //如果隊(duì)列不為空說明有當(dāng)前進(jìn)程因?yàn)橐R界資源被別的進(jìn)程訪問而掛//起,所以V操作首先應(yīng)將當(dāng)前進(jìn)程設(shè)置為READY狀態(tài),以繼續(xù)運(yùn)行并//訪問臨界資源</p><p><b> private:</b></p><
62、;p> int value; //信號(hào)量值 ( >=0)</p><p> List *queue; //線程等待隊(duì)列</p><p><b> };</b></p><p> 信號(hào)量的私有屬性有信號(hào)量的值,它是一個(gè)閥門。線程等待隊(duì)列中存放所有等待該信號(hào)量的線程。信號(hào)量有兩個(gè)操作:P操作和V操作,這兩個(gè)操作都是原子操作
63、。</p><p><b> P操作</b></p><p> 當(dāng)value等于0時(shí),</p><p> 將當(dāng)前運(yùn)行線程放入線程等待隊(duì)列。</p><p> 當(dāng)前運(yùn)行線程進(jìn)入睡眠狀態(tài),并切換到其它線程運(yùn)行。</p><p> 當(dāng)value大于0時(shí),value--。</p>
64、<p><b> V操作</b></p><p> 如果線程等待隊(duì)列中有等待該信號(hào)量的線程,取出其中一個(gè)將其設(shè)置成就緒態(tài),準(zhǔn)備運(yùn)行。</p><p><b> value++;</b></p><p> 4、3、2 實(shí)現(xiàn)用戶更改進(jìn)程優(yōu)先級(jí)</p><p> int SysWri
65、te(char*buffer ,int size,OpenFileId id);</p><p> int SysRead(char*buffer ,int size,OpenFileId id);</p><p> SpaceId SysExec(char* exec_name);</p><p> int SysJoin(SpaceId id);</
66、p><p> int SysStrncmp(char*buffer,char *str,int n)</p><p> 除此外添加一個(gè)處理異常的類</p><p> Exception.cc</p><p> 相應(yīng)的需要修改shell類中的代碼,進(jìn)行測(cè)試</p><p> root@ubuntu:~/桌面/Nac
67、hOS-4.1/code/build.linux# ./nachos -x ../test/shell.noff</p><p><b> 測(cè)試</b></p><p> 5、1 測(cè)試NachOS 環(huán)境和交叉編譯器</p><p> root@ubuntu:~/桌面/18新/a測(cè)試創(chuàng)建線程/NachOS-4.1/code/build.l
68、inux# make</p><p> g++ -ftemplate-depth-100 -Wno-deprecated -g -Wall -I../network -I../filesys -I../userprog -I../threads -I../machine -I../lib -DFILESYS_STUB -DRDATA -DSIM_FIX -DTUT -Dx86 -DLINUX -DCHANGE
69、D -c ../threads/thread.cc</p><p> ../threads/thread.cc: In member function ‘void Thread::SelfTest()’:</p><p> ../threads/thread.cc:471: warning: deprecated conversion from string constant to ‘
70、char*’</p><p> g++ bitmap.o debug.o libtest.o sysdep.o interrupt.o stats.o timer.o console.o machine.o mipssim.o translate.o network.o disk.o alarm.o kernel.o main.o scheduler.o synch.o thread.o addrspace.o
71、 exception.o synchconsole.o directory.o filehdr.o filesys.o pbitmap.o openfile.o synchdisk.o post.o switch.o -o nachos</p><p> root@ubuntu:~/桌面/18新/a測(cè)試創(chuàng)建線程/NachOS-4.1/code/build.linux# ./nachos</p>
72、<p> root@ubuntu:~/桌面/18新/a測(cè)試創(chuàng)建線程/NachOS-4.1/code/build.linux# ./nachos -x ../test/halt.noff</p><p> 5、2 測(cè)試創(chuàng)建線程</p><p> root@ubuntu:~/桌面/18新/a測(cè)試創(chuàng)建線程/NachOS-4.1/code/build.linux# ./nacho
73、s -K</p><p> 5、3 測(cè)試線程優(yōu)先級(jí)</p><p> root@ubuntu:~/NachOS-4.1/code/build.linux# ./nachos -K</p><p><b> 總結(jié)</b></p><p> 通過這次對(duì)nachos線程機(jī)制的擴(kuò)充,較深入理解了操作系統(tǒng)的內(nèi)核中對(duì)線程的
74、管理和基本調(diào)度,對(duì)線程的4種狀態(tài) 也有了較好的了解和運(yùn)用。只是這個(gè)是線程的基于優(yōu)先級(jí)的搶占式調(diào)度是靜態(tài)的,動(dòng)態(tài)的搶占式線程調(diào)度還沒有很好的實(shí)現(xiàn)。</p><p> 本次課程設(shè)計(jì)主要圍繞nachos線程模塊做了分析,覺得nachos雖小但是它是一個(gè)完整的基本的操作系統(tǒng),各個(gè)模塊的實(shí)現(xiàn)雖然簡(jiǎn)單,但是它們之間相互協(xié)作能夠形成一個(gè)系統(tǒng),我覺得這就是操作系統(tǒng)的精髓,正如積小流以成江河的道理一樣。真正的做一個(gè)操作系統(tǒng),我認(rèn)
75、為不在于其算法有多優(yōu)秀,而在于其算法有多適用,算法的適用都是因不同的環(huán)境而定的。這次課程設(shè)計(jì),我閱讀了不少的代碼,從實(shí)踐的角度了解了操作系統(tǒng),我覺得我的收獲很大。操作系統(tǒng)不僅僅是一門理論性很強(qiáng)的課程,我覺得應(yīng)該更看重它的實(shí)用性。有些東西本來是很通俗易懂的,拿到理論的層面上,便變得很枯燥、很難懂。Nachos利用其簡(jiǎn)單易懂的設(shè)計(jì)使我們對(duì)課本上的概念有了更深刻的理解。</p><p> 在這次作業(yè)的過程中遇到一些困
76、難,因?yàn)樽约旱碾娔X是64位的,而能找到的交叉編譯器只有32位的,這對(duì)作業(yè)的進(jìn)度造成很大的影響,因?yàn)檫@只能用同學(xué)的電腦做,但是尤其同學(xué)也有自己的課程設(shè)計(jì)要做,因此時(shí)間上就顯得少了,最后只實(shí)現(xiàn)了少部分的功能。慶幸的是,Code::blocks 10.05在代碼閱讀和調(diào)試中起到了很大的作用,因?yàn)槠渲С执a的編譯,可以測(cè)試NachOS 各部分的實(shí)現(xiàn)情況,雖然不能將測(cè)試結(jié)果直接輸出,但是間接地給出了各部分是否能實(shí)現(xiàn)。這次課程設(shè)計(jì)應(yīng)該很大一部分得益
77、于此。</p><p> 對(duì)于操作系統(tǒng)的學(xué)習(xí),對(duì)于我們而言其實(shí)是很抽象的,它不像其他課程的學(xué)習(xí),雖然在專業(yè)學(xué)習(xí)的過程中,經(jīng)常與之打交道,但是并不知道它是怎樣實(shí)現(xiàn)進(jìn)程的調(diào)度的,再有一點(diǎn)是我們對(duì)硬件也不是很熟悉它們的構(gòu)造。盡管在學(xué)習(xí)電子技術(shù)時(shí)接觸到一些,但是畢竟沒有親手動(dòng)手去做過,只是在實(shí)驗(yàn)時(shí),在封閉的情況下知道大概的構(gòu)造,沒有直觀地接觸過,這都使得操作系統(tǒng)給人神秘不可知的感覺。</p><p&
78、gt; 在學(xué)習(xí)操作系統(tǒng)的過程中,自我感覺我們的課程安排的不是很合理,不知道是不是我的認(rèn)知問題,我認(rèn)為不管學(xué)什么最好還是從底層來做,還有一點(diǎn)就是有更多的實(shí)踐,寓教于實(shí)踐。在此我只說說我在大學(xué)兩年半以來的學(xué)習(xí)感想,首先聲明計(jì)算機(jī)雖然是我的第一志愿,但是當(dāng)初報(bào)志愿的時(shí)候?qū)@一專業(yè)并不是很了解,所以我也并不認(rèn)為自己的想法一定就是正確的。我的第一感受是迷糊,還不是一般的迷糊。我不知道以前的專業(yè)課程安排是怎樣的,可是現(xiàn)在的課程安排卻讓我感覺很不合
79、理。</p><p> 第一,我還是堅(jiān)持自己的觀點(diǎn),我認(rèn)為學(xué)什么還是從底層開始,有了底層的基礎(chǔ)再來做上層次的學(xué)習(xí)應(yīng)該會(huì)更容易接受和理解;第二,不知道是老師習(xí)慣了以前的教學(xué)還是老師不知道我們現(xiàn)在的課程安排改動(dòng),很多老師在講課的時(shí)候,遇到一些問題,老師總是覺得我們?cè)诹硗獾恼n程中已經(jīng)學(xué)過了,盡管老師提到的那門課程我們要在以后的學(xué)期才會(huì)學(xué)到,于是就那樣過去了;第三,當(dāng)知道我要做什么或者是這個(gè)專業(yè)或行業(yè)需要我們具備哪些能
80、力的時(shí)候,往往是我們?cè)诖髮W(xué)的時(shí)間已過去大半,所以我認(rèn)為在我們學(xué)這個(gè)專業(yè)之初,能夠先了解一下我們將要學(xué)習(xí)的這個(gè)專業(yè)的行情是很必要的;第四,這個(gè)應(yīng)該是和我們這個(gè)專業(yè)關(guān)系不大的一點(diǎn),我不知道學(xué)校為什么不允許轉(zhuǎn)專業(yè),這其實(shí)對(duì)于初上大學(xué)的新生來言是一種不公平,這或許是中國(guó)教育的問題,也或許是我所在的地方的原因,在大學(xué)之前,我不知道什么專業(yè)更合適自己,或者說我更喜歡更感興趣的專業(yè)是什么名字,等上了大學(xué)之后才發(fā)現(xiàn)原來我感興趣的專業(yè)不是叫這個(gè)名字,但是
81、又因?yàn)閷W(xué)校的規(guī)定,不能轉(zhuǎn)專業(yè),對(duì)于自己選的專業(yè)又不感興趣,于是大學(xué)的前兩年在矛盾中度過,大學(xué)的后兩年為了以后的生計(jì)又是郁悶著逼迫自己學(xué)自己所選的專業(yè)。如果是自制能力很強(qiáng)的</p><p> 提出我的幾點(diǎn)希望:第一,對(duì)freshman 先給他們一個(gè)專業(yè)的介紹,這個(gè)介紹不能只是要學(xué)什么,還要有能做什么;第二,分專業(yè)時(shí)的專業(yè)介紹不能只是講哪個(gè)專業(yè)的優(yōu)點(diǎn),還應(yīng)講講各自的局限,畢竟對(duì)于年輕的學(xué)生在這方面的認(rèn)知畢竟是有限的
溫馨提示
- 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. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)系統(tǒng)管理課程設(shè)計(jì)
- 課程設(shè)計(jì)--超市銷售系統(tǒng)管理
- nachos線程通信和調(diào)度分析操作系統(tǒng)課程設(shè)計(jì)
- 學(xué)生信息系統(tǒng)管理課程設(shè)計(jì)
- 工廠管理系統(tǒng)課程設(shè)計(jì)說明書
- 學(xué)生管理系統(tǒng)課程設(shè)計(jì)說明書
- 醫(yī)院管理系統(tǒng)課程設(shè)計(jì)說明書
- 學(xué)信生息系統(tǒng)管理課程設(shè)計(jì)
- c語言課程設(shè)計(jì)--學(xué)生選課系統(tǒng)管理
- c語言課程設(shè)計(jì)——小型公司系統(tǒng)管理
- 數(shù)據(jù)庫(kù)課程設(shè)計(jì)--系統(tǒng)管理模塊
- c語言課程設(shè)計(jì)——小型公司系統(tǒng)管理
- 倉(cāng)儲(chǔ)管理系統(tǒng)-課程設(shè)計(jì)說明書
- 采購(gòu)管理系統(tǒng)課程設(shè)計(jì)說明書
- 操作系統(tǒng)課程設(shè)計(jì)(文件系統(tǒng)管理)
- vfp課程設(shè)計(jì)--學(xué)生管理系統(tǒng)課程設(shè)計(jì)說明書
- 高校圖書館管理系統(tǒng)管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- 學(xué)生管理系統(tǒng)課程設(shè)計(jì)說明書 (2)
- 圖書管理系統(tǒng)課程設(shè)計(jì)說明書
- 醫(yī)院管理系統(tǒng)-醫(yī)院管理系統(tǒng)課程設(shè)計(jì)說明書
評(píng)論
0/150
提交評(píng)論