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

正文內(nèi)容

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

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

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