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

正文內(nèi)容

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

2025-07-11 11:02 本頁面
 

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