(精選word)nachos中文教程_第1頁(yè)
(精選word)nachos中文教程_第2頁(yè)
(精選word)nachos中文教程_第3頁(yè)
(精選word)nachos中文教程_第4頁(yè)
(精選word)nachos中文教程_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

(完整word版)Nachos中文教程(完整word版)Nachos中文教程PAGEPAGE3PAGE3(完整word版)Nachos中文教程TOC\o"1-5"第一章緒論 1第一節(jié)Nachos概述 1一、引言 1二、Nachos教學(xué)用操作系統(tǒng) 1第二節(jié)Nachos的實(shí)驗(yàn)環(huán)境 4一、Nachos的安裝 4二、Nachos的目錄結(jié)構(gòu) 4三、各個(gè)部分的編譯運(yùn)行 4四、應(yīng)用程序的編譯 5第二章機(jī)器模擬 6第一節(jié)概述 6第二節(jié)機(jī)器模擬的實(shí)現(xiàn) 101.Sysdep模塊分析(文件) 10PoolFile函數(shù) 10OpenForWrite函數(shù) 10OpenForReadWrite函數(shù) 10Read函數(shù) 10ReadPartial函數(shù) 11WriteFile函數(shù) 11Lseek函數(shù) 11Tell函數(shù) 11Close函數(shù) 11Unlink函數(shù) 12OpenSocket函數(shù) 12CloseSocket函數(shù) 12AssignNameToSocket函數(shù) 12DeAssignNameToSocket函數(shù) 12PoolSocket函數(shù) 12ReadFromSocket函數(shù) 13SendToSocket函數(shù) 13CallOnUserAbort函數(shù) 13Delay函數(shù) 13Abort函數(shù) 13Exit函數(shù) 14RandomInit函數(shù) 14Random函數(shù) 14AllocBoundedArray函數(shù) 14DeallocBoundedArray函數(shù) 142.中斷模塊分析(文件) 14PendingInterrupt類XE"Interrupt類" 16Interrupt類XE"Interrupt類" 17內(nèi)部使用方法 17內(nèi)部使用函數(shù) 18對(duì)外接口 183.時(shí)鐘中斷模塊分析(文件) 204.終端設(shè)備模塊分析(文件) 225.磁盤設(shè)備模塊分析(文件) 236.Nachos運(yùn)行情況統(tǒng)計(jì)(文件) 24第三章線程管理XE"線程管理"系統(tǒng) 25第一節(jié)進(jìn)程與線程 25一、進(jìn)程 251.進(jìn)程概念 252.進(jìn)程的狀態(tài)及狀態(tài)變化 253.進(jìn)程調(diào)度 264.進(jìn)程之間的同步和互斥 275.進(jìn)程的實(shí)施 286.進(jìn)程的創(chuàng)建 28二、線程 291.線程概念 292.進(jìn)程和線程的關(guān)系 30第二節(jié)Nachos的線程管理XE"線程管理" 31一、Nachos的線程管理XE"線程管理" 31二、Nachos線程管理XE"線程管理"同實(shí)際進(jìn)程管理的不同 33第三節(jié)Nachos線程管理XE"線程管理"系統(tǒng)的初步實(shí)現(xiàn) 341.工具模塊分析(文件) 342.線程啟動(dòng)和調(diào)度模塊分析(文件) 34ThreadRoot函數(shù) 34SWITCH函數(shù) 353.線程模塊分析(文件) 35Fork方法 37StackAllocate方法 38Yield方法 39Sleep方法 404.線程調(diào)度算法模塊分析(文件) 40Run方法 415.Nachos主控模塊分析(文件) 416.同步機(jī)制模塊分析(文件) 42信號(hào)量(Semaphore) 42鎖機(jī)制 42條件變量 43第四節(jié)線程管理XE"線程管理"系統(tǒng)作業(yè) 45第五節(jié)實(shí)現(xiàn)實(shí)例 47對(duì)線程的改進(jìn) 47對(duì)線程調(diào)度的改進(jìn) 48第四章文件管理系統(tǒng) 51第一節(jié)文件管理系統(tǒng)概述 51一、文件 511.文件結(jié)構(gòu) 512.文件訪問(wèn) 523.文件類型 524.文件屬性 535.文件操作 53二、目錄 541.目錄結(jié)構(gòu) 542.多級(jí)目錄結(jié)構(gòu) 553.文件路徑名 554.工作目錄 555.目錄結(jié)構(gòu)的勾連 556.目錄項(xiàng) 56三、UNIX文件系統(tǒng)的實(shí)現(xiàn) 561.UNIX文件系統(tǒng)中的主要結(jié)構(gòu) 562.UNIX文件系統(tǒng)存儲(chǔ)資源的分配和回收 58第二節(jié)Nachos文件管理系統(tǒng) 61第三節(jié)Nachos文件系統(tǒng)的實(shí)現(xiàn) 631.同步磁盤分析(文件、) 632.位圖模塊分析(文件、) 643.文件系統(tǒng)模塊分析(文件、) 64生成方法 65Create方法 65Open方法 66Remove方法 664.文件頭模塊分析(文件、) 665.打開文件結(jié)構(gòu)分析(文件、) 67ReadAt方法 67WriteAt方法 686.目錄模塊分析(文件) 68第四節(jié)文件管理系統(tǒng)作業(yè) 70第五章用戶程序XE"用戶程序"和虛擬內(nèi)存XE"虛擬內(nèi)存" 71第一節(jié)Nachos對(duì)內(nèi)存、寄存器以及CPU的模擬 711RaiseException方法 742ReadMem方法 743WriteMem方法 744Translate方法 745Run方法 75第二節(jié)Nachos用戶進(jìn)程運(yùn)行機(jī)制 77一、用戶程序XE"用戶程序"空間(文件,) 77生成方法 77InitRegisters方法 78SaveState方法 78RestoreState方法 78二、系統(tǒng)調(diào)用(文件,,) 78第三節(jié)虛存管理的設(shè)計(jì)和實(shí)現(xiàn) 80一、Nachos存儲(chǔ)管理的改進(jìn)要求 80二、一個(gè)虛擬存儲(chǔ)管理實(shí)現(xiàn)的實(shí)例 80虛擬存儲(chǔ)系統(tǒng)的總體設(shè)計(jì) 80缺頁(yè)中斷陷入及其調(diào)度算法 83虛存的存儲(chǔ)分配 85存儲(chǔ)保護(hù) 85實(shí)現(xiàn)中的一些細(xì)節(jié) 85第四節(jié)用戶程序XE"用戶程序"和虛擬存儲(chǔ)作業(yè) 87第六章Nachos的網(wǎng)絡(luò)系統(tǒng) 88第一節(jié)Nachos對(duì)物理網(wǎng)絡(luò)的模擬 88第二節(jié)Nachos的郵局協(xié)議 91PostalDelivery方法 92Send方法 93第三節(jié)網(wǎng)絡(luò)部分作業(yè) 94第一章 緒論第一節(jié) Nachos概述一、引言計(jì)算機(jī)操作系統(tǒng)是一門實(shí)踐性很強(qiáng)的課程。一般地闡述其工作原理,很可能使本來(lái)具體生動(dòng)的內(nèi)容變得十分抽象、枯燥并難以理解。解決好理論與實(shí)踐相結(jié)合的問(wèn)題是提高操作系統(tǒng)教學(xué)質(zhì)量的關(guān)鍵。一門好的操作系統(tǒng)實(shí)踐課將使讀者更加形象和深刻地理解課堂中講述的概念、原理和它們的應(yīng)用。國(guó)內(nèi)外許多著名的大學(xué)都在操作系統(tǒng)教學(xué)實(shí)踐方面作了大量研究,比較突出的有著名計(jì)算機(jī)專家設(shè)計(jì)和實(shí)現(xiàn)的MINIXXE"MINIX"。MINIX是一個(gè)比較完整的操作系統(tǒng),它的用戶界面類似于UNIX。說(shuō)它比較完整,是因?yàn)樗诉M(jìn)程管理、文件系統(tǒng)管理XE"文件系統(tǒng)管理"、存儲(chǔ)管理、設(shè)備管理以及I/O管理等操作系統(tǒng)的所有重要內(nèi)容,而且還包含了系統(tǒng)啟動(dòng)和Shell等實(shí)際操作系統(tǒng)不可缺少的部分。由于MINIX較UNIX的出現(xiàn)晚十年,所以在程序風(fēng)格上較原來(lái)的UNIX要好得多,更加結(jié)構(gòu)化和模塊化。包含有3000行注釋的12000行源代碼使整個(gè)系統(tǒng)較為容易閱讀和理解。但是MINIX作為教學(xué)用操作系統(tǒng)有它的不足之處,就是由于它的目標(biāo)是一個(gè)完整的操作系統(tǒng),必然要和具體的設(shè)備打交道;而且不同的機(jī)器指令集需要有不同的編譯器,所以MINIX的移植性并不令人滿意。一個(gè)MINIX操作系統(tǒng)需要占據(jù)一臺(tái)獨(dú)立的主機(jī),所以在網(wǎng)絡(luò)的配置和實(shí)現(xiàn)上比較復(fù)雜,讀者需要有一定的實(shí)踐經(jīng)驗(yàn)才能完成。上海交通大學(xué)開發(fā)的MOSXE"MOS"操作系統(tǒng)是另一個(gè)較成功的教學(xué)用操作系統(tǒng)。它是一個(gè)小型而功能較齊全的多道程序的操作系統(tǒng),主要包括作業(yè)調(diào)度管理和文件系統(tǒng)管理XE"文件系統(tǒng)管理",建立在一個(gè)只包含十幾條指令的指令集虛擬機(jī)基礎(chǔ)之上。由于MOS比較簡(jiǎn)單,讀者可以非常容易地理解操作系統(tǒng)課程中講述的進(jìn)程調(diào)度和文件系統(tǒng)等部分原理。MOS的不足是過(guò)于簡(jiǎn)單,不能涵蓋操作系統(tǒng)的大部分功能。MOS的虛擬機(jī)指令集是自定義的,沒(méi)有現(xiàn)成的編譯器,所以讀者必須直接編寫匯編程序才能在MOS虛擬機(jī)上運(yùn)行。這樣就缺乏開發(fā)大型應(yīng)用程序的能力。但是MOS畢竟給了讀者一個(gè)自由發(fā)揮的空間,在MOS的基礎(chǔ)上衍生出TOSXE"TOS"等學(xué)生自己定義和實(shí)現(xiàn)的相對(duì)完整的操作系統(tǒng)。二、Nachos教學(xué)用操作系統(tǒng)作為教學(xué)用操作系統(tǒng),需要實(shí)現(xiàn)簡(jiǎn)單并且盡量縮小與實(shí)際操作系統(tǒng)之間的差距,所以我們采用Nachos作為操作系統(tǒng)課程的教學(xué)實(shí)踐平臺(tái)。Nachos是美國(guó)加州大學(xué)伯克萊分校在操作系統(tǒng)課程中已多次使用的操作系統(tǒng)課程設(shè)計(jì)平臺(tái),在美國(guó)很多大學(xué)中得到了應(yīng)用,它在操作系統(tǒng)教學(xué)方面具有一下幾個(gè)突出的優(yōu)點(diǎn):采用通用虛擬機(jī)Nachos是建立在一個(gè)軟件模擬的虛擬機(jī)之上的,模擬了MIPSXE"MIPS"R2/3000XE"R2/3000"的指令集、主存、中斷系統(tǒng)、網(wǎng)絡(luò)以及磁盤系統(tǒng)等操作系統(tǒng)所必須的硬件系統(tǒng)。許多現(xiàn)代操作系統(tǒng)大多是先在用軟件模擬的硬件上建立并調(diào)試,最后才在真正的硬件上運(yùn)行。用軟件模擬硬件的可靠性比真實(shí)硬件高得多,不會(huì)因?yàn)橛布收隙鴮?dǎo)致系統(tǒng)出錯(cuò),便于調(diào)試。虛擬機(jī)可以在運(yùn)行時(shí)報(bào)告詳盡的出錯(cuò)信息,更重要的是采用虛擬機(jī)使Nachos的移植變得非常容易,在不同機(jī)器上移植Nachos,只需對(duì)虛擬機(jī)部分作移植即可。采用R2/3000XE"R2/3000"指令集的原因是該指令集為RISC指令集,其指令數(shù)目比較少。Nachos虛擬機(jī)模擬了其中的63條指令。由于R2/3000指令集是一個(gè)比較常用的指令集,許多現(xiàn)有的編譯器如gc++能夠直接將C或C++源程序編譯成該指令集的目標(biāo)代碼,于是就不必編寫編譯器,讀者就可以直接用C/C++語(yǔ)言編寫應(yīng)用程序,使得在Nachos上開發(fā)大型的應(yīng)用程序也成為可能。使用并實(shí)現(xiàn)了操作系統(tǒng)中的一些新的概念隨著計(jì)算機(jī)技術(shù)和操作系統(tǒng)技術(shù)的不斷發(fā)展,產(chǎn)生了很多新的概念。Nachos將這些新概念融入操作系統(tǒng)教學(xué)中,包括網(wǎng)絡(luò)、線程和分布式應(yīng)用。而且Nachos以線程作為一個(gè)基本概念講述,取代了進(jìn)程在以前操作系統(tǒng)教學(xué)中的地位。Nachos的虛擬機(jī)使得網(wǎng)絡(luò)的實(shí)現(xiàn)相當(dāng)簡(jiǎn)單。與MINIXXE"MINIX"不同,Nachos只是一個(gè)在宿主機(jī)上運(yùn)行的一個(gè)進(jìn)程。在同一個(gè)宿主機(jī)上可以運(yùn)行多個(gè)Nachos進(jìn)程,各個(gè)進(jìn)程可以相互通訊,作為一個(gè)全互連網(wǎng)絡(luò)的一個(gè)節(jié)點(diǎn);進(jìn)程之間通過(guò)Socket進(jìn)行通訊,模擬了一個(gè)全互連網(wǎng)絡(luò)。確定性調(diào)試比較方便;隨機(jī)因素使系統(tǒng)運(yùn)行更加真實(shí)因?yàn)椴僮飨到y(tǒng)的不確定性,所以在一個(gè)實(shí)際的系統(tǒng)中進(jìn)行多線程調(diào)試是比較困難的。由于Nachos是在宿主機(jī)上運(yùn)行的進(jìn)程,它提供了確定性調(diào)試的手段。所謂確定性調(diào)試,就是在同樣的輸入順序、輸入?yún)?shù)的情況下,Nachos運(yùn)行的結(jié)果是完全一樣的。在多線程調(diào)試中,可以將注意力集中在某一個(gè)實(shí)際問(wèn)題上,而不受操作系統(tǒng)不確定性的干擾。另外,不確定性是操作系統(tǒng)所必須具有的特征,Nachos采用了隨機(jī)因子模擬了真實(shí)操作系統(tǒng)的不確定性。簡(jiǎn)單而易于擴(kuò)展Nachos是一個(gè)教學(xué)用操作系統(tǒng)平臺(tái),它必須簡(jiǎn)單而且有一定的擴(kuò)展余地。Nachos不是向讀者展示一個(gè)成功的操作系統(tǒng),而是讓讀者在一個(gè)框架下發(fā)揮自己的創(chuàng)造性進(jìn)行擴(kuò)展。例如一個(gè)完整的類似于UNIX的文件系統(tǒng)是很復(fù)雜的,但是對(duì)于文件系統(tǒng)來(lái)說(shuō),無(wú)非是需要實(shí)現(xiàn)文件的邏輯地址到物理地址的映射以及實(shí)現(xiàn)文件inode、打開文件結(jié)構(gòu)、線程打開文件表等重要的數(shù)據(jù)結(jié)構(gòu)以及維護(hù)它們之間的關(guān)系。Nachos中具有所有這些內(nèi)容,但是在很多方面作了一定的限制,比如只有一級(jí)索引結(jié)構(gòu)限制了系統(tǒng)中最大文件的大小。讀者可以應(yīng)用學(xué)到的各種知識(shí)對(duì)文件系統(tǒng)進(jìn)行擴(kuò)展,逐步消除這些限制。Nachos在每一部分給出很多課程作業(yè),作為讀者進(jìn)行系統(tǒng)擴(kuò)展的提示和檢查對(duì)系統(tǒng)擴(kuò)展的結(jié)果。面向?qū)ο笮訬achos的主體是用C++的一個(gè)子集來(lái)實(shí)現(xiàn)的。目前面向?qū)ο笳Z(yǔ)言日漸流行,它能夠清楚地描述操作系統(tǒng)各個(gè)部分的接口。Nachos沒(méi)有用到面向?qū)ο笳Z(yǔ)言的所有特征,如繼承性、多態(tài)性等,所以它的代碼就更容易閱讀和理解。以下各章分五個(gè)部分講述Nachos的各個(gè)部分以及它們的功能。它們是機(jī)器模擬、線程管理XE"線程管理"、文件系統(tǒng)管理XE"文件系統(tǒng)管理"、用戶程序XE"用戶程序"和虛擬存儲(chǔ)以及網(wǎng)絡(luò)系統(tǒng)。各章的安排是:第二章分析Nachos虛擬機(jī)的各個(gè)部分,包括中斷系統(tǒng)、定時(shí)器、以及一些外部設(shè)備,如磁盤、鍵盤和顯示器。Nachos的應(yīng)用程序?qū)⒃谶@個(gè)虛擬機(jī)上運(yùn)行。第三章分析Nachos如何實(shí)現(xiàn)多線程機(jī)制以及Nachos的線程管理XE"線程管理"方法。Nachos沒(méi)有借助于屬主UNIX操作系統(tǒng)的多進(jìn)程機(jī)制,而是通過(guò)編寫自己的進(jìn)程圖象切換函數(shù)來(lái)實(shí)現(xiàn)多線程。該部分對(duì)Nachos的進(jìn)程圖象切換函數(shù)作了詳細(xì)介紹。第四章分析Nachos的文件系統(tǒng)。Nachos原有的文件系統(tǒng)非常簡(jiǎn)單,該部分在分析原有文件系統(tǒng)的基礎(chǔ)上提出了對(duì)文件系統(tǒng)的擴(kuò)展要求。第五章介紹用戶程序XE"用戶程序"和虛擬存儲(chǔ)。該部分補(bǔ)充介紹了Nachos對(duì)虛擬機(jī)內(nèi)存、寄存器以及CPU的模擬?,F(xiàn)有的Nachos系統(tǒng)沒(méi)有實(shí)現(xiàn)虛擬內(nèi)存XE"虛擬內(nèi)存",當(dāng)一個(gè)用戶進(jìn)程的邏輯地址空間較大時(shí),就不能在現(xiàn)有Nachos上運(yùn)行。該部分提出了虛擬內(nèi)存的概念,并且給出了一個(gè)實(shí)例。第六章論述了Nachos的網(wǎng)絡(luò)系統(tǒng),Nachos的網(wǎng)絡(luò)部分實(shí)現(xiàn)了不可靠的定長(zhǎng)報(bào)文XE"報(bào)文"傳送,在此之上需要建立可靠的網(wǎng)絡(luò),并實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用程序。PAGE50第二節(jié) Nachos的實(shí)驗(yàn)環(huán)境一、Nachos的安裝本書的實(shí)際實(shí)驗(yàn)環(huán)境是LinuxXE"Linux",Nachos可以運(yùn)行在內(nèi)核版本以上的各種Linux版本,包括Slackware和Redhat。編譯器的版本是版本以上。本書附有一張軟盤,磁盤的格式為DOS格式,磁盤上有一個(gè)名為“的壓縮文件。學(xué)生需要將此文件拷貝到自己的工作目錄下:~/$ mcopya:.并將其解開:~/$ gzip-dc|tarxf-二、Nachos的目錄結(jié)構(gòu)以上操作系統(tǒng)可以發(fā)現(xiàn)在工作目錄下生成一個(gè)名為的目錄。該目錄中含有:copyright文件Nachos的版權(quán)信息readme文件Nachos的readme信息文件Nachos的介紹文檔(Postscript格式)c++example目錄有關(guān)C++介紹和實(shí)例doc目錄Nachos各個(gè)部分介紹和原有的作業(yè)要求code目錄Nachos各個(gè)部分的源代碼最主要的部分是Nachos的源代碼部分。它的目錄結(jié)構(gòu)是:Makefile文件文件文件Nachos的Makefile文件。當(dāng)Nachos需要移植到其它系統(tǒng)時(shí),可以修改中的HOST參數(shù)machine目錄Nachos虛擬機(jī)模擬部分源代碼threads目錄Nachos線程管理XE"線程管理"部分源代碼filesys目錄Nachos文件系統(tǒng)管理XE"文件系統(tǒng)管理"部分源代碼userprog目錄Nachos用戶程序XE"用戶程序"部分源代碼network目錄Nachos網(wǎng)絡(luò)管理XE"網(wǎng)絡(luò)管理"部分源代碼vm目錄Nachos虛擬內(nèi)存XE"虛擬內(nèi)存"管理部分源代碼test目錄一些測(cè)試用應(yīng)用程序bin目錄包含有用戶程序XE"用戶程序"目標(biāo)碼變換的程序三、各個(gè)部分的編譯運(yùn)行Nachos的各個(gè)部分都可以獨(dú)立編譯運(yùn)行,也可以同時(shí)編譯各個(gè)部分。全部編譯可以采用如下命令: ~/$ make當(dāng)需要單獨(dú)編譯線程管理XE"線程管理"部分時(shí),先進(jìn)入threads目錄,然后采用如下命令: ~/threads$ makedepend ~/threads$ makenachos實(shí)際上,各部分目錄下都有一個(gè)Makefile文件,內(nèi)容大體相同,區(qū)別在于一些條件編譯的參數(shù)。比如在單獨(dú)編譯線程管理XE"線程管理"部分時(shí),文件管理部分就被屏蔽了,這樣讀者讀者就可以專心于線程管理部分的調(diào)試。四、應(yīng)用程序的編譯由于Linux指令集和R2/3000XE"R2/3000"指令集不同,用戶編寫的應(yīng)用程序用Linux系統(tǒng)中標(biāo)準(zhǔn)gcc編譯后,不能直接在Nachos虛擬機(jī)環(huán)境下運(yùn)行。所以需要采用交叉編譯技術(shù)。所謂交叉編譯技術(shù)是在一個(gè)操作系統(tǒng)下將源碼編譯成另一個(gè)操作系統(tǒng)的目標(biāo)碼,這里就是在Linux下通過(guò)gcc交叉編譯版本將用戶程序XE"用戶程序"的源碼編譯成R2/3000指令集的目標(biāo)碼。在Linux中,沒(méi)有缺省的交叉編譯工具。讀者可以到上海交通大學(xué)計(jì)算機(jī)系FTP服務(wù)器上下載,URL為: ,將解開至/usr/local/目錄下:/# gzip-dc|tarxf-在編譯用戶程序XE"用戶程序"時(shí),用交叉編譯器將源碼編譯成R2/3000XE"R2/3000"指令集的目標(biāo)代碼,再經(jīng)過(guò)一個(gè)簡(jiǎn)單的轉(zhuǎn)換就可以在Nachos虛擬機(jī)上運(yùn)行。注意,在讀者實(shí)現(xiàn)虛擬存儲(chǔ)之前,有些應(yīng)用程序可能會(huì)因?yàn)槭褂眠^(guò)多的內(nèi)存而不能運(yùn)行。第二章 機(jī)器模擬第一節(jié) 概述Nachos是建立在一個(gè)軟件模擬的虛擬機(jī)上的。該虛擬機(jī)包括計(jì)算機(jī)的基本部分:如CPU、主存、寄存器、中斷系統(tǒng),還包括一些外部設(shè)備,如終端設(shè)備、網(wǎng)絡(luò)以及磁盤系統(tǒng)。現(xiàn)代許多操作系統(tǒng)都是先在軟件模擬的硬件上建立并調(diào)試,最后才在真正的硬件上運(yùn)行。軟件模擬的硬件可靠性比真實(shí)的硬件高的多,不會(huì)因?yàn)橛布收隙鴮?dǎo)致系統(tǒng)出錯(cuò),因而便于調(diào)試。模擬的硬件還可以監(jiān)視程序?qū)τ布牟僮?,并加以?yán)格的限制,在程序誤操作時(shí)報(bào)告詳盡的出錯(cuò)信息。這些都是真實(shí)硬件難以做到的。用軟件來(lái)模擬硬件另一個(gè)優(yōu)點(diǎn)是充分利用了宿主機(jī)操作系統(tǒng)的軟件資源,避免了編寫復(fù)雜的硬件控制程序。更重要的是提高了程序的可移植性,只要在不同硬件上實(shí)現(xiàn)Nachos虛擬機(jī)就完成了Nachos的大部分移植工作。我們將Nachos移植到Linux上的工作就受益于這種設(shè)計(jì)。下面對(duì)Nachos的機(jī)器模擬部分作概要說(shuō)明。Nachos是用C++語(yǔ)言中的類來(lái)表示各個(gè)對(duì)象的。其中Machine類XE"Machine類"用來(lái)模擬計(jì)算機(jī)主機(jī)。它提供的功能有:讀寫寄存器。讀寫主存、運(yùn)行一條用戶程序XE"用戶程序"的匯編指令、運(yùn)行用戶程序、單步調(diào)試用戶程序、顯示主存和寄存器狀態(tài)、將虛擬內(nèi)存XE"虛擬內(nèi)存"地址轉(zhuǎn)換為物理內(nèi)存地址、陷入Nachos內(nèi)核等等。Machine類XE"Machine類"實(shí)現(xiàn)方法是在宿主機(jī)上分配兩塊內(nèi)存分別作為虛擬機(jī)的寄存器和物理內(nèi)存。運(yùn)行用戶程序XE"用戶程序"時(shí),先將用戶程序從Nachos文件系統(tǒng)中讀出,寫入模擬的物理內(nèi)存中,然后調(diào)用指令模擬模塊對(duì)每一條用戶指令解釋執(zhí)行。將用戶程序的讀寫內(nèi)存要求,轉(zhuǎn)變?yōu)閷?duì)物理內(nèi)存地址的讀寫。Machine類提供了單步調(diào)試用戶程序的功能,執(zhí)行一條指令后會(huì)自動(dòng)停下來(lái),讓用戶查看系統(tǒng)狀態(tài),不過(guò)這里的單步調(diào)試是匯編指令級(jí)的,需要讀者對(duì)R2/3000XE"R2/3000"指令比較熟悉。如果用戶程序想使用操作系統(tǒng)提供的功能或者發(fā)出異常信號(hào)時(shí),Machine調(diào)用系統(tǒng)異常陷入功能,進(jìn)入Nachos的核心部分。Interrupt類XE"Interrupt類"用來(lái)模擬硬件中斷系統(tǒng)。在這個(gè)中斷系統(tǒng)中,中斷狀態(tài)有開,關(guān)兩種,中斷類型有時(shí)鐘中斷、磁盤中斷、控制臺(tái)寫中斷、控制臺(tái)讀中斷、網(wǎng)絡(luò)發(fā)送中斷以及網(wǎng)絡(luò)接收中斷。機(jī)器狀態(tài)有用戶態(tài),核心態(tài)和空閑態(tài)。中斷系統(tǒng)提供的功能有開/關(guān)中斷,讀/寫機(jī)器狀態(tài),將一個(gè)即將發(fā)生中斷放入中斷隊(duì)列,以及使機(jī)器時(shí)鐘前進(jìn)一步。在Interrupt類XE"Interrupt類"中有一個(gè)記錄即將發(fā)生中斷的隊(duì)列,稱為中斷等待隊(duì)列。中斷等待隊(duì)列中每個(gè)等待處理的中斷包含中斷類型、中斷處理程序的地址及參數(shù)、中斷應(yīng)當(dāng)發(fā)生的時(shí)間等信息。一般是由硬件設(shè)備模擬程序把將要發(fā)生的中斷放入中斷隊(duì)列。中斷系統(tǒng)提供了一個(gè)模擬機(jī)器時(shí)鐘,機(jī)器時(shí)鐘在下列情況下前進(jìn)(詳見(jiàn)第二節(jié)對(duì)中斷模塊的分析):用戶程序XE"用戶程序"打開中斷執(zhí)行一條用戶指令處理機(jī)沒(méi)有進(jìn)程正在運(yùn)行機(jī)器時(shí)鐘前進(jìn)時(shí),中斷處理的過(guò)程如下圖所示:圖 Nachos中斷處理時(shí)機(jī)NYNY進(jìn)行正文切換中斷處理程序要求進(jìn)行正文切換開中斷取出隊(duì)列中一個(gè)應(yīng)當(dāng)發(fā)生的中斷,調(diào)用這個(gè)中斷的處理程序去處理中斷中斷隊(duì)列中有應(yīng)當(dāng)發(fā)生的中斷關(guān)中斷圖 Nachos中斷處理時(shí)機(jī)NYNY進(jìn)行正文切換中斷處理程序要求進(jìn)行正文切換開中斷取出隊(duì)列中一個(gè)應(yīng)當(dāng)發(fā)生的中斷,調(diào)用這個(gè)中斷的處理程序去處理中斷中斷隊(duì)列中有應(yīng)當(dāng)發(fā)生的中斷關(guān)中斷所以,在Nachos中只有在時(shí)鐘前進(jìn)時(shí),才會(huì)檢查是否有中斷會(huì)發(fā)生,而Nachos模擬時(shí)鐘前進(jìn)的時(shí)機(jī)不是任意的,這樣即使打開了中斷,中斷也不能在任意時(shí)刻發(fā)生。只有在模擬時(shí)鐘前進(jìn)的時(shí)候才能處理等待著的中斷。通過(guò)以后的敘述我們可以看到,在執(zhí)行非用戶代碼的大部分時(shí)間里,系統(tǒng)不會(huì)被中斷。這意味著不正確的同步代碼可能在這個(gè)硬件模擬環(huán)境下工作正常,而實(shí)際上在真正的硬件上是無(wú)法正確運(yùn)行的。在有些中斷處理程序的最后可能要進(jìn)行正文切換,可以通過(guò)調(diào)用Interrupt類的一個(gè)成員函數(shù)來(lái)要求時(shí)鐘前進(jìn)的時(shí)候進(jìn)行正文切換。中斷系統(tǒng)還提供關(guān)機(jī)的功能,當(dāng)系統(tǒng)中沒(méi)有正在運(yùn)行的進(jìn)程同時(shí)系統(tǒng)中沒(méi)有除了時(shí)鐘中斷以外的其它中斷時(shí),Nachos結(jié)束運(yùn)行。在這個(gè)中斷系統(tǒng)基礎(chǔ)上,Nachos模擬了各種硬件設(shè)備,這些設(shè)備都是異步設(shè)備,依靠中斷來(lái)與主機(jī)通信。Timer類XE"Timer類"模擬定時(shí)器。定時(shí)器每隔X個(gè)時(shí)鐘周期就向CPU發(fā)一個(gè)時(shí)鐘中斷。它是時(shí)間片管理必不可少的硬件基礎(chǔ)。它的實(shí)現(xiàn)方法是將一個(gè)即將發(fā)生的時(shí)鐘中斷放入中斷隊(duì)列,到了時(shí)鐘中斷應(yīng)發(fā)生的時(shí)候,中斷系統(tǒng)將處理這個(gè)中斷,在中斷處理的過(guò)程中又將下一個(gè)即將發(fā)生的時(shí)鐘中斷放入中斷隊(duì)列,這樣每隔X個(gè)時(shí)鐘周期,就有一個(gè)時(shí)鐘中斷發(fā)生。由于Nachos是一個(gè)軟件模擬的系統(tǒng),有很多的隨機(jī)事件需要通過(guò)一定的控制來(lái)實(shí)現(xiàn)。所以系統(tǒng)中在計(jì)算下一個(gè)時(shí)鐘中斷應(yīng)發(fā)生的時(shí)間時(shí),還加入了一些隨機(jī)值,使得中斷發(fā)生的時(shí)間間隔不確定,這樣就與現(xiàn)實(shí)的定時(shí)器更相似。Console類XE"Console類"模擬的是控制臺(tái)設(shè)備。當(dāng)用戶程序XE"用戶程序"向控制臺(tái)寫一個(gè)字符時(shí),寫程序立即返回,過(guò)了給定的時(shí)鐘周期后I/O操作完成,控制臺(tái)向CPU發(fā)一個(gè)控制臺(tái)寫中斷。但是控制臺(tái)是否有用戶輸入可供讀取是隨機(jī)的,所以控制臺(tái)每隔給定的時(shí)鐘周期向CPU發(fā)一個(gè)控制臺(tái)讀中斷,周期性地發(fā)中斷的方法與定時(shí)器的類似,即先計(jì)算下一個(gè)控制臺(tái)讀中斷將發(fā)生的時(shí)間,然后將讀中斷放入中斷隊(duì)列,等待讀中斷的發(fā)生。讀中斷發(fā)生后,如果有用戶輸入的話,控制臺(tái)讀中斷處理過(guò)程將控制臺(tái)輸入的字符放入字符緩沖區(qū)。當(dāng)用戶從控制臺(tái)讀字符時(shí),把字符緩沖區(qū)的內(nèi)容傳給用戶。控制臺(tái)的讀/寫分別用兩個(gè)文件來(lái)模擬。Disk類XE"Disk類"模擬了物理磁盤,它一次只能接受一個(gè)讀寫請(qǐng)求,當(dāng)讀寫操作完成后向CPU發(fā)一個(gè)磁盤中斷。該物理磁盤只有一個(gè)面,分為幾個(gè)磁道,每道又分為幾個(gè)扇區(qū)。每道的扇區(qū)數(shù),每個(gè)扇區(qū)的存儲(chǔ)容量都是固定的。磁盤的使用者可以讀寫指定的扇區(qū),讀寫單位是一個(gè)扇區(qū)。模擬磁盤用宿主機(jī)文件系統(tǒng)中一個(gè)文件來(lái)實(shí)現(xiàn),當(dāng)用戶發(fā)出讀寫請(qǐng)求時(shí),Nachos的處理過(guò)程如下:從模擬文件中讀出數(shù)據(jù)或向模擬文件寫入數(shù)據(jù)。計(jì)算磁盤操作需要的時(shí)間。磁盤操作時(shí)間=移動(dòng)磁頭尋道的時(shí)間+旋轉(zhuǎn)到讀寫扇區(qū)的時(shí)間+數(shù)據(jù)傳送的時(shí)間。將一個(gè)磁盤讀/寫中斷放入中斷隊(duì)列,因?yàn)橹袛嗍窃诓僮魍瓿珊蟀l(fā)生的。所以,中斷發(fā)生時(shí)間=當(dāng)前時(shí)間+磁盤操作時(shí)間。每個(gè)Nachos運(yùn)行時(shí)是宿主機(jī)上的一個(gè)進(jìn)程,如果在宿主機(jī)上運(yùn)行多個(gè)Nachos進(jìn)程,這些Nachos進(jìn)程可以組成一個(gè)網(wǎng)絡(luò),而每個(gè)Nachos進(jìn)程就是一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。Network類XE"Network類"模擬了一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。這個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)可以把報(bào)文XE"報(bào)文"發(fā)送到網(wǎng)絡(luò)的其他節(jié)點(diǎn)上。報(bào)文的長(zhǎng)度固定,Nachos模擬了在現(xiàn)實(shí)網(wǎng)絡(luò)中時(shí)常發(fā)生的報(bào)文丟失的情況;但是報(bào)文中的內(nèi)容不會(huì)在網(wǎng)絡(luò)傳送中被修改破壞。每個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)都有全網(wǎng)絡(luò)唯一的“地址”,報(bào)文傳送的起始節(jié)點(diǎn)、目的節(jié)點(diǎn)都是由這個(gè)“地址”表示。報(bào)文XE"報(bào)文"在網(wǎng)絡(luò)中的傳遞是用通過(guò)Socket(套接口)XE"Socket(套接口)"來(lái)實(shí)現(xiàn)的。每個(gè)節(jié)點(diǎn)還有一個(gè)可靠性系數(shù),用來(lái)模擬報(bào)文從這個(gè)節(jié)點(diǎn)發(fā)出后丟失的概率。Network的實(shí)現(xiàn)與控制臺(tái)類似,每隔一定的時(shí)鐘周期,就產(chǎn)生一個(gè)網(wǎng)絡(luò)接收中斷,網(wǎng)絡(luò)接收中斷處理過(guò)程是:將下一個(gè)網(wǎng)絡(luò)接收中斷放入中斷隊(duì)列以實(shí)現(xiàn)中斷的周期性發(fā)生。如果報(bào)文XE"報(bào)文"緩沖區(qū)中已有報(bào)文,則返回。讀取套接口,如果沒(méi)有報(bào)文XE"報(bào)文",則返回。讀取報(bào)文XE"報(bào)文",把它放入報(bào)文緩沖區(qū)。調(diào)用本節(jié)點(diǎn)自定義的接收處理函數(shù)。在現(xiàn)有實(shí)現(xiàn)中,報(bào)文XE"報(bào)文"緩沖區(qū)只能存放一個(gè)報(bào)文,有可能因?yàn)閳?bào)文緩沖區(qū)滿而造成報(bào)文丟失(上面第2行),可以多設(shè)幾個(gè)報(bào)文緩沖區(qū)來(lái)減少丟失的可能性。Network類XE"Network類"提供了讓網(wǎng)絡(luò)用戶讀取已經(jīng)收到的報(bào)文XE"報(bào)文"的成員函數(shù),當(dāng)報(bào)文緩沖區(qū)為空時(shí),它返回空,否則從報(bào)文緩沖區(qū)讀出報(bào)文,并將報(bào)文緩沖區(qū)清空,返回剛讀出的報(bào)文。報(bào)文XE"報(bào)文"發(fā)送的過(guò)程是:將網(wǎng)絡(luò)發(fā)送中斷放入中斷隊(duì)列。產(chǎn)生一個(gè)隨機(jī)數(shù)。如果這個(gè)隨機(jī)數(shù)大于網(wǎng)絡(luò)的可靠性系數(shù),則不發(fā)送報(bào)文XE"報(bào)文"(用來(lái)模擬報(bào)文丟失),否則通過(guò)套接口將報(bào)文發(fā)送出去。從以上的敘述中可以看出,中斷系統(tǒng)成為整個(gè)Nachos虛擬機(jī)的基礎(chǔ),其它的模擬硬件設(shè)備都是建立在中斷系統(tǒng)之上的。在此之上,加上Machine類XE"Machine類"模擬的指令解釋器,可以實(shí)現(xiàn)Nachos的線程管理XE"線程管理"、文件系統(tǒng)管理XE"文件系統(tǒng)管理"、虛擬內(nèi)存XE"虛擬內(nèi)存"、用戶程序XE"用戶程序"和網(wǎng)絡(luò)管理XE"網(wǎng)絡(luò)管理"等所有操作系統(tǒng)功能。圖展示了Nachos系統(tǒng)的整體結(jié)構(gòu)。用戶程序線程管理XE"線程管理"網(wǎng)絡(luò)協(xié)議文件系統(tǒng)虛擬內(nèi)存XE"虛擬內(nèi)存"終端設(shè)備時(shí)鐘網(wǎng)絡(luò)磁盤中斷系統(tǒng)指令解釋和內(nèi)存模擬圖 Nachos系統(tǒng)的整體結(jié)構(gòu)第二節(jié) 機(jī)器模擬的實(shí)現(xiàn)1.Sysdep模塊分析(文件)Nachos的運(yùn)行環(huán)境可以是多種操作系統(tǒng),由于每種操作系統(tǒng)所提供的系統(tǒng)調(diào)用或函數(shù)調(diào)用在形式和內(nèi)容上可能有細(xì)微的差別。sysdep模塊的作用是屏蔽掉這些差別。PoolFile函數(shù)語(yǔ)法:boolPoolFile(intfd)參數(shù):fd: 文件描述符,也可以是一個(gè)套接字(socket)功能:測(cè)試一個(gè)打開文件fd是否有內(nèi)容可以讀,如果有則返回TRUE,否則返回FALSE。當(dāng)Nachos系統(tǒng)處于IDLE狀態(tài)時(shí),測(cè)試過(guò)程有一個(gè)延時(shí),也就是在一定時(shí)間范圍內(nèi)如果有內(nèi)容可讀的話,同樣返回TRUE。實(shí)現(xiàn):通過(guò)select系統(tǒng)調(diào)用。返回:打開文件是否有內(nèi)容供讀取。OpenForWrite函數(shù)語(yǔ)法:intOpenForWrite(char*name)參數(shù):name: 文件名功能:為寫操作打開一個(gè)文件。如果該文件不存在,產(chǎn)生該文件;如果該文件已經(jīng)存在,則將該文件原有的內(nèi)容刪除。實(shí)現(xiàn):通過(guò)open系統(tǒng)調(diào)用。返回:打開的文件描述符。OpenForReadWrite函數(shù)語(yǔ)法:intOpenForReadWrite(char*name,boolcrashOnError)參數(shù):name: 文件名crashOnError: crash標(biāo)志功能:為讀寫操作打開一個(gè)文件。當(dāng)crashOnError標(biāo)志設(shè)置而文件不能讀寫打開時(shí),系統(tǒng)出錯(cuò)退出。實(shí)現(xiàn):通過(guò)open系統(tǒng)調(diào)用。返回:打開的文件描述符。Read函數(shù)語(yǔ)法:voidRead(intfd,char*buffer,intnBytes)參數(shù):fd: 打開文件描述符buffer: 讀取內(nèi)容的緩沖區(qū)nBytes: 需要讀取的字節(jié)數(shù)功能:從一個(gè)打開文件fd中讀取nBytes的內(nèi)容到buffer緩沖區(qū)。如果讀取失敗,系統(tǒng)退出。實(shí)現(xiàn):通過(guò)read系統(tǒng)調(diào)用。返回:無(wú)。注意:這和系統(tǒng)調(diào)用read不完全一樣。read系統(tǒng)調(diào)用返回的是實(shí)際讀出的字節(jié)數(shù),而Read函數(shù)則必須讀出nBytes,否則系統(tǒng)將退出。如果需要使用同read系統(tǒng)調(diào)用相對(duì)應(yīng)的函數(shù),請(qǐng)用ReadPartial。

