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

正文內(nèi)容

nachos線程通信和調(diào)度分析操作系統(tǒng)課程設(shè)計(參考版)

2025-06-09 11:02本頁面
  

【正文】 在 Nachos 中,系統(tǒng)調(diào)用用其它異常陷入的入口處理函數(shù)都是ExceptionHandler 函數(shù),只是陷入的類型為 SyscallException。 的與核心密切相關(guān)的部分,而將其它部分轉(zhuǎn)化成開發(fā)系統(tǒng)的一部分,作為開發(fā)系統(tǒng)的標(biāo)準(zhǔn)函數(shù)提供,運行在用戶態(tài)下。 的執(zhí)行效率和用途;因為不是每種應(yīng)用都會用到所有的系統(tǒng)調(diào)用,系統(tǒng)調(diào)用數(shù)目太多,則會使得操作系統(tǒng)的NachOS課程設(shè)計 核心過于龐大而同樣影響系統(tǒng)的效率。系統(tǒng)調(diào)用作為操作系統(tǒng)的一部分,它們是長駐內(nèi)存 的。 一般的 UNIX操作系統(tǒng)提供幾十條甚至上百條系統(tǒng)調(diào)用,系統(tǒng)調(diào)用的多少取決于操作系統(tǒng)的復(fù)雜程度及其主要的適用范圍。所以系統(tǒng)調(diào)用也被看作軟件指令,它是在用戶態(tài)下運行的程序和操作系統(tǒng)的界面。但是在軟件開發(fā)過程中我們發(fā)現(xiàn),有些指令序列需要重復(fù)使用,正如在結(jié)構(gòu)化程序開發(fā)中,函數(shù)可以被重復(fù)調(diào)用一樣。 二、系統(tǒng)調(diào)用 (文件 , , ) 系統(tǒng)陷入有兩大原因:即系統(tǒng)調(diào)用和系統(tǒng)出錯陷入。 空間的轉(zhuǎn)換頁表覆蓋模擬機(jī)的轉(zhuǎn)換頁表 machine Run()。 // 恢復(fù)處理機(jī)用戶程序 錯誤 !未找到引用源。 空間初始化之后(設(shè)由 space 指針指向),真正的啟動運行過程如下: space InitRegisters()。 空間的實現(xiàn)非常簡單,這是因為系統(tǒng)一次只能運行一個用戶程序的局限和使用了線性頁面轉(zhuǎn)換表而決定NachOS課程設(shè)計 的。 實現(xiàn): 賦值實現(xiàn)。 功能: 恢復(fù)處理機(jī)用戶程序 錯誤 !未找到引用源。 實現(xiàn): 目前為空。 功能: 存儲用戶程序 錯誤 !未找到引用源。 實現(xiàn): 設(shè)置 PC指針、棧指針的初值,并將其它寄存器的值設(shè)置為 0。 功能: 初始化寄存器,讓用戶程序 錯誤 !未找到引用源。 實現(xiàn)以后,這部分內(nèi)容也將做改動。 大小是有限制的,必須小于模擬的物理內(nèi)存空間大小,否則出錯。當(dāng)讀者需要加強(qiáng)這部分內(nèi)容時,需要增加內(nèi)存分配算法。 時,有如下的限制: ? 系統(tǒng)一次只能有運行一個用戶程序 錯誤 !未找到引用源。 的正文段和數(shù)據(jù)段依次調(diào)入內(nèi)存,棧段記錄的是用戶程序的運行狀態(tài),它的位置緊接于數(shù)據(jù)段之后。 線性頁表。如果大于整個模擬的物理內(nèi)存空間,出錯返回。 實現(xiàn): 1. 判斷打開文件是否符合可執(zhí)行代碼的格式,如果不符合,出錯返回 2. 將用戶程序 錯誤 !未找到引用源。 生成方法 語法: AddrSpace (OpenFile *executable) 參數(shù): Executable: 需要執(zhí)行代碼 的打開文件結(jié)構(gòu) 功能: 初始化用戶程序 錯誤 !未找到引用源。 在 Linux系統(tǒng)中,使用 gcc交叉編譯技術(shù)將 C程序編譯成 R2/3000錯誤 !未找到引用源。 // 用戶程序 錯誤 !未找到引用源。 // 用戶程序 錯誤 !未找到引用源。 // 保存當(dāng)前機(jī)器頁表狀態(tài) void RestoreState()。 //析構(gòu)方法 void InitRegisters()。 //根據(jù)可執(zhí)行文件構(gòu)成用戶程序 錯誤 !未找到引用源 。 其中,用戶程序 錯誤 !未找到引用源。 // 線程切換時恢復(fù)虛擬機(jī)寄存器組 NachOS課程設(shè)計 AddrSpace *space。 // 虛擬機(jī) 的寄存器組 void SaveUserState()。核心部分同一般的系統(tǒng)線程沒有區(qū)別,它共用了 Nachos 的正文段和數(shù)據(jù)段,運行在宿主機(jī)上;而用戶程序部分則有自己的正文段、數(shù)據(jù)段和棧段,它存儲在 Nachos 的模擬內(nèi)存中,運行在 Nachos 的模擬機(jī)上。 空間 (文件 , ) Nachos 的用戶進(jìn)程由兩部分組成:核心部分和用戶程序 錯誤 !未找到引用源。 在實際的系統(tǒng)中,線性頁面地址轉(zhuǎn)換和 TLB頁面地址轉(zhuǎn)換只能二者取一,目前為簡便起見, Nachos 選擇了前者,讀者可以自行完成 TLB頁面地址轉(zhuǎn)換的實現(xiàn)。由于 TLB 轉(zhuǎn)換頁表是硬件實現(xiàn)的,所以指向TLB 轉(zhuǎn)換頁表的指針應(yīng)該是只讀的,所以 Machine 類 錯誤 !未找到引用源。如果 TLB表已滿,就需要對 TLB 表項做 LRU替換。這樣就可能出現(xiàn)邏輯地址轉(zhuǎn)換失敗的現(xiàn)象,會發(fā)生 PageFaultException 異常。 TLB頁面轉(zhuǎn)換則不同, TLB轉(zhuǎn)換頁表是硬件來實現(xiàn)的,表的大小一般較實際的用戶程序 錯誤 !未找到引用源。當(dāng)其被切換上模擬處理機(jī)上運行時,需要將進(jìn)程的線性頁面轉(zhuǎn)換表覆蓋模擬處理機(jī)的線性頁面轉(zhuǎn)換表。在作轉(zhuǎn)換時,給出邏輯地址,計算出其所在的邏輯頁號和頁中偏移量,通過查詢轉(zhuǎn)換表(實際上在使用線性頁面地址轉(zhuǎn)換時, TranslationEntry結(jié)構(gòu)中的 virtualPage 是多余的,線性頁面轉(zhuǎn)換表的下標(biāo)就是邏輯頁號),即可以得到實際物理頁號和其頁中偏移量。 線性頁面地址轉(zhuǎn)換是一種較為簡單的方式,即用戶程序 錯誤 !未找到引用源。 的目的是為了執(zhí)行用戶程序 錯誤 !未找到引用源。 Nachos 處理的陷入有: 需要注意的是,雖然這里的很多方法和屬性規(guī)定為 public的,但是它們只能在系統(tǒng)核心內(nèi)被調(diào)用。系統(tǒng)調(diào)用可以看作是軟件指令,它們有效地彌補(bǔ)了機(jī)器硬件指令不足;系統(tǒng)出錯陷入在系統(tǒng)發(fā)生錯誤時發(fā)生,比如用戶程序使用了非法指令以及用戶程序邏輯地址同實際的物理地址映射出錯等情況。系統(tǒng)陷入有兩大類原因:進(jìn)行系統(tǒng)調(diào)用陷入和系統(tǒng)出錯陷入。 在用戶程序 錯誤 !未找到引用源。所以 Nachos 的一些重要的數(shù)據(jù)結(jié)構(gòu)如線程控制結(jié)構(gòu)等的數(shù)目可以是無限的,不受 Nachos 模擬內(nèi)存大小的限制。事實上, Nachos 的內(nèi)存只有當(dāng)需要執(zhí)行用戶程序 錯誤 !未找到引用源。為了簡便起見,每個內(nèi)存頁的大小同磁盤扇區(qū)的大小相同,而 整個內(nèi)存的大小遠(yuǎn)遠(yuǎn)小于模擬磁盤的大小。 的堆棧指針 RetAddrReg 31 存放過程調(diào)用的返回地址 HiReg 32 存放乘法結(jié)果的高 32位 LoReg 33 存放乘法結(jié)果的低 32位 PCReg 34 當(dāng)前 PC指針 NextPCReg 35 下一條執(zhí)行語句的 PC指針 PrevPCReg 36 上一條執(zhí)行語句的 PC指針(調(diào)試用) LoadReg 37 需要延遲載入的寄存器編號 LoadValueReg 38 需要延遲載入的寄存器值 BadAddReg 39 當(dāng)出錯陷入( Exception)時用戶程序 錯誤 !未找到引用源。 機(jī)( R2/3000錯誤 !未找到引用源。 三、 理解 Nachos中支持用戶進(jìn)程的機(jī)制 Nachos 對內(nèi)存、寄存器以及 CPU的模 擬 Nachos 機(jī)器模擬很重要的部分是內(nèi)存和寄存器的模擬。 在現(xiàn)有的 Nachos 中,沒有給出條件變量的實現(xiàn),條件變量的基本結(jié)構(gòu)也只給出了部分內(nèi)容,其它內(nèi)容可以視實現(xiàn)決定。 // 喚醒 等待該條件變量的線程 private: char* name。 // 線程進(jìn)入等待 void Signal(Lock *conditionLock)。 // 析構(gòu)方法 char* getName() { return (name)。條件變量總是和鎖機(jī)制一同使用,它的基本結(jié)構(gòu)如下: class Condition { public: Condition(char* debugName)。 條件變量 條件變量和信號量與鎖機(jī)制不一樣,它是沒有值的。 在現(xiàn)有的 Nachos 中,沒有給出鎖機(jī)制的實現(xiàn),鎖的基本結(jié)構(gòu)也只給 出了部分內(nèi)容,其它內(nèi)容可以視實現(xiàn)決定。 // 判斷鎖是否為現(xiàn)運行線程擁有 private: char* name。 // 獲得鎖方法 void Release()。 // 析構(gòu)方法 char* getName() { return name。 鎖的基本結(jié)構(gòu)如下所示: class Lock { public: Lock(char* debugName)。一個鎖有兩種狀態(tài), BUSY 和 FREE。 2. value++。 2. 當(dāng) value大于 0時, value。 P操作 1. 當(dāng) value等于 0時, . 將當(dāng)前運行線程放入線程等待隊列。線程等待隊列中存放所有等待該信號量的線程。 // 線程等待隊列 }。 // 信號量的 V操作 private: int value。 信號量 ( Semaphore ) Nachos已經(jīng)實現(xiàn)了 Semaphore,它的基本結(jié)構(gòu)如下所示: class Semaphore { public: void P()。 在同步互斥機(jī)制的實現(xiàn)中,很多操作都是原子操作。 c: 測試終端輸入輸出 和文件系統(tǒng)有關(guān)的選項: f: 格式化模擬磁盤 cp: 將一個文件從宿主機(jī)拷貝到 Nachos模擬磁盤上 p: 將 Nachos磁盤上的文件顯示出來 r: 將一個文件從 Nachos模擬磁盤上刪除 l: 列出 Nachos模擬磁盤上的文件 D: 打印出 Nachos文件系統(tǒng)的內(nèi)容 t: 測試 Nachos文件系統(tǒng)的效率 和網(wǎng)絡(luò)有關(guān)的選項: n: 設(shè)置網(wǎng)絡(luò)的可靠度(在 01之間的一個小數(shù)) NachOS課程設(shè)計 m: 設(shè)置自己的 HostID o: 執(zhí)行網(wǎng)絡(luò)測試程序 6. 同步機(jī)制模塊分析(文件 ) 線程的同步和互斥是多個線程協(xié)同工作的基礎(chǔ)。(由于不是每時 每刻都檢查棧段是否溢出,所以這時候線程的運行可能已經(jīng)出錯) 3. 將 nextThread的狀態(tài)設(shè)置成運行態(tài),并作為 currentThread現(xiàn)運行線程(在調(diào)用 Run方法之前,當(dāng)前運行線程已經(jīng)放入就緒隊列中,變成就緒態(tài)) (以上是運行在現(xiàn)有的線程棧空間上,以下是運行在 nextThread的??臻g上) 4. 切換到 nextThread線程運行 5. 釋放 threadToBeDestroyed線程需要??臻g(如果有的話) NachOS課程設(shè)計 6. 如果是用戶線程,恢復(fù)當(dāng)前虛擬機(jī)的狀態(tài) 返回: 空 5. Nachos主控模塊分析(文件 ) 該模塊是整個 Nachos 系統(tǒng)的入口,它分析了 Nachos 的命令行參數(shù),根據(jù)不同的選項進(jìn)行不同功能的初始化設(shè)置。讀者可以在這一點上進(jìn)行加強(qiáng),實現(xiàn)有優(yōu)先級的線程調(diào)度。調(diào)度算法非常簡單,就是取出第一個放在處理機(jī)運行即可。 } 返回: 空 4. 線程調(diào)度算法模塊分析(文件 ) 該模塊的作用是進(jìn)行線程的調(diào)度。 machineState[WhenDonePCState] = (int) ThreadFinish。 machineState[InitialPCState] = (int) func。 // 設(shè)置棧溢出標(biāo)志 machineState[PCState] = (int) ThreadRoot。 ThreadRoot函 數(shù) // 將會開中斷,并調(diào)用 func(arg)成為一個獨立的調(diào)度單位。 // 設(shè)置棧首指針 *(stackTop) = (int)ThreadRoot。 NachOS課程設(shè)計 實現(xiàn): void Thread::StackAllocate (VoidFunctionPtr func, int arg) { stack = (int *) AllocBoundedArray(StackSize * sizeof(int))。 實現(xiàn): 1. 申請線程棧空間 2. 初始化該??臻g,使其滿足 SWITCH函數(shù)進(jìn)行線程切換的條件 3. 將該線程放到就緒隊列中。 UserRegisters[]數(shù)組變量和 SaveUserState(), RestoreUserState()方法就是為了用戶進(jìn)程的切換設(shè)計的。 // 線程運行的用戶程序 錯誤 !未找到引用源。 // 線程切換時保存虛擬機(jī)寄存器 void RestoreUserState()。
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1