freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

nachos線程通信和調(diào)度分析操作系統(tǒng)課程設(shè)計(jì)(編輯修改稿)

2025-07-11 11:02 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 方法,如 Nachos 需要定期地檢查是否有終端的輸入、網(wǎng)絡(luò)是否有發(fā)給自己的報(bào)文 錯(cuò)誤 !未找到引用源。 等都是用這種方式實(shí)現(xiàn)。詳見(jiàn) 以及 。 TimeOfextInterrupt()方法的作用是計(jì)算下一次時(shí)鐘中斷發(fā)生的時(shí)機(jī),如果需要時(shí)鐘中斷發(fā)生的時(shí)機(jī)是隨機(jī)的,可以在 Nachos 命令行中設(shè)置 –rs 選項(xiàng)。這樣,Nachos 的線程切換的時(shí)機(jī)將會(huì)是隨機(jī)的。但是此時(shí)時(shí)鐘中斷 則不能作為系統(tǒng)計(jì)時(shí)的標(biāo)準(zhǔn)了。 二、 理解 Nachos中線程運(yùn)行機(jī)制 NachOS課程設(shè)計(jì) Nachos 為線程提供的功能函數(shù)有 : 1. 生成一個(gè)線程 (Fork) 2. 使線程睡眠等待 (Sleep) 3. 結(jié)束線程 (Finish) 4. 設(shè)置線程狀態(tài) (setStatus) 5. 放棄處理機(jī) (Yield) 線程系統(tǒng)的結(jié)構(gòu)如圖所示 : 用戶進(jìn)程 信號(hào)量 條件變量 鎖 Thread類 模擬中斷 正文切換 線程調(diào)度 Nachos中的系統(tǒng)線程和用戶進(jìn)程 宿主機(jī) CPU和寄存器 系統(tǒng)線程 系統(tǒng)線程 系統(tǒng)線程 系統(tǒng)線程 用戶程序 用戶進(jìn)程 系統(tǒng)線程 用戶程序 系統(tǒng)線程 用戶程序 虛擬機(jī) CPU和寄存器 NachOS課程設(shè)計(jì) Nachos 線程系統(tǒng) 的結(jié)構(gòu) 線程管理 錯(cuò)誤 !未找到引用源。 系統(tǒng)中,有兩個(gè)與機(jī)器相關(guān)的函數(shù),正文切換過(guò)程依賴于具體的機(jī)器,這是因?yàn)橄到y(tǒng)線程切換是借助于宿主機(jī)的正文切換,正文切換過(guò)程中的寄存器保護(hù),建立初始調(diào)用框架等操作對(duì)不同的處理機(jī)結(jié)構(gòu)是不一樣的。其中一個(gè)函數(shù)是 ThreadRoot,它是所有線程運(yùn)行的入口;另一個(gè)函數(shù)是SWITCH,它負(fù)責(zé)線程之間的切換。 Scheduler 類用于實(shí)現(xiàn)線程的調(diào)度。它維護(hù)一個(gè)就緒線程隊(duì)列,當(dāng)一個(gè)線程可以占用處理機(jī)時(shí),就可以調(diào)用 ReadyToRun方法把這個(gè)線程放入就緒線程隊(duì)列,并把線程 狀態(tài)改成就緒態(tài)。 FindNextToRun方法根據(jù)調(diào)度策略,取出下一個(gè)應(yīng)運(yùn)行的線程,并把這個(gè)線程從就緒線程隊(duì)列中刪除。如果就緒線程隊(duì)列為空,則此函數(shù)返回空 (NULL)。現(xiàn)有的調(diào)度策略是先進(jìn)先出策略 (FIFO), Thread類的對(duì)象既用作線程的控制塊,相當(dāng)于進(jìn)程管理中的 PCB,作用是保存線程狀態(tài)、進(jìn)行一些統(tǒng)計(jì),又是用戶調(diào)用線程系統(tǒng)的界面。 用戶生成一個(gè)新線程的方法是 : Thread* newThread = new Thread(New Thread)。// 生成一個(gè)線程類 newThreadFork(ThreadFunc, ThreadFuncArg)。// 定義新線程的執(zhí)行函數(shù)及其參數(shù) Fork方法分配一塊固定大小的內(nèi)存作為線程的堆棧,在棧頂放入 ThreadRoot的地址。當(dāng)新線程被調(diào)上 CPU時(shí),要用 SWITCH函數(shù)切換線程圖像, SWITCH函數(shù)返回時(shí),會(huì)從棧頂取出返回地址,于是將 ThreadRoot放在棧頂,在 SWITCH結(jié)束后就會(huì)立即執(zhí)行 ThreadRoot 函數(shù)。 ThreadRoot 是所有線程的入口,它會(huì)調(diào)用 Fork的兩個(gè)參數(shù),運(yùn)行用戶指定的函數(shù); Yield方法用于本線程放棄處理機(jī)。NachOS課程設(shè)計(jì) Sleep方法可以使當(dāng)前線程轉(zhuǎn)入阻塞態(tài),并放棄 CPU,直到被另一個(gè)線程喚醒,把它放回就緒線程隊(duì)列。在沒(méi)有就緒線程時(shí),就把時(shí)鐘前進(jìn)到一個(gè)中斷發(fā)生的時(shí)刻,讓中斷發(fā)生并處理此中斷,這是因?yàn)樵跊](méi)有線程占用 CPU 時(shí),只有中斷處理程序可能喚醒一個(gè)線程,并把它放入就緒線程隊(duì)列。 線程要等到本線程被喚醒后,并且又被線程調(diào)度模塊調(diào)上 CPU 時(shí),才會(huì)從Sleep 函數(shù)返回。有趣的是,新取出的就緒線程有可能就是這個(gè)要睡眠的線程。例如,如果系統(tǒng)中只有一個(gè) A 線程, A 線程在讀磁盤的時(shí)候會(huì)進(jìn)入睡眠,等待磁盤操作完成。因?yàn)檫@時(shí)只有一個(gè)線程,所以 A 線程不會(huì)被調(diào)下 CPU,只是在循環(huán)語(yǔ)句中等待中斷。當(dāng)磁盤操作完成時(shí),磁盤會(huì)發(fā)出一個(gè)磁盤讀操作中斷,此中斷將喚醒 A 線程,把它放入就緒隊(duì)列。這樣,當(dāng) A 線程跳出循環(huán)時(shí),取出的就緒線程就是自己。這就要求線程的正文切換程序可以將一個(gè)線程切換到自己, Nachos 的線程正文切換程序 SWITCH可以做到這一點(diǎn),于是 A線程實(shí)際上并沒(méi)有被調(diào)下 CPU,而是繼續(xù)運(yùn)行下去了。 Nachos 線程管理 錯(cuò)誤 !未找到引用源。 系統(tǒng)的初步實(shí)現(xiàn) 1. 工具模塊分析(文件 ) 工具模塊定義了一些在 Nachos 設(shè)計(jì)中有關(guān)的工具函數(shù),和整個(gè)系統(tǒng)的設(shè)計(jì)沒(méi)有直接的聯(lián)系,所以這里僅作一個(gè)簡(jiǎn)單的介紹。 List類在 Nachos 中廣泛使用,它定義了一個(gè)鏈表結(jié)構(gòu),有關(guān) List的數(shù)據(jù)結(jié)構(gòu)和實(shí)現(xiàn)如下所示: class ListElement { // 定義了 List中的元素類型 public: ListElement(void *itemPtr, int sortKey)。 // 初始化方法 ListElement *next。 // 指向下一個(gè)元素 的指針 int key。 // 對(duì)應(yīng)于優(yōu)先隊(duì)列的鍵值 NachOS課程設(shè)計(jì) void *item。 // 實(shí)際有效的元素指針 }。 其中,實(shí)際有效元素指針是 (void *)類型的,說(shuō)明元素可以是任何類型。 class List { public: List()。 // 初始化方法 ~List()。 // 析構(gòu)方法 void Prepend(void *item)。 // 將新元素增加在鏈?zhǔn)? void Append(void *item)。 // 將新元素增加在鏈尾 void *Remove()。 // 刪除鏈?zhǔn)自夭⒎祷卦撛? void Mapcar(VoidFunctionPtr func)。 // 將函數(shù) func作用在鏈中每個(gè)元素上 bool IsEmpty()。 // 判斷鏈表是否為空 void SortedInsert(void *item, int sortKey)。 // 將元素根據(jù) key 值優(yōu)先權(quán)插入到鏈中 void *SortedRemove(int *keyPtr)。 // 將 key值最小的元素從鏈中刪除, // 并返回該元素 private: ListElement *first。 // 鏈表中的第一個(gè)元素 ListElement *last。 // 鏈表中的最后一個(gè)元素 }。 其它的工具函數(shù)如 min和 max以及一些同調(diào)試有關(guān)的函數(shù),這里就不再贅述。 2. 線程啟動(dòng)和調(diào)度模塊分析(文件 ) 線程啟動(dòng)和線程調(diào)度是線程管理 錯(cuò)誤 !未找到引用源。 的重點(diǎn)。在 Nachos 中,線程是最小的調(diào)度單位,在同一時(shí)間內(nèi),可以有幾個(gè)線程處于就緒狀態(tài)。 Nachos的線程切換借助于宿主機(jī)的正文切換,由于這部分內(nèi)容與機(jī)器密切相關(guān),而且直接同宿主機(jī)的寄存器進(jìn)行交道,所以這部分是用匯編來(lái)實(shí)現(xiàn)的。由于 Nachos 可以運(yùn)行在多種機(jī)器上,不同機(jī)器的寄存器數(shù)目和作用不一定相同,所以在 中針對(duì)不同的機(jī)器進(jìn)行了不同的處理。讀者如果需要將 Nachos 移植到其它機(jī)器上,就需要修改這部分的內(nèi)容。 NachOS課程設(shè)計(jì) ThreadRoot函數(shù) Nachos 中,除了 main線程外,所有其它線程都是從 ThreadRoot入口運(yùn)行的。它的語(yǔ)法是: ThreadRoot (int InitialPC, int InitialArg, int WhenDonePC, int StartupPC) 其中, InitialPC指明新生成線程的入口函數(shù)地址, InitialArg是該入口函數(shù)的參數(shù); StartupPC 是在運(yùn)行該線程是需要作的一些初始化工作,比如開(kāi)中斷;而WhenDonePC 是當(dāng)該線程運(yùn)行結(jié)束時(shí)需要作的一些后續(xù)工作。在 Nachos 的源代碼中,沒(méi)有任何一個(gè)函數(shù)和方法顯式地調(diào)用 ThreadRoot 函數(shù), ThreadRoot 函 數(shù)只有在線程切換時(shí)才被調(diào)用到。一個(gè)線程在其初始化的最后準(zhǔn)備工作中調(diào)用StackAllocate 方法(見(jiàn)本章 ),該方法設(shè)置了幾個(gè)寄存器的值( InterruptEnable函數(shù)指針, ThreadFinish 函數(shù)指針以及該線程需要運(yùn)行函數(shù)的函數(shù)指針和運(yùn)行函數(shù)的參數(shù)) ,該線程第一次被切換上處理機(jī)運(yùn)行時(shí)調(diào)用的就是 ThreadRoot函數(shù)。其工作過(guò)程是: 1. 調(diào)用 StartupPC 函數(shù); 2. 調(diào)用 InitialPC 函數(shù); 3. 調(diào)用 WhenDonePC 函數(shù); 這里我們可以看到,由 ThreadRoot入口可以轉(zhuǎn)而 運(yùn)行線程所需要運(yùn)行的函數(shù),從而達(dá)到生成線程的目的。 SWITCH函數(shù) Nachos 中系統(tǒng)線程的切換是借助宿主機(jī)的正文切換。 SWITCH函數(shù)就是完成線程切換的功能。 SWITCH的語(yǔ)法是這樣的: void SWITCH (Thread *t1, Thread *t2)。 其中 t1 是原運(yùn)行線程指針, t2 是需要切換到的線程指針。線程切換的三步曲NachOS課程設(shè)計(jì) 是: 1. 保存原運(yùn)行線程的狀態(tài) 2. 恢復(fù)新運(yùn)行線程的狀態(tài) 3. 在新運(yùn)行線程的??臻g上運(yùn)行新線程 3. 線程模塊分析(文件 ) Thread類實(shí) 現(xiàn)了操作系統(tǒng)的線程控制塊,同操作系統(tǒng)課程中進(jìn)程程管理中的PCB (Process Control Block) 有相似之處。 Thread 線程控制類較 PCB 為簡(jiǎn)單的多,它沒(méi)有線程標(biāo)識(shí) (pid)、實(shí)際用戶標(biāo)識(shí) (uid)等和線程操作不是非常有聯(lián)系的部分,也沒(méi)有將 PCB 分成 proc 結(jié)構(gòu)和user 結(jié)構(gòu)。這是因?yàn)橐粋€(gè) Nachos 線程是在宿主機(jī)上運(yùn)行的。無(wú)論是系統(tǒng)線程和用戶進(jìn)程, Thread線程控制類的實(shí)例都生成在宿主機(jī)而不是生成在虛擬機(jī)上。所以不存在實(shí)際操作系統(tǒng)中 proc 結(jié)構(gòu)常駐內(nèi)存,而 user 結(jié)構(gòu)可以存放在盤交 換區(qū)上的情況,將原有的兩個(gè)結(jié)構(gòu)合并是 Nachos 作的一種簡(jiǎn)化。 Nachos 對(duì)線程的另一個(gè)簡(jiǎn)化是每個(gè)線程棧段的大小是固定的,為 40965 個(gè)字 (word),而且是不能動(dòng)態(tài)擴(kuò)展的。所以 Nachos 中的系統(tǒng)線程中不能使用很大的棧空間,比如: void foo () { int buff[10000]。 ...} 可能會(huì)不能正常執(zhí)行,如果需要使用很大空間,可以在 Nachos 的運(yùn)行堆中申請(qǐng): void foo () { int *buf = new int[10000]。 ...} 如果系統(tǒng)線程需要使用的???間大于規(guī)定棧空間的大小,可以修改 StackSize宏定義。 Thread類的定義和實(shí)現(xiàn)如下所示: class Thread { NachOS課程設(shè)計(jì) private: int* stackTop。 // 當(dāng)前堆棧指針 int machineState[MachineStateSize]。 // 宿主機(jī)的運(yùn)行寄存器 public: Thread(char* debugName)。 // 初始化線程 ~Thread()。 // 析構(gòu)方法 void Fork(VoidFunctionPtr func, int arg)。 // 生成一個(gè)新線程,執(zhí)行func(arg) void Yield()。 // 切換到其它線程運(yùn)行 void Sleep()。 // 線程進(jìn)入睡眠狀態(tài) void Finish()。 // 線程結(jié)束時(shí)調(diào)用 void CheckOverflow()。 // 測(cè)試線程棧段是
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1