ReadPartial函數(shù)語(yǔ)法:intReadPartial(intfd,char*buffer,intnBytes)參數(shù):fd: 打開文件描述符buffer: 讀取內(nèi)容的緩沖區(qū)nBytes: 需要讀取的最大字節(jié)數(shù)功能:從一個(gè)打開文件fd中讀取nBytes的內(nèi)容到buffer緩沖區(qū)。實(shí)現(xiàn):通過(guò)read系統(tǒng)調(diào)用。返回:實(shí)際讀出的字節(jié)數(shù)。WriteFile函數(shù)語(yǔ)法:voidWriteFile(intfd,char*buffer,intnBytes)參數(shù):fd: 打開文件描述符buffer: 需要寫的內(nèi)容所在的緩沖區(qū)nBytes: 需要寫的內(nèi)容最大字節(jié)數(shù)功能:將buffer緩沖區(qū)中的內(nèi)容寫nBytes到一個(gè)打開文件fd中。實(shí)現(xiàn):通過(guò)write系統(tǒng)調(diào)用。返回:無(wú)。注意:這和系統(tǒng)調(diào)用write不完全一樣。write系統(tǒng)調(diào)用返回的是實(shí)際寫入的字節(jié)數(shù),而WriteFile函數(shù)則必須寫入nBytes,否則系統(tǒng)將退出。Lseek函數(shù)語(yǔ)法:voidLseek(intfd,intoffset,intwhence)參數(shù):fd: 文件描述符offset: 偏移量whence: 指針移動(dòng)的起始點(diǎn)功能:移動(dòng)一個(gè)打開文件的讀寫指針,含義同lseek系統(tǒng)調(diào)用;出錯(cuò)則退出系統(tǒng)。實(shí)現(xiàn):通過(guò)lseek系統(tǒng)調(diào)用。返回:無(wú)。Tell函數(shù)語(yǔ)法:intTell(intfd)參數(shù):fd: 文件描述符功能:指出當(dāng)前讀寫指針位置實(shí)現(xiàn):通過(guò)lseek系統(tǒng)調(diào)用。返回:返回當(dāng)前指針位置。Close函數(shù)語(yǔ)法:voidClose(intfd)參數(shù):fd: 文件描述符功能:關(guān)閉當(dāng)前打開文件fd,如果出錯(cuò)則退出系統(tǒng)。實(shí)現(xiàn):通過(guò)close系統(tǒng)調(diào)用。返回:無(wú)。

Unlink函數(shù)語(yǔ)法:boolUnlink(char*name)參數(shù):name: 文件名功能:刪除文件。實(shí)現(xiàn):通過(guò)unlink系統(tǒng)調(diào)用。返回:刪除成功,返回TRUE;否則返回FALSE。OpenSocket函數(shù)語(yǔ)法:intOpenSocket()參數(shù):無(wú)功能:申請(qǐng)一個(gè)socket。實(shí)現(xiàn):通過(guò)socket系統(tǒng)調(diào)用。其中AF_UNIX參數(shù)說(shuō)明使用UNIX內(nèi)部協(xié)議。(Nachos是用SOCKET文件來(lái)模擬網(wǎng)絡(luò)節(jié)點(diǎn),所以采用UNIX內(nèi)部協(xié)議。向該文件讀寫內(nèi)容分別代表從該節(jié)點(diǎn)讀取內(nèi)容和向該網(wǎng)絡(luò)節(jié)點(diǎn)發(fā)送內(nèi)容)SOCK_DGRAM參數(shù)說(shuō)明采用無(wú)連接定長(zhǎng)數(shù)據(jù)包型的數(shù)據(jù)鏈路。返回:申請(qǐng)到的socketID。CloseSocket函數(shù)語(yǔ)法:voidCloseSocket(intsockID)參數(shù):sockID: socket標(biāo)識(shí)功能:釋放一個(gè)socket。實(shí)現(xiàn):通過(guò)close系統(tǒng)調(diào)用。返回:無(wú)。AssignNameToSocket函數(shù)語(yǔ)法:voidAssignNameToSocket(char*socketName,intsockID)參數(shù):socketName: socket文件名sockID: socket標(biāo)識(shí)功能:將一個(gè)文件名和一個(gè)socket標(biāo)識(shí)聯(lián)系起來(lái),于是將一個(gè)SOCKET文件同一個(gè)Nachos進(jìn)程連接起來(lái),使宿主機(jī)上該Nachos進(jìn)程成為一個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。實(shí)現(xiàn):通過(guò)bind系統(tǒng)調(diào)用。返回:無(wú)。DeAssignNameToSocket函數(shù)語(yǔ)法:voidDeAssignNameToSocket(char*socketName)參數(shù):socketName: socket文件名功能:將一個(gè)文件名刪除,實(shí)際上是和相應(yīng)的socket標(biāo)識(shí)脫離關(guān)系。實(shí)現(xiàn):通過(guò)unlink系統(tǒng)調(diào)用。返回:無(wú)。PoolSocket函數(shù)語(yǔ)法:boolPoolSocket(intsockID)參數(shù):socketID: socket標(biāo)識(shí)功能:查詢一個(gè)socket是否有內(nèi)容可以讀取。實(shí)現(xiàn):調(diào)用PoolFile。在UNIX中socket標(biāo)識(shí)和普通的文件標(biāo)識(shí)沒(méi)有本質(zhì)的區(qū)別,可以采用相同的方式操作;Nachos中的網(wǎng)絡(luò)收發(fā)信息的模擬實(shí)際上是文件操作。返回:socket中有內(nèi)容,返回TRUE;否則返回FALSE。ReadFromSocket函數(shù)語(yǔ)法:voidReadFromSocket(intsockID,char*buffer,intpacketSize)參數(shù):socketID: socket標(biāo)識(shí)buffer: 讀取內(nèi)容的暫存空間packetSize: 讀取數(shù)據(jù)包的大小功能:從一個(gè)socket標(biāo)識(shí)中讀取packetSize大小的數(shù)據(jù)包,放在buffer緩沖中。實(shí)現(xiàn):通過(guò)recvfrom系統(tǒng)調(diào)用。返回:無(wú)。SendToSocket函數(shù)語(yǔ)法:voidSendToSocket(intsockID,char*buffer,intpacketSize,char*toName)參數(shù):socketID: socket標(biāo)識(shí)buffer: 發(fā)送內(nèi)容的暫存空間packetSize: 發(fā)送數(shù)據(jù)包的大小toName: 要接收數(shù)據(jù)包的Nachos虛擬機(jī)模擬網(wǎng)絡(luò)文件的文件名功能:向socket標(biāo)識(shí)中發(fā)送packetSize大小的數(shù)據(jù)包。實(shí)現(xiàn):通過(guò)sendto系統(tǒng)調(diào)用。Nachos的網(wǎng)絡(luò)處理中斷程序會(huì)檢查和自己相連的模擬網(wǎng)絡(luò)SOCKET文件中是否有內(nèi)容可讀。當(dāng)Nachos需要向其它節(jié)點(diǎn)發(fā)送信息時(shí),需要指明其它節(jié)點(diǎn)的地址,實(shí)際上就是和其它節(jié)點(diǎn)相連的模擬網(wǎng)絡(luò)SOCKET文件名。返回:無(wú)。CallOnUserAbort函數(shù)語(yǔ)法:voidCallOnUserAbort(VoidNoArgFunctionPtrfunc)參數(shù):func: 函數(shù)指針功能:設(shè)定一個(gè)函數(shù),在用戶強(qiáng)制退出系統(tǒng)時(shí)調(diào)用。實(shí)現(xiàn):通過(guò)signal系統(tǒng)調(diào)用。返回:無(wú)。Delay函數(shù)語(yǔ)法:voidDelay(intseconds)參數(shù):seconds: 需要延遲的秒數(shù)功能:系統(tǒng)延遲一定的時(shí)間。實(shí)現(xiàn):通過(guò)sleep系統(tǒng)調(diào)用。返回:無(wú)。Abort函數(shù)語(yǔ)法:voidAbort()參數(shù):無(wú)功能:退出系統(tǒng)(非正常退出)。實(shí)現(xiàn):通過(guò)abort系統(tǒng)調(diào)用。返回:無(wú)。Exit函數(shù)語(yǔ)法:voidExit(intexitCode)參數(shù):exitCode: 向系統(tǒng)的返回值功能:退出系統(tǒng)。實(shí)現(xiàn):通過(guò)exit系統(tǒng)調(diào)用。返回:無(wú)。RandomInit函數(shù)語(yǔ)法:voidRandomInit(unsignedseed)參數(shù):seed: 隨機(jī)數(shù)產(chǎn)生魔數(shù)功能:初始化隨機(jī)數(shù)發(fā)生器。實(shí)現(xiàn):通過(guò)srand系統(tǒng)調(diào)用。返回:無(wú)。Random函數(shù)語(yǔ)法:intRandomInit()參數(shù):無(wú)功能:產(chǎn)生一個(gè)隨機(jī)整數(shù)。實(shí)現(xiàn):通過(guò)rand系統(tǒng)調(diào)用。返回:產(chǎn)生的隨機(jī)整數(shù)。AllocBoundedArray函數(shù)語(yǔ)法:char*AllocBoundedArray(intsize)參數(shù):size: 需要申請(qǐng)的空間大小功能:申請(qǐng)一個(gè)受保護(hù)的存儲(chǔ)空間。實(shí)現(xiàn):通過(guò)mprotect的系統(tǒng)調(diào)用,申請(qǐng)一塊比size較大的空間,并且在要申請(qǐng)空間兩頭區(qū)域的屬性設(shè)置成不可訪問(wèn);當(dāng)用戶使用不當(dāng)時(shí)(使用到受保護(hù)范圍之外時(shí)),系統(tǒng)會(huì)接收到SIGSEGV信號(hào)。不是每個(gè)操作系統(tǒng)都支持這樣的內(nèi)存申請(qǐng),如果支持的話,對(duì)監(jiān)測(cè)內(nèi)存的使用是否恰當(dāng)非常有用。返回:申請(qǐng)成功后指針,該指針指向可以訪問(wèn)的申請(qǐng)空間,而不是指向受限區(qū)域的開始。DeallocBoundedArray函數(shù)語(yǔ)法:voidDeallocBoundedArray(char*ptr,intsize)參數(shù):ptr: 要釋放空間的指針size: 申請(qǐng)的空間大小功能:將受保護(hù)的存儲(chǔ)空間釋放。實(shí)現(xiàn):通過(guò)mprotect系統(tǒng)調(diào)用;釋放的空間包括頭尾受限區(qū)域,所以必須知道原來(lái)申請(qǐng)區(qū)域的大小。返回:無(wú)。2. 中斷模塊分析(文件)中斷模塊的主要作用是模擬底層的中斷機(jī)制??梢酝ㄟ^(guò)該模擬機(jī)制來(lái)啟動(dòng)和禁止中斷(SetLevel);該中斷機(jī)制模擬了Nachos系統(tǒng)需要處理的所有的中斷,包括時(shí)鐘中斷、磁盤中斷、終端讀/終端寫中斷以及網(wǎng)絡(luò)接收/網(wǎng)絡(luò)發(fā)送中斷。中斷的發(fā)生總是有一定的時(shí)間。比如當(dāng)向硬盤發(fā)出讀請(qǐng)求,硬盤處理請(qǐng)求完畢后會(huì)發(fā)生中斷;在請(qǐng)求和處理完畢之間需要經(jīng)過(guò)一定的時(shí)間。所以在該模塊中,模擬了時(shí)鐘的前進(jìn)。為了實(shí)現(xiàn)簡(jiǎn)單和便于統(tǒng)計(jì)各種活動(dòng)所占用的時(shí)間起見(jiàn),Nachos規(guī)定系統(tǒng)時(shí)間在以下三種情況下前進(jìn):執(zhí)行用戶態(tài)指令執(zhí)行用戶態(tài)指令,時(shí)鐘前進(jìn)是顯而易見(jiàn)的。我們認(rèn)為,Nachos執(zhí)行每條指令所需時(shí)間是固定的,為一個(gè)時(shí)鐘單位(Tick)。重新打開中斷一般系統(tǒng)態(tài)在進(jìn)行中斷處理程序時(shí),需要關(guān)中斷。但是中斷處理程序本身也需要消耗時(shí)間,而在關(guān)閉中斷到重新打開中斷之間無(wú)法非常準(zhǔn)確地計(jì)算時(shí)間,所以當(dāng)中斷重新打開的時(shí)候,加上一個(gè)中斷處理所需時(shí)間的平均值。就緒隊(duì)列中沒(méi)有進(jìn)程當(dāng)系統(tǒng)中沒(méi)有就緒進(jìn)程時(shí),系統(tǒng)處于Idle狀態(tài)。這種狀態(tài)可能是系統(tǒng)中所有的進(jìn)程都在等待各自的某種操作完成。也就是說(shuō),系統(tǒng)將在未來(lái)某個(gè)時(shí)間發(fā)生中斷,到中斷發(fā)生的時(shí)候中斷處理程序?qū)⑦M(jìn)行中斷處理。在系統(tǒng)模擬中,有一個(gè)中斷等待隊(duì)列,專門存放將來(lái)發(fā)生的中斷。在這種情況下,可以將系統(tǒng)時(shí)間直接跳到中斷等待隊(duì)列第一項(xiàng)所對(duì)應(yīng)的時(shí)間,以免不必要的等待。當(dāng)前面兩種情況需要時(shí)鐘前進(jìn)時(shí),調(diào)用OneTick方法。OneTick方法將系統(tǒng)態(tài)和用戶態(tài)的時(shí)間分開進(jìn)行處理,這是因?yàn)橛脩魬B(tài)的時(shí)間計(jì)算是根據(jù)用戶指令為單位的;而在系統(tǒng)態(tài),沒(méi)有辦法進(jìn)行指令的計(jì)算,所以將系統(tǒng)態(tài)的一次中斷調(diào)用或其它需要進(jìn)行時(shí)間計(jì)算的單位設(shè)置為一個(gè)固定值,假設(shè)為一條用戶指令執(zhí)行時(shí)間的10倍。雖然Nachos模擬了中斷的發(fā)生,但是畢竟不能與實(shí)際硬件一樣,中斷發(fā)生的時(shí)機(jī)可以是任意的。比如當(dāng)系統(tǒng)中沒(méi)有就緒進(jìn)程時(shí),時(shí)鐘直接跳到未處理中斷隊(duì)列的第一項(xiàng)的時(shí)間。這實(shí)際情況下,系統(tǒng)處于Idel狀態(tài)到中斷等待隊(duì)列第一項(xiàng)發(fā)生時(shí)間之間,完全有可能有其它中斷發(fā)生。由于中斷發(fā)生的時(shí)機(jī)不是完全隨機(jī)的,所以在Nachos系統(tǒng)中運(yùn)行的程序,不正確的同步程序也可能正常運(yùn)行,我們?cè)诖诵枰芮凶⒁?。Nachos線程運(yùn)行有三種狀態(tài):Idle狀態(tài)系統(tǒng)CPU處于空閑狀態(tài),沒(méi)有就緒線程可以運(yùn)行。如果中斷等待隊(duì)列中有需要處理的除了時(shí)鐘中斷以外的中斷,說(shuō)明系統(tǒng)還沒(méi)有結(jié)束,將時(shí)鐘調(diào)整到發(fā)生中斷的時(shí)間,進(jìn)行中斷處理;否則認(rèn)為系統(tǒng)結(jié)束所有的工作,退出。系統(tǒng)態(tài) Nachos執(zhí)行系統(tǒng)程序。Nachos雖然模擬了虛擬機(jī)的內(nèi)存,但是Nachos系統(tǒng)程序本身的運(yùn)行不是在該模擬內(nèi)存中,而是利用宿主機(jī)的存儲(chǔ)資源。這是Nachos操作系統(tǒng)同真正操作系統(tǒng)的重要區(qū)別。用戶態(tài)系統(tǒng)執(zhí)行用戶程序XE"用戶程序"。當(dāng)執(zhí)行用戶程序時(shí),每條指令占用空間是Nachos的模擬內(nèi)存(見(jiàn)第五章)。Nachos需要處理的中斷種類有:TimerInt:時(shí)鐘中斷DiskInt:磁盤(讀/寫)中斷ConsoleWriteInt:終端寫中斷ConsoleReadInt:終端讀終端NetworkSentInt:網(wǎng)絡(luò)發(fā)送中斷NetworkRecvInt:網(wǎng)絡(luò)接收中斷中斷等待隊(duì)列是Nachos虛擬機(jī)最重要的數(shù)據(jù)結(jié)構(gòu)之一,它記錄了當(dāng)前虛擬機(jī)可以預(yù)測(cè)的將在未來(lái)發(fā)生的所有中斷。當(dāng)系統(tǒng)進(jìn)行了某種操作可能引起未來(lái)發(fā)生的中斷時(shí),如磁盤的寫入、向網(wǎng)絡(luò)寫入數(shù)據(jù)等都會(huì)將中斷插入到中斷等待隊(duì)列中;對(duì)于一些定期需要發(fā)生的中斷,如時(shí)鐘中斷、終端讀取中斷等,系統(tǒng)會(huì)在中斷處理后將下一次要發(fā)生的中斷插入到中斷等待隊(duì)列中。中斷的插入過(guò)程是一個(gè)優(yōu)先隊(duì)列的插入過(guò)程,其優(yōu)先級(jí)是中斷發(fā)生的時(shí)間,也就是說(shuō),先發(fā)生的中斷將優(yōu)先得到處理。圖 對(duì)中斷等待隊(duì)列的操作中斷等待隊(duì)列某些將會(huì)引起中斷的操作系統(tǒng)定期發(fā)生的中斷時(shí)鐘前進(jìn)判斷有無(wú)中斷發(fā)生圖 對(duì)中斷等待隊(duì)列的操作中斷等待隊(duì)列某些將會(huì)引起中斷的操作系統(tǒng)定期發(fā)生的中斷時(shí)鐘前進(jìn)判斷有無(wú)中斷發(fā)生當(dāng)時(shí)鐘前進(jìn)或者系統(tǒng)處于Idle狀態(tài)時(shí),Nachos會(huì)判斷中斷等待隊(duì)列中是否有要發(fā)生的中斷,如果有中斷需要發(fā)生,則將該中斷從中斷等待隊(duì)列中刪除,調(diào)用相應(yīng)的中斷處理程序進(jìn)行處理。圖是中斷等待隊(duì)列的操作示意圖。中斷處理程序是在某種特定的中斷發(fā)生時(shí)被調(diào)用,中斷處理程序的作用包括可以在現(xiàn)有的模擬硬件的基礎(chǔ)上建立更高層次的抽象。比如現(xiàn)有的模擬網(wǎng)絡(luò)是有丟失幀的不安全網(wǎng)絡(luò),在中斷處理程序中可以加入請(qǐng)求重發(fā)機(jī)制來(lái)實(shí)現(xiàn)一個(gè)安全網(wǎng)絡(luò)。PendingInterrupt類XE"Interrupt類"classPendingInterrupt{public:PendingInterrupt(VoidFunctionPtrfunc,intparam,inttime,IntTypekind);VoidFunctionPtrhandler; 時(shí)鐘中斷模塊分析(文件)該模塊的作用是模擬時(shí)鐘中斷。Nachos虛擬機(jī)可以如同實(shí)際的硬件一樣,每隔一定的時(shí)間會(huì)發(fā)生一次時(shí)鐘中斷。這是一個(gè)可選項(xiàng),目前Nachos還沒(méi)有充分發(fā)揮時(shí)鐘中斷的作用,只有在Nachos指定線程隨機(jī)切換時(shí),(Nachos-rs參數(shù),見(jiàn)線程管理XE"線程管理"部分Nachos主控模塊分析)啟動(dòng)時(shí)鐘中斷,在每次的時(shí)鐘中斷處理的最后,加入了線程的切換。實(shí)際上,時(shí)鐘中斷在線程管理中的作用遠(yuǎn)不止這些,時(shí)鐘中斷還可以用作:線程管理XE"線程管理"中的時(shí)間片輪轉(zhuǎn)法的時(shí)鐘控制,(詳見(jiàn)線程管理系統(tǒng)中的實(shí)現(xiàn)實(shí)例中,對(duì)線程調(diào)度的改進(jìn)部分)不一定每次時(shí)鐘中斷都會(huì)引起線程的切換,而是由該線程是否的時(shí)間片是否已經(jīng)用完來(lái)決定。分時(shí)系統(tǒng)線程優(yōu)先級(jí)的計(jì)算(詳見(jiàn)線程管理XE"線程管理"系統(tǒng)中的實(shí)現(xiàn)實(shí)例中,對(duì)線程調(diào)度的改進(jìn)部分)線程進(jìn)入睡眠狀態(tài)時(shí)的時(shí)間計(jì)算可以通過(guò)時(shí)鐘中斷機(jī)制來(lái)實(shí)現(xiàn)sleep系統(tǒng)調(diào)用,在時(shí)鐘中斷處理程序中,每隔一定的時(shí)間對(duì)定時(shí)睡眠線程的時(shí)間進(jìn)行一次評(píng)估,判斷是否需要喚醒它們。Nachos利用其模擬的中斷機(jī)制來(lái)模擬時(shí)鐘中斷。時(shí)鐘中斷間隔由TimerTicks宏決定(100倍Tick的時(shí)間)。在系統(tǒng)模擬時(shí)有一個(gè)缺陷,如果系統(tǒng)就緒進(jìn)程不止一個(gè)的話,每次時(shí)鐘中斷都一定會(huì)發(fā)生進(jìn)程的切換(見(jiàn)中TimerInterruptHandler函數(shù))。所以運(yùn)行Nachos時(shí),如果以同樣的方式提交進(jìn)程,系統(tǒng)的結(jié)果將是一樣的。這不符合操作系統(tǒng)的運(yùn)行不確定性的特性。所以在模擬時(shí)鐘中斷的時(shí)候,加入了一個(gè)隨機(jī)因子,如果該因子設(shè)置的話,時(shí)鐘中斷發(fā)生的時(shí)機(jī)將在一定范圍內(nèi)是隨機(jī)的。這樣有些用戶程序XE"用戶程序"在同步方面的錯(cuò)誤就比較容易發(fā)現(xiàn)。但是這樣的時(shí)鐘中斷和真正操作系統(tǒng)中的時(shí)鐘中斷將有不同的含義。不能象真正的操作系統(tǒng)那樣通過(guò)時(shí)鐘中斷來(lái)計(jì)算時(shí)間等等。是否需要隨機(jī)時(shí)鐘中斷可以通過(guò)設(shè)置選項(xiàng)(-rs)來(lái)實(shí)現(xiàn)。Timer類XE"Timer類"定義和實(shí)現(xiàn)如下所示:classTimer{public:Timer(VoidFunctionPtrtimerHandler,intcallArg,booldoRandom); 終端設(shè)備模塊分析(文件)該模塊的作用是模擬實(shí)現(xiàn)終端的輸入和輸出。包括兩個(gè)部分,即鍵盤的輸入和顯示輸出。終端輸入輸出的模擬是異步的,也就是說(shuō)當(dāng)發(fā)出終端的輸入輸出請(qǐng)求后系統(tǒng)即返回,需要等待中斷發(fā)生后才是真正完成了整個(gè)過(guò)程。Console類XE"Console類"定義和實(shí)現(xiàn)如下所示:classConsole{public:Console(char*readFile,char*writeFile,VoidFunctionPtrreadAvail,VoidFunctionPtrwriteDone,intcallArg); .系統(tǒng)通過(guò)定期的讀終端中斷來(lái)判斷終端是否有內(nèi)容供讀取,如果有則讀出;如果沒(méi)有,下一次讀終端中斷繼續(xù)判斷。讀出的內(nèi)容將一直保留到GetChar將其讀走。對(duì)寫終端來(lái)說(shuō):PutChar->WriteDone->PutChar->WriteDone->...系統(tǒng)發(fā)出一個(gè)寫終端命令PutChar,模擬系統(tǒng)將直接向終端輸出文件寫入要寫的內(nèi)容,但是對(duì)Nachos來(lái)說(shuō),整個(gè)寫的過(guò)程并沒(méi)有結(jié)束,只有當(dāng)寫終端中斷來(lái)到后整個(gè)寫過(guò)程才算結(jié)束。5.磁盤設(shè)備模塊分析(文件)磁盤設(shè)備模擬了一個(gè)物理磁盤。Nachos用宿主機(jī)中的一個(gè)文件來(lái)模擬一個(gè)單面物理磁盤,該磁盤由道組成,每個(gè)道由扇區(qū)組成,而每個(gè)扇區(qū)的大小是固定的。和實(shí)際的物理磁盤一樣,Nachos以扇區(qū)為物理讀取/寫入的最小單位,每個(gè)扇區(qū)有唯一的扇區(qū)地址,具體的計(jì)算方法是: track*SectorsPerTrack+offset該物理磁盤是一個(gè)異步的物理磁盤,同終端設(shè)備和網(wǎng)絡(luò)設(shè)備一樣,當(dāng)系統(tǒng)發(fā)出讀磁盤的請(qǐng)求,立即返回,只有具體的磁盤終端到來(lái)的時(shí)候,整個(gè)過(guò)程才算結(jié)束。Disk類XE"Disk類"的定義和實(shí)現(xiàn)如下所示:classDisk{public:Disk(char*name,VoidFunctionPtrcallWhenDone,intcallArg); Nachos運(yùn)行情況統(tǒng)計(jì)(文件)在本章的最后部分,我們要說(shuō)明的是對(duì)Nachos運(yùn)行情況進(jìn)行統(tǒng)計(jì)的類Statistics。這并不屬于機(jī)器模擬的一部分,但是為了幫助讀者了解自己設(shè)計(jì)的操作系統(tǒng)的各種運(yùn)行情況。Statistics類中包含的各種統(tǒng)計(jì)項(xiàng)是非常有價(jià)值的。Statistics類的定義和實(shí)現(xiàn)如下:classStatistics{public:inttotalTicks; 進(jìn)程概念進(jìn)程是操作系統(tǒng)中最基本也是最重要的概念之一,它表示程序在給定數(shù)據(jù)集上的一次執(zhí)行活動(dòng)。通常情況下,一個(gè)計(jì)算機(jī)系統(tǒng)(無(wú)論是單機(jī)還是多機(jī)系統(tǒng))同時(shí)存在的進(jìn)程數(shù)大于計(jì)算機(jī)系統(tǒng)所有的CPU數(shù)。(由于Nachos模擬的是單機(jī)系統(tǒng),所以以下都以單機(jī)系統(tǒng)為例)但是每個(gè)CPU在一個(gè)瞬時(shí)只能運(yùn)行一個(gè)進(jìn)程。所以CPU會(huì)在多個(gè)進(jìn)程之間切換。在任一時(shí)刻,系統(tǒng)中有若干進(jìn)程處在起點(diǎn)和終點(diǎn)之間,這些進(jìn)程被認(rèn)為是在運(yùn)行著,這就是我們所說(shuō)的并發(fā)處理。系統(tǒng)運(yùn)行過(guò)程中,通常有多個(gè)進(jìn)程同時(shí)存在,它們各自執(zhí)行的指令序列,對(duì)系統(tǒng)資源和服務(wù)的需求以及狀態(tài)的變化往往互不相同、千變?nèi)f化而難以預(yù)測(cè)。同時(shí)還可能接收到需要立即處理的中斷信號(hào)。而中斷信號(hào)發(fā)生的時(shí)間以及頻繁程度與系統(tǒng)中許多經(jīng)常變換著的不確定因素有關(guān)。所以每個(gè)進(jìn)程在一種不可預(yù)測(cè)的次序中交替前進(jìn)。操作系統(tǒng)內(nèi)部動(dòng)作的不可預(yù)測(cè)、不可重復(fù)就是操作系統(tǒng)的不確定性。2.進(jìn)程的狀態(tài)及狀態(tài)變化進(jìn)程是程序的一次執(zhí)行活動(dòng),它是一種動(dòng)態(tài)的概念,而這種動(dòng)態(tài)在宏觀上表現(xiàn)為狀態(tài)的變化。進(jìn)程在運(yùn)行中,有三種基本狀態(tài):運(yùn)行態(tài):進(jìn)程分配到處理機(jī)運(yùn)行。就緒態(tài):進(jìn)程已經(jīng)可以在處理機(jī)上運(yùn)行,只是暫時(shí)沒(méi)有分配到處理機(jī)。阻塞態(tài):進(jìn)程因等待某一個(gè)事件發(fā)生而暫時(shí)不能調(diào)度上處理機(jī)運(yùn)行。一個(gè)系統(tǒng)中的進(jìn)程在一定條件下可以在這三種狀態(tài)之間轉(zhuǎn)換。一般有四種類型的轉(zhuǎn)換。如圖所示:運(yùn)行態(tài)->就緒態(tài)進(jìn)程占用CPU運(yùn)行了一段時(shí)間,但是沒(méi)有運(yùn)行結(jié)束。為使各就緒進(jìn)程能比較平衡地共享CPU,此時(shí)調(diào)度程序需要將其它就緒進(jìn)程調(diào)度上處理機(jī)運(yùn)行,于是原來(lái)占據(jù)處理機(jī)的進(jìn)程成為就緒態(tài),等待下一次被調(diào)度上處理機(jī)運(yùn)行。就緒態(tài)->運(yùn)行態(tài)進(jìn)程處于就緒態(tài),調(diào)度程序總是有機(jī)會(huì)將其調(diào)度上處理機(jī),于是該進(jìn)程從就緒態(tài)轉(zhuǎn)為運(yùn)行態(tài),并從上一次運(yùn)行的中斷點(diǎn)繼續(xù)運(yùn)行。運(yùn)行態(tài)->阻塞態(tài)進(jìn)程運(yùn)行過(guò)程中可能因等待某種事件發(fā)生而暫時(shí)停止,比如等待一次鍵盤事件或者磁盤輸入輸出。進(jìn)程進(jìn)入阻塞態(tài)時(shí),調(diào)度程序會(huì)調(diào)度一個(gè)就緒態(tài)進(jìn)程上處理機(jī)運(yùn)行。阻塞態(tài)->就緒態(tài)當(dāng)進(jìn)程進(jìn)入阻塞態(tài)之前等待發(fā)生的事件業(yè)已發(fā)生,則該進(jìn)程從阻塞態(tài)轉(zhuǎn)為就緒態(tài),于是它可以再被調(diào)度上處理機(jī)繼續(xù)運(yùn)行。除了個(gè)別進(jìn)程外,一般進(jìn)程都需要經(jīng)歷這三種狀態(tài),并在這三種狀態(tài)中反復(fù)變換直至運(yùn)行終止。圖 進(jìn)程的狀態(tài)轉(zhuǎn)換等待的事件發(fā)生就緒態(tài)運(yùn)行態(tài)阻塞態(tài)被迫放棄處理機(jī)等待某事件發(fā)生處理機(jī)調(diào)度運(yùn)行圖 進(jìn)程的狀態(tài)轉(zhuǎn)換等待的事件發(fā)生就緒態(tài)運(yùn)行態(tài)阻塞態(tài)被迫放棄處理機(jī)等待某事件發(fā)生處理機(jī)調(diào)度運(yùn)行3.進(jìn)程調(diào)度進(jìn)程調(diào)度程序的優(yōu)劣取決于其調(diào)度算法,在不同應(yīng)用的操作系統(tǒng)中,調(diào)度算法的重點(diǎn)各不相同,這里給出一般進(jìn)程調(diào)度的原則:調(diào)度程序必須公平,確保每個(gè)進(jìn)程都有機(jī)會(huì)使用系統(tǒng)的資源,不會(huì)出現(xiàn)由于一直分配不到資源而出現(xiàn)進(jìn)程“餓死”的現(xiàn)象。充分利用系統(tǒng)的各項(xiàng)資源,尤其是CPU資源。不會(huì)出現(xiàn)有進(jìn)程處于就緒態(tài),而CPU處于空閑狀態(tài)的現(xiàn)象。一定的系統(tǒng)吞吐率,在單位時(shí)間內(nèi)執(zhí)行完成的進(jìn)程數(shù)越大越好。合理的系統(tǒng)響應(yīng)時(shí)間。對(duì)于有交互功能的進(jìn)程,用戶的等待時(shí)間要短。能夠反映用戶的不同類型以及他們對(duì)有關(guān)作業(yè)運(yùn)行優(yōu)先程度的要求。合理的系統(tǒng)開銷。進(jìn)程調(diào)度分為非搶占式調(diào)度和搶占式調(diào)度。非搶占式調(diào)度就是進(jìn)程在運(yùn)行過(guò)程中不會(huì)切換到其它進(jìn)程運(yùn)行,除非其主動(dòng)放棄處理機(jī)或者運(yùn)行結(jié)束。由于進(jìn)程的運(yùn)行有不可預(yù)見(jiàn)性,有可能一個(gè)進(jìn)程會(huì)占用處理機(jī)達(dá)幾個(gè)小時(shí),甚至一個(gè)編寫錯(cuò)誤的進(jìn)程會(huì)一直占用處理機(jī)不放。為了確保沒(méi)有一個(gè)進(jìn)程單獨(dú)運(yùn)行的時(shí)間太長(zhǎng),幾乎所有的計(jì)算機(jī)系統(tǒng)都內(nèi)置了時(shí)鐘,周期性地進(jìn)行時(shí)鐘中斷,在每一次時(shí)鐘中斷時(shí),由進(jìn)程調(diào)度程序負(fù)責(zé)判斷是否有就緒進(jìn)程比正在運(yùn)行的進(jìn)程更加適合占用CPU。如果有這類進(jìn)程則進(jìn)行進(jìn)程調(diào)度,這樣的調(diào)度稱為搶占式調(diào)度。通用操作系統(tǒng)一般采用搶占式調(diào)度,這樣才能體現(xiàn)以上所說(shuō)的進(jìn)程調(diào)度原則。進(jìn)程調(diào)度的算法一般有以下幾種:循環(huán)輪轉(zhuǎn)調(diào)度在循環(huán)輪轉(zhuǎn)調(diào)度中,每個(gè)進(jìn)程都被安排了一個(gè)運(yùn)行時(shí)間段限制,叫做時(shí)間片。如果一個(gè)進(jìn)程在其時(shí)間片結(jié)束時(shí)仍沒(méi)有運(yùn)行結(jié)束,CPU便被搶占并被調(diào)度執(zhí)行其它進(jìn)程。如果進(jìn)程在其時(shí)間片結(jié)束之前已經(jīng)阻塞或完成,則操作系統(tǒng)當(dāng)即切換CPU到其它進(jìn)程運(yùn)行。輪轉(zhuǎn)調(diào)度比較簡(jiǎn)單,在系統(tǒng)中只需要維護(hù)一個(gè)就緒進(jìn)程的列表。如圖所示:在圖(a)中,當(dāng)前運(yùn)行的進(jìn)程是B進(jìn)程,當(dāng)B進(jìn)程運(yùn)行的時(shí)間片用完,調(diào)度程序?qū)⒕o接的F進(jìn)程調(diào)度上處理機(jī),成為當(dāng)前運(yùn)行進(jìn)程,而B進(jìn)程被調(diào)度到就緒進(jìn)程表的最后。圖 進(jìn)程循環(huán)輪轉(zhuǎn)調(diào)度(b)(a)FDGAFDGABB圖 進(jìn)程循環(huán)輪轉(zhuǎn)調(diào)度(b)(a)FDGAFDGABB循環(huán)輪轉(zhuǎn)調(diào)度中的一個(gè)重要問(wèn)題是時(shí)間片的長(zhǎng)短。由于進(jìn)程切換需要一定的系統(tǒng)開銷,包括保護(hù)和恢復(fù)現(xiàn)場(chǎng)等,將時(shí)間片設(shè)置過(guò)短會(huì)導(dǎo)致引起過(guò)多的進(jìn)程切換而降低處理機(jī)效率;但是如果時(shí)間片設(shè)置過(guò)長(zhǎng),將引起用戶響應(yīng)時(shí)間比較長(zhǎng)。在不同要求的操作系統(tǒng)中實(shí)現(xiàn)的時(shí)間片長(zhǎng)短是不一樣的。某些系統(tǒng)還實(shí)現(xiàn)了多時(shí)間片調(diào)度,以滿足不同的需要優(yōu)先權(quán)調(diào)度優(yōu)先權(quán)調(diào)度法按照進(jìn)程執(zhí)行任務(wù)的輕重緩急,給每個(gè)進(jìn)程一個(gè)調(diào)度優(yōu)先權(quán)。系統(tǒng)在切換時(shí),在所有就緒進(jìn)程中選擇優(yōu)先權(quán)最高的進(jìn)程調(diào)度上處理機(jī)運(yùn)行。優(yōu)先權(quán)調(diào)度法分成靜態(tài)優(yōu)先權(quán)調(diào)度法和動(dòng)態(tài)優(yōu)先權(quán)調(diào)度法。靜態(tài)優(yōu)先權(quán)調(diào)度法如果在創(chuàng)建進(jìn)程時(shí)就確定了進(jìn)程的優(yōu)先權(quán),而且在進(jìn)程的運(yùn)行過(guò)程中除設(shè)置外不會(huì)經(jīng)常改變,那么這樣的調(diào)度方法稱為靜態(tài)優(yōu)先權(quán)調(diào)度法。靜態(tài)優(yōu)先權(quán)的確定方法有如下幾種:按進(jìn)程的類型確定:一般系統(tǒng)進(jìn)程的優(yōu)先權(quán)高于用戶進(jìn)程;進(jìn)程在核心態(tài)下運(yùn)行時(shí)的優(yōu)先權(quán)高于在用戶態(tài)下運(yùn)行的優(yōu)先權(quán);前臺(tái)進(jìn)程的優(yōu)先權(quán)高于后臺(tái)進(jìn)程;實(shí)時(shí)性要求高的進(jìn)程的優(yōu)先權(quán)高于實(shí)時(shí)性要求低的進(jìn)程的優(yōu)先權(quán)。按進(jìn)程提交的時(shí)間次序確定:一般先提交的進(jìn)程優(yōu)先權(quán)較高。按作業(yè)要求的資源類型和數(shù)量確定:一般要求資源較少的進(jìn)程有較高的優(yōu)先權(quán),這樣有助于提高系統(tǒng)的吞吐量。動(dòng)態(tài)優(yōu)先權(quán)調(diào)度法進(jìn)程優(yōu)先權(quán)在進(jìn)程創(chuàng)建后如果不是固定的,而是根據(jù)系統(tǒng)中的運(yùn)行狀態(tài)不斷變化的。這樣的優(yōu)先調(diào)度稱為動(dòng)態(tài)優(yōu)先權(quán)調(diào)度。一般動(dòng)態(tài)優(yōu)先權(quán)調(diào)度算法的優(yōu)先權(quán)計(jì)算的原則是:連續(xù)占用處理機(jī)時(shí)間長(zhǎng)的進(jìn)程,優(yōu)先權(quán)相應(yīng)降低。在進(jìn)程切換調(diào)度時(shí)這種進(jìn)程被調(diào)度上處理機(jī)的機(jī)會(huì)較少。在較長(zhǎng)時(shí)間未使用處理機(jī)或者雖然頻繁使用處理機(jī),但每次使用時(shí)間很短的進(jìn)程,進(jìn)程優(yōu)先權(quán)較高。在進(jìn)程切換調(diào)度時(shí),這種進(jìn)程被調(diào)度占用處理機(jī)的機(jī)會(huì)增加。動(dòng)態(tài)優(yōu)先權(quán)的系統(tǒng)開銷比較大,系統(tǒng)開銷一方面取決于動(dòng)態(tài)優(yōu)先數(shù)計(jì)算的復(fù)雜程度,另一方面也與計(jì)算的頻繁度有關(guān)。在計(jì)算優(yōu)先權(quán)時(shí)機(jī)的選擇上,一般至少在一定的時(shí)間間隔重新計(jì)算當(dāng)前運(yùn)行進(jìn)程的優(yōu)先權(quán)以及一些有可能調(diào)度上處理機(jī)的進(jìn)程的優(yōu)先權(quán),而不是將系統(tǒng)中所有的進(jìn)程之優(yōu)先權(quán)都重新計(jì)算。4.進(jìn)程之間的同步和互斥同一個(gè)計(jì)算機(jī)系統(tǒng)中的進(jìn)程不是完全孤立的,它們之間存在著相互依賴,相互制約的關(guān)系。某些進(jìn)程相互協(xié)作,共同完成某種任務(wù);同時(shí),它們又互相競(jìng)爭(zhēng)使用系統(tǒng)的有限資源。進(jìn)程的這些關(guān)系意味著進(jìn)程之間需要相互通訊,這表現(xiàn)為同步和互斥兩個(gè)方面。兩個(gè)進(jìn)程之間的同步是指一個(gè)進(jìn)程達(dá)到某一運(yùn)行點(diǎn)后,除非另一進(jìn)程完成了某些操作,否則就不得不停下來(lái)等待這些操作的完成。系統(tǒng)中存在有這樣的資源,它一次只能分配給一個(gè)進(jìn)程使用。這樣的資源稱為臨界資源。當(dāng)一個(gè)進(jìn)程使用該資源時(shí),其它進(jìn)程必須等待該進(jìn)程釋放它之后,才會(huì)獲得該資源的占有權(quán)。進(jìn)程之間的這種關(guān)系叫做互斥。進(jìn)程之間可以共享某些數(shù)據(jù),對(duì)這些共享數(shù)據(jù)的操作往往也必須是互斥的。與互斥有關(guān)的程序段稱為臨界區(qū),針對(duì)同一臨界資源進(jìn)行操作的程序段稱為同類臨界區(qū)。鎖機(jī)制、信號(hào)量以及條件變量是實(shí)現(xiàn)同類臨界區(qū)同步和互斥的三種常用方法。5.進(jìn)程的實(shí)施進(jìn)程由四個(gè)部分組成:程序(正文段)、數(shù)據(jù)(數(shù)據(jù)段)、進(jìn)程的運(yùn)行棧(棧段)以及進(jìn)程控制塊(PCB)。正文段描述了進(jìn)程所要完成的功能,一般不能修改,所以正文段可以被多個(gè)進(jìn)程共享,又稱共享正文段;數(shù)據(jù)段中是要完成功能所需要的數(shù)據(jù),而且這部分?jǐn)?shù)據(jù)需要使用不隨進(jìn)程運(yùn)行而變化的存儲(chǔ)控件,一般而言,數(shù)據(jù)段不能被共享;棧段是進(jìn)程運(yùn)行的附加空間,記錄了該進(jìn)程運(yùn)行的一部分狀態(tài),不能被共享;進(jìn)程控制塊包含了進(jìn)程的描述信息和控制信息,是進(jìn)程動(dòng)態(tài)特性的集中反映。在一個(gè)最簡(jiǎn)單的操作系統(tǒng)中,進(jìn)程控制塊至少要保存以下信息:正文段、數(shù)據(jù)段以及棧段的位置進(jìn)程的狀態(tài)進(jìn)程的運(yùn)行現(xiàn)場(chǎng):在一個(gè)多進(jìn)程的系統(tǒng)中,一個(gè)準(zhǔn)備就緒狀態(tài)的被選擇切換上處理機(jī)運(yùn)行時(shí),應(yīng)該從它上次運(yùn)行的暫停點(diǎn)開始。這樣才能保證進(jìn)程運(yùn)行的正確性。為此在進(jìn)程控制塊中設(shè)置運(yùn)行現(xiàn)場(chǎng)部分,它保存進(jìn)程上次退出處理機(jī)時(shí)的各硬件寄存器(一般包括程序計(jì)數(shù)器、程序狀態(tài)字以及各種通用寄存器中)的值。對(duì)于一個(gè)復(fù)雜的系統(tǒng),進(jìn)程控制塊中還需要保存其它一些信息,包括進(jìn)程運(yùn)行的各項(xiàng)統(tǒng)計(jì)數(shù)據(jù)等。6.進(jìn)程的創(chuàng)建很多操作系統(tǒng)的進(jìn)程結(jié)構(gòu)如同樹狀。以UNIX為例,每個(gè)進(jìn)程都可以創(chuàng)建若干子進(jìn)程。整個(gè)操作系統(tǒng)中的進(jìn)程樹型結(jié)構(gòu)理論上可以不斷延伸。一個(gè)進(jìn)程創(chuàng)建了子進(jìn)程,它被稱為該子進(jìn)程的父親。父親創(chuàng)建子進(jìn)程的基本任務(wù)是為新進(jìn)程構(gòu)造一個(gè)可以運(yùn)行的環(huán)境,包括正文段、數(shù)據(jù)段和運(yùn)行的初始棧,以及子進(jìn)程的進(jìn)程控制結(jié)構(gòu),并且保證能夠使子進(jìn)程作為一個(gè)可被獨(dú)立調(diào)度的進(jìn)程。UNIX創(chuàng)建子進(jìn)程的基本方式是:除了與進(jìn)程狀態(tài)、標(biāo)識(shí)以及與時(shí)間有關(guān)的少數(shù)控制項(xiàng)外,子進(jìn)程復(fù)制或共享父進(jìn)程的圖象。子進(jìn)程復(fù)制了父進(jìn)程的進(jìn)程圖象后,就和父進(jìn)程一樣有了自己的正文段(雖然是與父進(jìn)程共享)、數(shù)據(jù)段、一個(gè)獨(dú)立的PC指針以及自己獨(dú)立的運(yùn)行棧,可以獨(dú)立運(yùn)行。我們將進(jìn)程所運(yùn)行的空間稱為地址空間,進(jìn)程PC指針和運(yùn)行??醋饕粋€(gè)線索,那么子進(jìn)程和父進(jìn)程一樣擁有各自的地址空間和而且各有一個(gè)運(yùn)行線索。二、線程1.線程概念我們經(jīng)常通過(guò)生成子進(jìn)程的方式去完成相關(guān)而又獨(dú)立的任務(wù)。比如一個(gè)文件服務(wù)器,它接收讀寫文件的請(qǐng)求并將所需數(shù)據(jù)傳入或傳出,為了提高性能,服務(wù)器將最近傳送的數(shù)據(jù)放入緩存,以便在需要時(shí)重復(fù)使用。當(dāng)有請(qǐng)求到達(dá)時(shí),為了處理的獨(dú)立性,該進(jìn)程就要生成一個(gè)子進(jìn)程去完成這一請(qǐng)求。當(dāng)多個(gè)請(qǐng)求到達(dá)時(shí),就需要生成多個(gè)子進(jìn)程。這種處理方法比較簡(jiǎn)單明了,但是也有不少問(wèn)題:創(chuàng)建子進(jìn)程以及在進(jìn)程之間切換的開銷比較大。進(jìn)程之間共享緩存和進(jìn)程和進(jìn)行通信雖然可以使用操作系統(tǒng)提供的很多進(jìn)程通信機(jī)制,包括共享內(nèi)存段等。但是也有系統(tǒng)開銷大,效率偏低的問(wèn)題。為了解決這些問(wèn)題,提出了線程的概念。見(jiàn)圖;(b)(a)圖 進(jìn)程和線程PC指針線程進(jìn)程計(jì)算機(jī)系統(tǒng)計(jì)算機(jī)系統(tǒng)(b)(a)圖 進(jìn)程和線程PC指針線程進(jìn)程計(jì)算機(jī)系統(tǒng)計(jì)算機(jī)系統(tǒng)圖(a)計(jì)算機(jī)系統(tǒng)中共運(yùn)行了三個(gè)進(jìn)程,各自有自己的地址空間和運(yùn)行線索。如果這三個(gè)進(jìn)程的地址空間是完全可以共享的,所不同的只是運(yùn)行的線索(例如在文件服務(wù)器中),那是否可以將三個(gè)進(jìn)程的地址空間完全合一呢?這就是圖(b)所描繪的線程。圖(b)中只有一個(gè)進(jìn)程,但該進(jìn)程中包含有三個(gè)運(yùn)行線索。每個(gè)運(yùn)行線索各有自己的PC指針和運(yùn)行棧空間,嚴(yán)格按照自己的順序進(jìn)行。同進(jìn)程調(diào)度一樣,在某個(gè)時(shí)刻單機(jī)系統(tǒng)中只能有一個(gè)線程在運(yùn)行。引入線程之后,線程即成為調(diào)度程序可以調(diào)度的最小單位,但是如果在同一進(jìn)程中的不同線程之間進(jìn)行調(diào)度切換,那么系統(tǒng)開銷將顯著降低。對(duì)線程的調(diào)度算法隨操作系統(tǒng)的不同而異。線程的引入還為同族線程的數(shù)據(jù)共享提供了便利。只要系統(tǒng)提供基本的同步互斥操作,例如鎖和信號(hào)量,同族線程就可以方便地對(duì)數(shù)據(jù)區(qū)實(shí)施共享,相對(duì)于同族進(jìn)程必須通過(guò)操作系統(tǒng)核心共享數(shù)據(jù)操作就簡(jiǎn)單得多了。同族線程間對(duì)共享數(shù)據(jù)的管理任務(wù)從系統(tǒng)內(nèi)核移到了用戶程序XE"用戶程序"上,既減輕了核心的負(fù)擔(dān),又給程序員編寫一些共享程序提供了方便?,F(xiàn)代操作系統(tǒng)使用線程并不僅僅針對(duì)用戶程序XE"用戶程序",線程思想還可滲入到核心的各個(gè)部分。系統(tǒng)內(nèi)核把每一個(gè)系統(tǒng)調(diào)用看作來(lái)自用戶端的服務(wù)請(qǐng)求,經(jīng)過(guò)一些必要的處理后,就產(chǎn)生一個(gè)新線程去執(zhí)行具體的操作。這些線程共享了核心的地址空間,可以直接訪問(wèn)核心的公用數(shù)據(jù)。這樣做有兩個(gè)明顯的好處:⑴簡(jiǎn)化了系統(tǒng)內(nèi)核,加快了內(nèi)核對(duì)系統(tǒng)調(diào)用的響應(yīng)速度;⑵簡(jiǎn)化了核心態(tài)下的狀態(tài)保存。這些思想是一些微內(nèi)核操作系統(tǒng)的主體思想。2.進(jìn)程和線程的關(guān)系在引入線程機(jī)制后,進(jìn)程不再是單一的動(dòng)態(tài)實(shí)體,而是由兩部分組成:各線程活動(dòng)的環(huán)境,包括:統(tǒng)一的地址控件、全局變量、打開文件和計(jì)時(shí)器等。若干個(gè)線程,它們是進(jìn)程中的活動(dòng)部分,也是處理機(jī)的調(diào)度單位,而進(jìn)程不再是處理機(jī)的最小調(diào)度單位。一個(gè)進(jìn)程中的所有線程在同一地址空間中活動(dòng),共享該地址空間中的全局變量,共享打開文件和計(jì)時(shí)器等。它們總是相互協(xié)作,各自承擔(dān)一個(gè)作業(yè)中的某個(gè)部分。與傳統(tǒng)的進(jìn)程相似,線程具有狀態(tài)的變化。通常,這些狀態(tài)是:運(yùn)行、阻塞、就緒或終止。表 與進(jìn)程和線程有關(guān)的主要信息表線程控制信息進(jìn)程控制信息程序計(jì)數(shù)器運(yùn)行棧寄存器集子線程運(yùn)行狀態(tài)地址空間全局變量打開文件子進(jìn)程計(jì)時(shí)器線程第二節(jié) Nachos的線程管理XE"線程管理"一、Nachos的線程管理XE"線程管理"Nachos的第一個(gè)需要擴(kuò)充的部分是線程管理XE"線程管理"。Nachos提供了一個(gè)基本的線程管理系統(tǒng)和一個(gè)同步互斥機(jī)制信號(hào)量的實(shí)現(xiàn)。讀者在此基礎(chǔ)上完成鎖和條件變量等另兩種同步互斥機(jī)制并對(duì)現(xiàn)有的線程機(jī)制進(jìn)行一些加強(qiáng)。然后利用這些同步原語(yǔ)解決一些并發(fā)性問(wèn)題。例

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論