基礎(chǔ)知識
操作系統(tǒng)
操作系統(tǒng)(Operation System, OS
)是管理和控制計(jì)算機(jī)硬件與軟件資源的計(jì)算機(jī)程序,是直接運(yùn)行在“裸機(jī)”三的最基本的系統(tǒng)軟件,任何其他軟件都必須在操作系統(tǒng)的支持下才能運(yùn)行。
* 操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)資源的管理者:
* 處理機(jī)管理
* 存儲(chǔ)器管理
* 設(shè)備管理
* 文件管理
* 操作系統(tǒng)是用戶與計(jì)算機(jī)硬件系統(tǒng)之間的接口,同時(shí)也是計(jì)算機(jī)硬件和其他軟件的接口:
* 命令接口
* 程序接口
* 功能:
* 管理計(jì)算機(jī)系統(tǒng)的硬件、軟件及數(shù)據(jù)資源;
* 控制程序運(yùn)行;
* 改善人機(jī)界面;
* 為其他應(yīng)用軟件提供支持,讓計(jì)算機(jī)系統(tǒng)所有資源最大限度地發(fā)揮作用;
* 提供各種形式的用戶界面,使用戶有一個(gè)好的工作環(huán)境;
* 為其他軟件的開發(fā)提供必要的服務(wù)和相應(yīng)的接口等。
* 特征:
* 并發(fā):兩個(gè)或者多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生;
* 共享:系統(tǒng)中的資源可供內(nèi)存中多個(gè)并發(fā)執(zhí)行的進(jìn)程共同使用;
* 虛擬:把一個(gè)物理上的實(shí)體變?yōu)槿舾蓚€(gè)邏輯上的對應(yīng)物;
* 異步:在多道程序環(huán)境下,允許多個(gè)程序并發(fā)執(zhí)行,但因資源有限,進(jìn)程的執(zhí)行不是一貫到底,而是走走停停,以不可預(yù)知的速度向前推送,這就是進(jìn)程的異步性。
基本概念
*
互斥:進(jìn)程之間訪問臨界資源時(shí)相互排斥的現(xiàn)象;
臨界資源:一次僅允許一個(gè)進(jìn)程使用的資源,如 打印機(jī)。
臨界區(qū):每個(gè)進(jìn)程中訪問臨界資源的那段代碼。
* 并發(fā):同一時(shí)間段有幾個(gè)程序都處于已經(jīng)啟動(dòng)到運(yùn)行完畢之間,并且這幾個(gè)程序都在同一個(gè)處理機(jī)上運(yùn)行,并發(fā)的兩種關(guān)系是同步和互斥;
* 并行:
單處理器中進(jìn)程被交替執(zhí)行,表現(xiàn)出一種并發(fā)的外部特征;在多處理器中,進(jìn)程可以交替執(zhí)行,還能重疊執(zhí)行,實(shí)現(xiàn)并行處理,并行就是同時(shí)發(fā)生的多個(gè)并發(fā)事件,具有并發(fā)的含義,但并發(fā)不一定是并行,也就是說事件之間不一定要同一時(shí)刻發(fā)生;
* 同步:進(jìn)程之間存在依賴關(guān)系,一個(gè)進(jìn)程結(jié)束的輸出作為另一個(gè)進(jìn)程的輸入。具有同步關(guān)系的一組并發(fā)進(jìn)程之間發(fā)送的信息稱為消息或者事件;
* 異步:和同步相對,同步是順序執(zhí)行,而異步是彼此獨(dú)立,在等待某個(gè)事件的過程中繼續(xù)做自己的事,不要等待這一事件完成后再工作。
線程是實(shí)現(xiàn)異步的一個(gè)方式,異步是讓調(diào)用方法的主線程不需要同步等待另一個(gè)線程的完成,從而讓主線程干其他事情。
*
多線程:多線程是進(jìn)程中并發(fā)運(yùn)行的一段代碼,能夠?qū)崿F(xiàn)線程之間的切換執(zhí)行;
異步和多線程:不是同等關(guān)系,異步是目的,多線程只是實(shí)現(xiàn)異步的一個(gè)手段,實(shí)現(xiàn)異步可以采用多線程技術(shù)或者交給其他進(jìn)程來處理。
發(fā)展歷程
* 手工階段
* 單道批處理系統(tǒng)
* 多道批處理系統(tǒng)
* 分時(shí)操作系統(tǒng)
* 實(shí)時(shí)操作系統(tǒng)
*
網(wǎng)絡(luò)操作系統(tǒng)和分布式操作系統(tǒng)
網(wǎng)絡(luò)操作系統(tǒng)和分布式操作系統(tǒng)的不同之處在于:
在分布式操作系統(tǒng)中,若干臺(tái)計(jì)算機(jī)相互協(xié)同完成同一任務(wù);
而在網(wǎng)絡(luò)操作系統(tǒng)中,每臺(tái)計(jì)算機(jī)都是相互獨(dú)立的,它們并不能相互協(xié)同完成同一任務(wù)。
CPU的工作狀態(tài)
大多數(shù)計(jì)算機(jī)系統(tǒng)將CPU執(zhí)行狀態(tài)分為目態(tài)與管態(tài)。
管態(tài)就是 supervisor(管理者) mode翻譯來的。
那么目態(tài)呢,其實(shí)是object(目標(biāo)) mode翻譯來的。
*
管態(tài):supervisor(管理者) mode又叫特權(quán)態(tài)、系統(tǒng)態(tài)或者核心態(tài)。CPU在管態(tài)下可以執(zhí)行指令系統(tǒng)的全集。
如果程序處于管態(tài),則該程序就可以訪問計(jì)算機(jī)的任何資源,即 它的資源訪問權(quán)限不受限制。
通常,操作系統(tǒng)在管態(tài)下運(yùn)行。
*
目態(tài):object(目標(biāo))
mode又叫常態(tài)或用戶態(tài)。機(jī)器處于目態(tài)時(shí),程序只能執(zhí)行非特權(quán)指令,不能直接使用系統(tǒng)資源,也不能改變CPU的工作狀態(tài),并且只能訪問這個(gè)用戶程序自己的存儲(chǔ)空間。
科普:為什么叫object mode呢?
通常CPU執(zhí)行兩種不同性質(zhì)的程序:一種是操作系統(tǒng)內(nèi)核程序;另一種是用戶自編程序或系統(tǒng)外層的應(yīng)用程序。
對操作系統(tǒng)而言,這兩種程序的作用不同,前者是后者的管理者,因此“管理程序”要執(zhí)行一些特權(quán)指令,而“被管理程序”出于安全考慮不能執(zhí)行這些指令。
因?yàn)楣芾碚咝枰芾硭?,它就是管理者的管理目?biāo)。所以就叫object mode。
* 目態(tài)(用戶態(tài))→管態(tài)(核心態(tài))
* 系統(tǒng)調(diào)用:這是用戶態(tài)進(jìn)程主動(dòng)要求切換到核心態(tài)的一種方式,用戶態(tài)進(jìn)程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務(wù)程序完成工作。
系統(tǒng)調(diào)用機(jī)制的核心是使用了操作系統(tǒng)為用戶開放的一個(gè)中斷來實(shí)現(xiàn)。
* 異常:當(dāng)CPU在執(zhí)行用戶態(tài)程序時(shí),發(fā)生了某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了核心態(tài),如 缺頁異常。
*
I/O設(shè)備的中斷:當(dāng)I/O設(shè)備完成用戶請求操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號,這時(shí)CPU會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令,轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序
,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到核心態(tài)的切換。
例如,硬盤讀寫操作完成,系統(tǒng)會(huì)切換到硬盤讀寫的中斷處理程序中,執(zhí)行后續(xù)的操作。
其中,系統(tǒng)調(diào)用可以認(rèn)為是用戶進(jìn)程主動(dòng)發(fā)起的,異常和外部設(shè)備中斷則是被動(dòng)的。
管理功能
* 處理機(jī)管理:
* 進(jìn)程控制:
在傳統(tǒng)多道程序環(huán)境中,要是作業(yè)運(yùn)行,必須先為它創(chuàng)建一個(gè)或多個(gè)進(jìn)程,并為之分配必要的資源。當(dāng)進(jìn)程運(yùn)行結(jié)束后,立即撤銷該進(jìn)程,以便能及時(shí)回收該進(jìn)程所占用的各類資源。
* 進(jìn)程同步:為多個(gè)進(jìn)程(含線程)的運(yùn)行進(jìn)行協(xié)調(diào)。
* 進(jìn)程互斥方式:進(jìn)程(線程)在對臨界資源進(jìn)行訪問時(shí),應(yīng)采用互斥方式。
* 進(jìn)程同步方式:在相互合作去完成共同任務(wù)的諸進(jìn)程(線程)間,由同步機(jī)構(gòu)對它們的執(zhí)行次序加以協(xié)調(diào)。
* 進(jìn)程通信:
在多道程序環(huán)境下,為了加速應(yīng)用進(jìn)程的運(yùn)行,應(yīng)在系統(tǒng)中建立多個(gè)進(jìn)程,并且再為一個(gè)進(jìn)程建立若干個(gè)線程,由這些進(jìn)程(線程)相互合作去完成一個(gè)共同的任務(wù),而在這些進(jìn)程(線程)之間又往往需要交換信息。
* 調(diào)度:在后備隊(duì)列上等待的每個(gè)作業(yè)或者進(jìn)程,通常都需要調(diào)度才能執(zhí)行,調(diào)度的任務(wù),即 將處理機(jī)分配給它。
* 存儲(chǔ)器管理:
* 內(nèi)存分配:采用靜態(tài)和動(dòng)態(tài)兩種方式實(shí)現(xiàn)內(nèi)存分配數(shù)據(jù)結(jié)構(gòu),以記錄內(nèi)存使用情況,按照一定算法分配,懟不再需要的內(nèi)存進(jìn)行回收。
* 內(nèi)存保護(hù):確保每道用戶程序都只在自己的內(nèi)存空間運(yùn)行,彼此互不干擾。
*
地址映射:
編譯后的程序的地址分為邏輯地址和物理地址,多道程序環(huán)境中,每道程序不可能都從“0”地址開始,要保證程序運(yùn)行,則須將邏輯地址轉(zhuǎn)換成內(nèi)存空間中的物理地址。
動(dòng)態(tài)重定位:在程序執(zhí)行過程中,每當(dāng)訪問指令或數(shù)據(jù)時(shí),將要訪問的程序或數(shù)據(jù)的邏輯地址轉(zhuǎn)換成物理地址。
實(shí)現(xiàn)方法:
在系統(tǒng)中增加一個(gè)重定位寄存器,用來裝入程序在內(nèi)存中的起始地址,程序執(zhí)行時(shí),真正訪問的內(nèi)存地址是相對地址于重定向寄存器中的地址相加之和,從而實(shí)現(xiàn)動(dòng)態(tài)重定位。
* 內(nèi)存擴(kuò)充:從邏輯上去擴(kuò)充內(nèi)存容量,使用戶所感受到的內(nèi)存容量比實(shí)際容量大得多,或者讓更多的程序能并發(fā)執(zhí)行。
* 設(shè)備管理:
* 緩沖管理:緩沖區(qū)機(jī)制能夠有效緩解CPU運(yùn)行的高速性和I/O低速性的矛盾。
* 設(shè)備分配:設(shè)置設(shè)備控制表、控制器控制表等數(shù)據(jù)結(jié)構(gòu),能夠了解指定設(shè)備當(dāng)前是否可用,是否忙碌,以及該設(shè)備被分配出去,系統(tǒng)是否還安全。
* 設(shè)備處理程序:
實(shí)現(xiàn)CPU和設(shè)備管理器之間的通信,由CPU向設(shè)備控制器發(fā)出I/O命令,要求它完成指定的I/O操作,反之由CPU接收從控制器發(fā)來的中斷請求,并給與迅速的響應(yīng)和相應(yīng)的處理。
* 文件管理:
* 文件存儲(chǔ)空間的管理:由文件系統(tǒng)對諸多文件及文件的存儲(chǔ)空間實(shí)施統(tǒng)一的管理,對每個(gè)文件分配必要的外存空間,提高外存的利用率和文件系統(tǒng)的執(zhí)行速度。
* 目錄管理:相當(dāng)于文件的索引,建立目錄項(xiàng)(文件名、文件屬性、文件在磁盤中的物理位置等),方便用戶查詢檢索。
* 文件的讀/寫管理和保護(hù):防止未經(jīng)批準(zhǔn)的用戶存取文件、防止冒名頂替存取文件、防止以不正確的方式使用文件。
進(jìn)程與線程
對于操作系統(tǒng)來說,一個(gè)任務(wù)就是一個(gè)進(jìn)程(Process)
,比如打開一個(gè)瀏覽器就是啟動(dòng)一個(gè)瀏覽器進(jìn)程,打開一個(gè)記事本就啟動(dòng)了一個(gè)記事本進(jìn)程,打開兩個(gè)記事本就啟動(dòng)了兩個(gè)記事本進(jìn)程,打開一個(gè)Word就啟動(dòng)了一個(gè)Word進(jìn)程。
有些進(jìn)程還不止同時(shí)干一件事,比如Word,它可以同時(shí)進(jìn)行打字、拼寫檢查、打印等事情。在一個(gè)進(jìn)程內(nèi)部,要同時(shí)干多件事,就需要同時(shí)運(yùn)行多個(gè)“子任務(wù)”,我們把進(jìn)程內(nèi)的這些“子任務(wù)”稱為
線程(Thread)。
類比:
進(jìn)程=工廠
線程=工廠里各個(gè)流水線
進(jìn)程
進(jìn)程可以認(rèn)為是程序執(zhí)行時(shí)的一個(gè)實(shí)例。進(jìn)程是系統(tǒng)進(jìn)行資源分配的獨(dú)立實(shí)體,且每個(gè)進(jìn)程擁有獨(dú)立的地址空間。(即 資源的分配和調(diào)度的一個(gè)獨(dú)立單元)
進(jìn)程控制塊(Process Control Block, PCB):保存運(yùn)行期間進(jìn)程的數(shù)據(jù),PCB是進(jìn)程存在的唯一標(biāo)志。
* 進(jìn)程=程序+數(shù)據(jù)+PCB
* 一個(gè)進(jìn)程無法直接訪問另一個(gè)進(jìn)程的變量和數(shù)據(jù)結(jié)構(gòu),如果希望讓一個(gè)進(jìn)程訪問另一個(gè)進(jìn)程的資源,需要使用進(jìn)程間通信,比如:管道、文件、套接字等。
進(jìn)程的五種基本狀態(tài)及其轉(zhuǎn)換:
* 創(chuàng)建狀態(tài):
進(jìn)程正在被創(chuàng)建,尚未轉(zhuǎn)到就緒狀態(tài),創(chuàng)建進(jìn)程需要申請一個(gè)空白的PCB,并向PCB寫一些控制和管理進(jìn)程的信息,然后由系統(tǒng)分配資源,將進(jìn)程轉(zhuǎn)入就緒狀態(tài)。
* 就緒狀態(tài):進(jìn)程已處于準(zhǔn)備執(zhí)行的狀態(tài),獲得了除處理機(jī)以外的一切所需資源。
* 執(zhí)行狀態(tài):進(jìn)程在處理機(jī)上運(yùn)行。在單處理機(jī)環(huán)境下,每一時(shí)刻最多只有一個(gè)進(jìn)程運(yùn)行。
* 阻塞狀態(tài):進(jìn)程正在等待某一事件而暫停運(yùn)行,如等待某資源變?yōu)榭捎茫ú话ㄌ幚頇C(jī))或等待輸入輸出I/O完成,即使處理機(jī)空閑,該進(jìn)程也不能運(yùn)行。
* 結(jié)束狀態(tài):
進(jìn)程正從系統(tǒng)中消失,這可能是進(jìn)程正常結(jié)束或其他原因中斷退出運(yùn)行,當(dāng)進(jìn)程需要結(jié)束運(yùn)行時(shí),系統(tǒng)首先必須置該進(jìn)程為結(jié)束狀態(tài),然后再進(jìn)一步處理資源釋放和回收。
注意:后備隊(duì)列在外存中,而就緒隊(duì)列在內(nèi)存中。
進(jìn)程同步與互斥
PV操作是一種實(shí)現(xiàn)進(jìn)程互斥與同步的有效方法。PV操作與信號量的處理相關(guān),P表示通過(pass)的意思,V表示釋放(荷蘭語v開頭)的意思。
在操作系統(tǒng)中,信號量S是一整數(shù)。
S大于或等于零,代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù);
在S小于零時(shí),S表示正在等待使用資源實(shí)體的進(jìn)程數(shù)。
建立一個(gè)信號量必須說明此信號量所代表的意義并且賦初值。
除賦初值外,信號量僅能通過PV操作來訪問。
* 信號量S(semaphore)代表“資源數(shù)”
* P操作的主要?jiǎng)幼魇牵和ㄟ^(pass)(即 使用資源)
*
S減1;
類比:“占用了一個(gè)資源”
*
若S減1后仍大于或等于0,則進(jìn)程繼續(xù)執(zhí)行;
類比:“若占用一個(gè)資源后,還有多余的資源或者剛好用完資源,那么就代表該進(jìn)程有資源可以利用,進(jìn)程也就可以繼續(xù)執(zhí)行”
*
若S減1后小于0,則該進(jìn)程被阻塞后放入等待該信號量的等待隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度。
類比:“若占用一個(gè)資源后,還欠別人資源,那么就代表該進(jìn)程根本就沒有資源可以用了,如果再用就要欠債了,所以等待”
* V操作的主要?jiǎng)幼魇牵横尫?荷蘭語v開頭)(即 釋放資源)
*
S加1;
類比:“資源占用完了,物歸原主,釋放資源”
*
若相加后結(jié)果大于0,則進(jìn)程繼續(xù)執(zhí)行;
類比:“若釋放資源后,資源數(shù)大于0,就代表庫存里還有資源可以給你利用,那就繼續(xù)執(zhí)行”
*
若相加后結(jié)果小于或等于0,則從該信號的等待隊(duì)列中釋放一個(gè)等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。
類比:“若釋放資源后,資源數(shù)還是欠別人的或者為0,就代表庫存里沒有資源可以利用了,所以等待”
注意:PV操作對于每一個(gè)進(jìn)程來說,都只能進(jìn)行一次,而且必須成對使用。
進(jìn)程通信
根據(jù)交換信息量的多少和效率的高低,進(jìn)程通信分為如下低級通信和高級通信。
*
低級通信:只能傳遞狀態(tài)和整數(shù)值(控制信息)。
由于進(jìn)程的互斥和同步,需要在進(jìn)程間交換一定的信息,故不少學(xué)者將它們也歸為進(jìn)程通信。
* 特點(diǎn):傳送信息量小,效率低,每次通信傳遞的信息量固定,若傳遞較多信息則需要進(jìn)行多次通信。
* 編程復(fù)雜:用戶直接實(shí)現(xiàn)通信的細(xì)節(jié),容易出錯(cuò)。
* 高級通信:提高信號通信的效率,傳遞大量數(shù)據(jù),減輕程序編制的復(fù)雜度。
提供三種方式:
* 共享內(nèi)存模式
* 消息傳遞模式
* 共享文件模式
共享內(nèi)存模式
在通信進(jìn)程之間存在一塊可直接訪問的共享空間,通過對這片共享空間進(jìn)行寫/讀操作,實(shí)現(xiàn)進(jìn)程之間的信息交換。
在對共享空間進(jìn)行寫/讀操作時(shí),需要同步互斥工具(如 P操作、V操作),對共享空間的寫/讀進(jìn)行控制。
類比:
進(jìn)程=物品
共享空間=錢
用錢進(jìn)行交換,而不用物物交換
消息傳遞模式
在消息傳遞模式中,進(jìn)程間的數(shù)據(jù)交換是以格式化的消息(Message)為單位的。
進(jìn)程通過系統(tǒng)提供的發(fā)送消息和接收消息兩個(gè)原語進(jìn)行數(shù)據(jù)交換。
若通信進(jìn)程之間不存在可直接訪問的共享空間,則必須利用操作系統(tǒng)提供的信息傳遞方法實(shí)現(xiàn)進(jìn)程通信。
可分為直接和間接兩種通信方式:
* 直接:將消息發(fā)送給接收進(jìn)程,并將它掛在接收進(jìn)程的信息緩沖隊(duì)列中,接收進(jìn)程從消息緩沖隊(duì)列中取得消息。
*
間接:將消息發(fā)送給某個(gè)中間實(shí)體(信箱),接受進(jìn)程從中間實(shí)體中取得消息,又稱為信箱通信方式。
類比:
甲給乙寫信
直接:甲直接把信交給乙
間接:甲通過郵差把信交給乙
共享文件模式
共享文件:用于連接一個(gè)發(fā)送進(jìn)程和一個(gè)接收進(jìn)程,以實(shí)現(xiàn)它們之間通信的文件,就是共享文件,又名pipe(管道)文件。
向管道提供輸入的發(fā)送進(jìn)程,以字節(jié)流形式將大量的數(shù)據(jù)送入管道;
而接收管道輸出的接收進(jìn)程,則從管道中接收數(shù)據(jù)。
為了協(xié)調(diào)雙方的通信,管道機(jī)制必須提供互斥、同步和確定對方存在三方面的協(xié)調(diào)能力。
線程
對線程最基本的理解就是“輕量級進(jìn)程”,它是一個(gè)基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單元,由線程ID、程序計(jì)數(shù)器、寄存器集合和堆棧組成。(即
CPU調(diào)度的基本單元)
線程控制塊(Thread Control Block, TCB):保存運(yùn)行期間線程的數(shù)據(jù),TCB是線程存在的唯一標(biāo)志。
* 線程屬于進(jìn)程是進(jìn)程的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立和分配的基本單位。
* 線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可以與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。
* 一個(gè)進(jìn)程可以創(chuàng)建和撤銷另一個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
區(qū)別
* 進(jìn)程是資源分配和調(diào)度的一個(gè)獨(dú)立單元;
而線程是CPU調(diào)度的基本單元。
* 同一個(gè)進(jìn)程中可以包括多個(gè)線程,并且線程共享整個(gè)進(jìn)程的資源(寄存器、堆棧、上下文),一個(gè)進(jìn)程至少包括一個(gè)線程。
* 進(jìn)程的創(chuàng)建調(diào)用fork或者vfork,而線程的創(chuàng)建調(diào)用pthread_create;
進(jìn)程結(jié)束后它擁有的所有線程都將銷毀,而線程的結(jié)束不會(huì)影響同個(gè)進(jìn)程中的其他線程的結(jié)束。
* 線程是輕量級的進(jìn)程,它的創(chuàng)建和銷毀所需要的時(shí)間比進(jìn)程小很多,所有操作系統(tǒng)中的執(zhí)行功能都是創(chuàng)建線程去完成的。
* 線程中執(zhí)行時(shí)一半都要進(jìn)行同步和互斥,因?yàn)樗鼈児蚕硗贿M(jìn)程的所有資源。
* 線程有自己的私有屬性TCB、線程id、寄存器、硬件上下文;
而進(jìn)程也有自己的私有屬性進(jìn)程控制塊PCB,
這些私有屬性是不被共享的,用來表示一個(gè)進(jìn)程或一個(gè)線程的標(biāo)志。
處理機(jī)調(diào)度
* 高級調(diào)度:(作業(yè)調(diào)度)根據(jù)某種算法,把外存上處于后備隊(duì)列中那些作業(yè)調(diào)入內(nèi)存。
* 中級調(diào)度:(內(nèi)存調(diào)度)將那些暫時(shí)不能運(yùn)行的進(jìn)程調(diào)至外存等待,把進(jìn)程狀態(tài)改為就緒駐外存狀態(tài)或掛機(jī)狀態(tài)。
* 低級調(diào)度:(進(jìn)程調(diào)度)按照某種算法從就緒隊(duì)列(內(nèi)存)中選取一個(gè)進(jìn)程,將處理機(jī)分配給它。
調(diào)度算法
調(diào)度算法是根據(jù)系統(tǒng)的資源分配策略所規(guī)定的資源分配算法。
有的調(diào)度算法適用于作業(yè)調(diào)度,有的適用于進(jìn)程調(diào)度,有的兩種都適用。
* 周轉(zhuǎn)時(shí)間=等待時(shí)間+執(zhí)行時(shí)間
先來先服務(wù)調(diào)度(FCFS)
先來先服務(wù)調(diào)度(First Come First Service, FCFS):按照作業(yè)/進(jìn)程進(jìn)入系統(tǒng)的先后次序進(jìn)行調(diào)度,先進(jìn)入系統(tǒng)者先調(diào)度,即 啟動(dòng)
等待時(shí)間最長的作業(yè)/進(jìn)程。
* 適用性:作業(yè)調(diào)度、進(jìn)程調(diào)度。
* 優(yōu)點(diǎn):
* 算法簡單
* 對長作業(yè)/進(jìn)程有利(短的要等好久)
*
有利于CPU繁忙型作業(yè)/進(jìn)程
CPU繁忙意味著是長作業(yè),不需要頻繁的輸入輸出
* 缺點(diǎn):
* 效率低
*
對短作業(yè)/進(jìn)程不利
因?yàn)槎套鳂I(yè)執(zhí)行時(shí)間很短,若令它等待較長時(shí)間,則帶權(quán)周轉(zhuǎn)時(shí)間會(huì)很高。
*
不利于I/O繁忙型作業(yè)進(jìn)程
I/O繁忙意味著不停地中斷完成,是短作業(yè)
短作業(yè)優(yōu)先調(diào)度(SJF)
短作業(yè)優(yōu)先調(diào)度(Shortest Job First, SJF):該算法每次從后備隊(duì)列/就緒隊(duì)列中選擇一個(gè)估計(jì)時(shí)間最短的作業(yè)/進(jìn)程,將資源分配給它。
* 適用性:作業(yè)調(diào)度、進(jìn)程調(diào)度。
* 優(yōu)點(diǎn):
* 平均等待時(shí)間和平均周轉(zhuǎn)時(shí)間最少
* 缺點(diǎn):
* 對長作業(yè)/進(jìn)程不利(可能導(dǎo)致長作業(yè)/進(jìn)程長期不被調(diào)度,發(fā)生“饑餓”現(xiàn)象)
* 不能保證緊迫性作業(yè)/進(jìn)程會(huì)被及時(shí)處理
*
由于作業(yè)/進(jìn)程的長短只是根據(jù)客戶說提供的估計(jì)執(zhí)行時(shí)間而定的,而用戶有可能會(huì)有意或無意地縮短氣作業(yè)的估計(jì)運(yùn)行時(shí)間,致使該算法不一定能真正做到短作業(yè)優(yōu)先調(diào)度。
優(yōu)先級調(diào)度
優(yōu)先級調(diào)度:該算法每次從后備隊(duì)列/就緒隊(duì)列中選擇優(yōu)先級最高的一個(gè)作業(yè)/進(jìn)程,將資源分配給它。
* 適用性:作業(yè)調(diào)度、進(jìn)程調(diào)度。
根據(jù)新的更高優(yōu)先級進(jìn)程能否搶占正在執(zhí)行的進(jìn)程,可將該調(diào)度分為:
* 非搶占式優(yōu)先級調(diào)度算法:
當(dāng)有進(jìn)程正在處理機(jī)上運(yùn)行時(shí),即使有更高優(yōu)先級的進(jìn)程進(jìn)入就緒隊(duì)列,也需等待當(dāng)前進(jìn)程運(yùn)行完成,等待主動(dòng)讓出處理機(jī)后,才把處理機(jī)分配給高優(yōu)先級的進(jìn)程。
* 搶占式優(yōu)先權(quán)調(diào)度算法:
當(dāng)有進(jìn)程正在處理機(jī)上運(yùn)行時(shí),只要又出現(xiàn)了另一個(gè)其優(yōu)先權(quán)更高的進(jìn)程,進(jìn)程調(diào)度程序就立即停止當(dāng)前進(jìn)程(原優(yōu)先權(quán)最高的進(jìn)程)的執(zhí)行,重新將處理機(jī)分配給新到的優(yōu)先權(quán)最高的進(jìn)程。
高響應(yīng)比優(yōu)先調(diào)度(HRRN)
高響應(yīng)比優(yōu)先調(diào)度(Highest Response Ratio Next,
HRRN):該算法是對FCFS調(diào)度算法和SJF調(diào)度算法的一種綜合平衡,同時(shí)考慮每個(gè)作業(yè)的等待時(shí)間和估計(jì)的運(yùn)行時(shí)間。
在每次進(jìn)行作業(yè)調(diào)度時(shí),先計(jì)算后備作業(yè)隊(duì)列中每個(gè)作業(yè)的響應(yīng)比,從中選出響應(yīng)比最高的作業(yè)投入運(yùn)行。
響應(yīng)比=作業(yè)周轉(zhuǎn)時(shí)間/作業(yè)執(zhí)行時(shí)間=(等待時(shí)間+要求服務(wù)時(shí)間)/要求服務(wù)時(shí)間
* 適用性:主要用于作業(yè)調(diào)度
* 優(yōu)點(diǎn):
* 等待時(shí)間相同的作業(yè),要求服務(wù)的時(shí)間越短,其優(yōu)先權(quán)越高,此時(shí)對短作業(yè)有利;
* 等待時(shí)間相同的作業(yè),等待時(shí)間越長,其優(yōu)先權(quán)越高,此時(shí)等同于先來先服務(wù)調(diào)度算法;
* 對于長作業(yè),優(yōu)先權(quán)隨等待時(shí)間的增加而提高,其等待時(shí)間足夠長時(shí),其優(yōu)先權(quán)便可提升到很高,從而也可獲得處理機(jī),此時(shí)對長作業(yè)有利,克服了饑餓狀態(tài)。
* 缺點(diǎn):
* 要進(jìn)行響應(yīng)比計(jì)算,增加了系統(tǒng)開銷。
時(shí)間片輪轉(zhuǎn)調(diào)度
該算法將所有就緒進(jìn)程按到達(dá)的先后次序排成一個(gè)隊(duì)列,每次調(diào)度時(shí),把處理機(jī)分配給隊(duì)首進(jìn)程,并令其執(zhí)行一個(gè)時(shí)間片;
當(dāng)執(zhí)行的時(shí)間片用完時(shí),由一個(gè)計(jì)時(shí)器發(fā)出時(shí)鐘中斷請求,調(diào)度程序便停止該進(jìn)程的執(zhí)行,并將其放到就緒隊(duì)列尾;
然后,再把處理機(jī)分配給就緒隊(duì)列中新的隊(duì)首。
* 適用性:主要用于分時(shí)系統(tǒng)中進(jìn)程調(diào)度
多級反饋隊(duì)列調(diào)度
該算法是時(shí)間片輪轉(zhuǎn)調(diào)度算法和優(yōu)先級調(diào)度算法的綜合和發(fā)展,通過動(dòng)態(tài)調(diào)整進(jìn)程優(yōu)先級和時(shí)間片大小,可以兼顧多方面的系統(tǒng)目標(biāo)。
設(shè)置多個(gè)就緒隊(duì)列,并賦予不同優(yōu)先級,優(yōu)先級越高,時(shí)間片越小
,進(jìn)程在進(jìn)入待調(diào)度的隊(duì)列等待時(shí),首先進(jìn)入優(yōu)先級最高的Q1等待,一個(gè)時(shí)間片結(jié)束后,若進(jìn)程沒有運(yùn)行完,則轉(zhuǎn)入低一級的就緒隊(duì)列隊(duì)尾,僅當(dāng)高優(yōu)先級隊(duì)列中無就緒進(jìn)程才開始調(diào)度低一級的就緒隊(duì)列中的進(jìn)程(若此刻有進(jìn)程進(jìn)入了高優(yōu)先級隊(duì)列中,那么要先轉(zhuǎn)去調(diào)用高優(yōu)先級隊(duì)列)。
* 例子:
假設(shè)系統(tǒng)中有3個(gè)反饋隊(duì)列Q1,Q2,Q3,時(shí)間片分別為2,4,8。
設(shè)有3個(gè)作業(yè)J1,J2,J3分別在時(shí)間 0 ,1,3時(shí)刻到達(dá)。而它們所需要的CPU時(shí)間分別是3,2,1個(gè)時(shí)間片。
* 時(shí)刻0 J1到達(dá)。于是進(jìn)入到隊(duì)列1 , 運(yùn)行1個(gè)時(shí)間片 , 時(shí)間片還未到,此時(shí)J2到達(dá)。
* 時(shí)刻1 J2到達(dá)。 由于同一隊(duì)列采用先來先服務(wù),于是J2等待。
J1在運(yùn)行了1個(gè)時(shí)間片后,已經(jīng)完成了在Q1中的2個(gè)時(shí)間片的限制,于是J1置于Q2等待被調(diào)度。當(dāng)前處理機(jī)分配給J2。
* 時(shí)刻2 J1進(jìn)入Q2等待調(diào)度,J2獲得CPU開始運(yùn)行。
* 時(shí)刻3 J3到達(dá),由于同一隊(duì)列采用先來先服務(wù),故J3在Q1等待調(diào)度,J1也在Q2等待調(diào)度。
* 時(shí)刻4 J2處理完成,由于J3,J1都在等待調(diào)度,但是J3所在的隊(duì)列比J1所在的隊(duì)列的優(yōu)先級要高,于是J3被調(diào)度,J1繼續(xù)在Q2等待。
* 時(shí)刻5 J3經(jīng)過1個(gè)時(shí)間片,完成。
*
時(shí)刻6 由于Q1已經(jīng)空閑,于是開始調(diào)度Q2中的作業(yè),則J1得到處理器開始運(yùn)行。J1再經(jīng)過一個(gè)時(shí)間片,完成了任務(wù)。于是整個(gè)調(diào)度過程結(jié)束。
從上面的例子看,在多級反饋隊(duì)列中,后進(jìn)的作業(yè)不一定慢完成。
死鎖
死鎖是指多個(gè)進(jìn)程因競爭臨界資源而造成的一種僵局(互相等待),若無外力作用,這些進(jìn)程都無法向前推進(jìn)。
* 產(chǎn)生死鎖的根本原因是系統(tǒng)能夠提供的資源個(gè)數(shù)比要求該資源的進(jìn)程數(shù)要少。
* 產(chǎn)生死鎖的基本原因:
*
資源競爭
例子:
A有紙,B有筆
A:你不給我筆,我就寫不完作業(yè)
B:你不給我紙,我就寫不了作業(yè)
彼此僵持不下。。
*
進(jìn)程推進(jìn)順序非法
例子:
A要前進(jìn)2步,到桌子前,再后退2步,結(jié)果順序非法:
A先后退,就永遠(yuǎn)到不了桌子前,觸發(fā)不了,死鎖
* 產(chǎn)生是死鎖的必要條件:
* 互斥條件:涉及的資源是非共享的,即 一次只有一個(gè)進(jìn)程使用。如果有另一個(gè)進(jìn)程申請?jiān)撡Y源,那么申請進(jìn)程必須等待,直到該資源被釋放。
* 不剝奪條件(非搶占):進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即 只能由獲得該資源的進(jìn)程自己來釋放。
* 占有并等待(部分分配):進(jìn)程每次申請它所需要的一部分資源。在等待一新資源的同時(shí),進(jìn)程繼續(xù)占用已分配到的資源。
*
環(huán)路條件(循環(huán)等待):存在一種進(jìn)程循環(huán)鏈,鏈中每一個(gè)進(jìn)程已獲得的資源同時(shí)被鏈中下一個(gè)資源所請求。
注意:這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立;
反之,只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。
處理策略
預(yù)防死鎖
預(yù)防死鎖:通過設(shè)置一些限制條件,破壞死鎖的一些必要條件,讓死鎖無法發(fā)生。
避免死鎖
避免死鎖:在動(dòng)態(tài)分配資源的過程中,用一些算法(如 銀行家算法)防止系統(tǒng)進(jìn)入不安全狀態(tài),避免死鎖的發(fā)生。
銀行家算法
Dijkstra E W于1968年提出銀行家算法。之所以稱為銀行家算法,是因?yàn)樵撍惴捎糜阢y行系統(tǒng)。
新進(jìn)程進(jìn)入系統(tǒng)時(shí),它必須說明各類資源類型的實(shí)例的最大需求量,這一數(shù)量不能超過系統(tǒng)各類資源的總數(shù)。
當(dāng)進(jìn)程申請一組資源時(shí),該算法需要檢查申請者懟各類資源的最大需求量,如果系統(tǒng)現(xiàn)存的各類資源的數(shù)量可以滿足當(dāng)前它懟各類資源的最大需求量時(shí),就滿足當(dāng)前的申請;否則,進(jìn)程必須等待,直到其他進(jìn)程釋放足夠的資源為止。
換言之,僅當(dāng)申請者可以在一定時(shí)間內(nèi)無條件地歸還它所申請的全部資源時(shí),才能把資源分配給它。
死鎖的檢測及解除
死鎖的檢測及解除:在死鎖發(fā)生前不做任何操作,只是檢測當(dāng)前是否發(fā)生死鎖,若發(fā)生死鎖,則采取一些措施(如 資源剝奪法、撤銷進(jìn)程法、進(jìn)程回退法)來解除死鎖。
主存管理
分區(qū)存儲(chǔ)管理
在分區(qū)存儲(chǔ)管理中,程序的地址空間是一維線性的,因?yàn)橹噶罨虿僮鲾?shù)地址只要給出一個(gè)信息量即可決定。
分區(qū)存儲(chǔ)管理中常用的分配策略有:首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法和最壞適應(yīng)算法。
首次適應(yīng)算法
首次適應(yīng)算法:按地址從小到大排序,分配第一個(gè)符合條件的分區(qū)。
* 優(yōu)點(diǎn):
* 保留高地址部分的大空閑區(qū),有利于后來的大型作業(yè)分配。
* 缺點(diǎn):
* 低地址部分被不斷劃分,留下許多難以利用的小空閑區(qū);
* 每次分配時(shí)都要從低地址部分開始查找,增加查找時(shí)的系統(tǒng)開銷。
循環(huán)首次適應(yīng)算法
循環(huán)首次適應(yīng)算法:在首次適應(yīng)算法的基礎(chǔ)上,從上次查找結(jié)束的位置開始查找,分配第一個(gè)符合的分區(qū)。
* 優(yōu)點(diǎn):
* 使內(nèi)存中的空閑分區(qū)分布更均勻,減少了查找時(shí)的系統(tǒng)開銷。
* 缺點(diǎn):
* 缺乏大的空閑區(qū),可能導(dǎo)致不能裝入大型作業(yè)。
最佳適應(yīng)算法
最佳適應(yīng)算法:是按空間從小到大排序,分配第一個(gè)符合條件的分區(qū)。
* 優(yōu)點(diǎn):
* 每次分配的空閑區(qū)都是最合適的
* 缺點(diǎn):
* 在內(nèi)存中留下許多難以利用的小空閑區(qū)
最壞適應(yīng)算法
最壞適應(yīng)算法:是按地址從大到小排序,分配第一個(gè)符合條件的分區(qū)。
* 優(yōu)點(diǎn):
* 產(chǎn)生碎片的幾率最小,對中小型作業(yè)有利。
* 缺點(diǎn):
* 缺乏大的空閑區(qū),對大型作業(yè)不利。
頁式存儲(chǔ)管理
在頁式存儲(chǔ)管理中,程序的地址空間是一維線性的,因?yàn)橹噶罨虿僮鲾?shù)地址只要給出一個(gè)信息量即可決定。
理解:頁式存儲(chǔ)管理只用給出一個(gè)邏輯地址就行,因?yàn)轫摰拇笮∈枪潭ǖ?,邏輯地址÷頁的大?頁號...余 偏移量,所以是地址空間一維的,只用一個(gè)邏輯地址。
頁面置換算法
在地址映射過程中,若在頁面中發(fā)現(xiàn)所要訪問的頁面不在內(nèi)存中,則產(chǎn)生缺頁中斷。
當(dāng)發(fā)生缺頁中斷時(shí),如果操作系統(tǒng)內(nèi)存中沒有空閑頁面,則操作系統(tǒng)必須在內(nèi)存選擇一個(gè)頁面將其移出內(nèi)存,以便為即將調(diào)入的頁面讓出空間。而用來選擇淘汰哪一頁的規(guī)則叫做
頁面置換算法。
抖動(dòng)(顛簸):是指在頁面置換過程中,剛剛調(diào)出的頁面馬上又要調(diào)入內(nèi)存,剛剛調(diào)入的頁面馬上又要調(diào)出,發(fā)生頻繁的頁面調(diào)度行為。
* 缺頁中斷率=成功訪問次數(shù)/總訪問次數(shù)
* 最佳置換算法(OPTimal replacement, OPT
):將以后永不使用的或者在最長時(shí)間內(nèi)不會(huì)被訪問的頁面調(diào)出,但由于人們無法預(yù)知進(jìn)程在內(nèi)存下的若干頁面中哪個(gè)是未來最長時(shí)間內(nèi)不再被訪問的,因而該算法無法實(shí)現(xiàn)。
*
先進(jìn)先出置換算法(First In First Out, FIFO):將最早進(jìn)入內(nèi)存的頁面調(diào)出。
該算法會(huì)產(chǎn)生Belady異常,即 發(fā)生缺頁時(shí),如果對一個(gè)進(jìn)程未分配它所要求的全部頁面,有時(shí)分配頁數(shù)↑,缺頁率反而↑
的異?,F(xiàn)象。(先進(jìn)先出,結(jié)果進(jìn)來了一個(gè)需要的頁,也出去了一個(gè)需要的頁)
* 最近最久未使用置換算法(Least Recently Used, LRU
):是將最近最長時(shí)間未訪問的頁面調(diào)出。該算法為每個(gè)頁面設(shè)置一個(gè)訪問字段,記錄頁面上次被訪問以來所經(jīng)歷的時(shí)間,調(diào)出頁面時(shí)選擇時(shí)間最長的頁面。
* 最不經(jīng)常使用置換算法(Least Frequently Used ,LFU):將最近應(yīng)用次數(shù)最少的頁淘汰。
*
時(shí)鐘置換算法(CLOCK):也稱為最近未用算法(NRU
),該算法是為每個(gè)頁面設(shè)置一個(gè)使用位,需要替換頁面時(shí),循環(huán)檢查各個(gè)頁面,將使用位為1的頁面重置為0(使用時(shí)再置為1),直到遇到第一個(gè)使用位為0的頁面,將其調(diào)出。
如果在每個(gè)頁面再增加一個(gè)修改位,則得到改進(jìn)型的CLOCK置換算法,類似的,需要替換頁面時(shí),將使用位和修改位都為0的頁面調(diào)出。
段式存儲(chǔ)管理
段式存儲(chǔ)管理的用戶地址是二維的、按段劃分的。
理解:段式存儲(chǔ)管理必須給出(段號,偏移量),因?yàn)槎蔚拇笮〔还潭?,必須給出這兩個(gè),所以是二維的。
在這樣的系統(tǒng)中作業(yè)的地址空間由若干邏輯分段組成,每個(gè)分段有自己的名字,對于一個(gè)分段而言,它是一個(gè)連續(xù)的地址區(qū)。
* 由于標(biāo)識某一程序地址時(shí),要同時(shí)給出段名和段內(nèi)地址,因此地址空間是二維
的(實(shí)際上,為了實(shí)現(xiàn)方便,在第一次訪問某段時(shí),操作系統(tǒng)就用唯一的段號來代替該段的段名)。
* 程序地址的一般形式由(s,w)組成,這里s是段號,w是段內(nèi)位移。
段號 段內(nèi)位移
s w
分頁和分段的異同
* 相同點(diǎn):
* 分頁和分段都采用離散分配(也就是不連續(xù)的分配地址,類似于鏈表)的方式
* 都要通過地址映射機(jī)構(gòu)來實(shí)現(xiàn)地址變換
* 不同點(diǎn):
* 從功能上看,
頁是信息的物理單位,分頁是為實(shí)現(xiàn)離散分配方式,以消除內(nèi)存的外零頭,提高內(nèi)存利用率,是為了滿足系統(tǒng)管理的需要;
而段是信息的邏輯單位,它含有一組意義相對完整的信息,是為了滿足用戶的需要。
* 頁的大小是由系統(tǒng)確定且固定不變的;
而段的長度不固定,取決于用戶編寫的程序。
* 分頁的作業(yè)地址空間是一維的;
而分段的作業(yè)地址空間是二維的。
段頁式存儲(chǔ)管理
段頁式存儲(chǔ)管理的用戶地址也是二維的、按段劃分的。只是在段中再劃分成若干大小相等的頁。
理解:段頁式存儲(chǔ)管理也必須給出(段號,偏移量),雖然段的大小不固定,但是段內(nèi)頁號和頁內(nèi)偏移可以根據(jù)偏移量算出來,所以還是二維的。
*
地址結(jié)構(gòu)就由段號、段內(nèi)頁號、頁內(nèi)位移三部分組成。
注意:不要看三部分就是三維的了,其實(shí)用戶使用的部分也是二維的。
段號 段內(nèi)頁號 頁內(nèi)位移
*
用戶使用的仍是段號和段內(nèi)相對地址,
由地址變換機(jī)構(gòu)自動(dòng)將段內(nèi)相對地址的高幾位解釋為段內(nèi)頁號,將剩余的低位解釋為頁內(nèi)位移。
*
用戶地址空間的最小單位不是段而是頁,而主存按頁的大小劃分,按頁裝入。
這樣,一個(gè)段可以裝入到若干個(gè)不連續(xù)的主存塊內(nèi),段的大小不再受主存可用區(qū)的限制了。
虛擬存儲(chǔ)器
虛擬存儲(chǔ)器:是指具有請求調(diào)入功能和置換功能,并能從邏輯上對內(nèi)存容量加以擴(kuò)充的一種存儲(chǔ)器系統(tǒng)。
* 局部性原理:是指CPU訪問存儲(chǔ)器時(shí),無論是存取指令還是存取數(shù)據(jù),所訪問的存儲(chǔ)單元都趨于聚集在一個(gè)較小的連續(xù)區(qū)域中。
*
時(shí)間局部性(Temporal Locality):如果一個(gè)信息項(xiàng)正在被訪問,那么在近期它很可能還會(huì)被再次訪問。
程序循環(huán)、堆棧等是產(chǎn)生時(shí)間局部性的原因。
* 空間局部性(Spatial Locality):在最近的將來將用到的信息很可能與正在使用的信息在空間地址上是臨近的。
*
順序局部性(Order
Locality):在典型程序中,除轉(zhuǎn)移類指令外,大部分指令是順序進(jìn)行的。順序執(zhí)行和非順序執(zhí)行的比例大致是5:1。此外,對大型數(shù)組訪問也是順序的。
指令的順序執(zhí)行、數(shù)組的連續(xù)存放等是產(chǎn)生順序局部性的原因。
虛擬存儲(chǔ)器基于局部性原理,在程序裝入時(shí),可以只將程序的一部分裝入內(nèi)存,就可以啟動(dòng)程序執(zhí)行。
在執(zhí)行過程中,當(dāng)所訪問的信息不在內(nèi)存中時(shí),由操作系統(tǒng)將所需內(nèi)容調(diào)入內(nèi)存,使程序繼續(xù)執(zhí)行;
同時(shí),操作系統(tǒng)將內(nèi)存中暫時(shí)不用的內(nèi)容調(diào)出到外存。
這樣,系統(tǒng)就好像為用戶提供了一個(gè)比實(shí)際內(nèi)存大得多的存儲(chǔ)器,稱為虛擬存儲(chǔ)器。
* 特征:
* 離散性:
是指內(nèi)存分配時(shí)采用離散分配的方式。若采用連續(xù)分配方式,需要將作業(yè)裝入到連續(xù)的內(nèi)存區(qū)域,這樣需要連續(xù)地一次性申請一部分內(nèi)存空間,無法實(shí)現(xiàn)虛擬存儲(chǔ)功能,只有采用離散分配方式,才能為它申請內(nèi)存空間,以避免浪費(fèi)內(nèi)存空間。
* 多次性:作業(yè)無需在運(yùn)行時(shí)一次性全部裝入內(nèi)存,而是可以分成多次調(diào)入內(nèi)存。
* 對換性:作業(yè)運(yùn)行時(shí)無需常駐內(nèi)存,可以進(jìn)行調(diào)入調(diào)出。
* 虛擬性:從邏輯上擴(kuò)充了內(nèi)存的容量,使用戶所感覺到的內(nèi)存容量遠(yuǎn)大于實(shí)際容量。
文件系統(tǒng)
文件分配
文件分配對應(yīng)于文件的物理結(jié)構(gòu),是指如何為文件分配磁盤塊(外存)。
常用的磁盤空間分配方法有三種:
* 連續(xù)分配:要求每個(gè)文件在磁盤上占有一組連續(xù)的塊。
* 鏈接分配:采取離散分配的方式,分為隱式鏈接分配和顯式鏈接分配。
* 隱式鏈接分配:每個(gè)文件對應(yīng)一個(gè)磁盤塊的鏈表,磁盤塊任意分布,除最后一個(gè)盤塊外,每一個(gè)盤塊都有指向下一個(gè)盤塊的指針(類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表)。
* 顯式鏈接分配:
把用于鏈接文件各物理塊的指針提取出來,顯示地存放在內(nèi)存里的一張鏈接表中,該表整個(gè)磁盤僅設(shè)置一張,由于分配給文件的所有盤塊號都放在該表中,故稱該表為文件分配表(FAT)。
* 索引分配:把每個(gè)文件的所有盤塊號集中在一起構(gòu)成索引塊(表)。
磁盤調(diào)度算法
* 先來先服務(wù)算法(First Come First Service, FCFS):根據(jù)進(jìn)程請求訪問磁盤的先后順序進(jìn)行調(diào)度。
*
最短尋找時(shí)間優(yōu)先算法(Shortest Seek Time First, SSTF):選擇處理的磁道是與當(dāng)前磁頭所在磁道距離最近的磁道,使每次的尋找時(shí)間最短。
該算法會(huì)產(chǎn)生“饑餓”現(xiàn)象。
*
掃描算法(SCAN):也叫電梯算法,在磁頭當(dāng)前移動(dòng)方向上選擇與當(dāng)前磁頭所在距離最近的請求作為下一次服務(wù)的對象。
實(shí)際上是在SSTF算法的基礎(chǔ)上規(guī)定了磁頭運(yùn)動(dòng)的方向。
*
循環(huán)掃描算法(Cyclic SCAN, C-SCAN):在SCAN算法的基礎(chǔ)上規(guī)定磁頭單向移動(dòng)來提供服務(wù),到達(dá)磁盤端點(diǎn)返回時(shí),直接快速返回起始端。
若磁頭移動(dòng)到最遠(yuǎn)端的請求后,即刻返回,而不是到達(dá)端點(diǎn)再返回,則將改進(jìn)后的SCAN算法和C-SCAN算法稱為LOOK算法和C-LOOK算法。
I/O管理
I/O控制方式
*
程序I/O方式:
計(jì)算機(jī)從外部設(shè)備讀取數(shù)據(jù)到存儲(chǔ)器,每次讀取一個(gè)字的數(shù)據(jù)。對讀入的每個(gè)字,CPU需要對外設(shè)狀態(tài)進(jìn)行循環(huán)檢查,直到確定該字已經(jīng)在I/O控制器的數(shù)據(jù)寄存器中。
該方式適用于早期的無中斷計(jì)算機(jī)系統(tǒng)中。
CPU和I/O設(shè)備只能串行工作,導(dǎo)致CPU的利用率相當(dāng)?shù)汀?br>
*
中斷驅(qū)動(dòng)I/O控制方式:允許I/O設(shè)備主動(dòng)打斷CPU的運(yùn)行并請求服務(wù),從而使CPU在對I/O控制器發(fā)送命令后可以做其他工作。
該方法普遍用于現(xiàn)代的計(jì)算機(jī)系統(tǒng)中。
由于數(shù)據(jù)中每個(gè)字在存儲(chǔ)器與I/O控制器之間 的傳輸都必須經(jīng)過CPU,仍然會(huì)小號CPU較多的時(shí)間。
*
DMA I/O控制方式:在I/O設(shè)備和內(nèi)存之間開辟直接的數(shù)據(jù)交換通路,數(shù)據(jù)的基本單位是數(shù)據(jù)塊,所傳送的數(shù)據(jù)是從設(shè)備直接送入內(nèi)存;
或者相反,僅在傳送數(shù)據(jù)塊的開始和結(jié)束時(shí)需要CPU干預(yù),數(shù)據(jù)傳送是在DMA控制器的控制下完成的。
該方法適用于I/O設(shè)備為塊設(shè)備時(shí)和主機(jī)進(jìn)行數(shù)據(jù)交換。
塊設(shè)備是I/O設(shè)備中的一類,是將信息存儲(chǔ)在固定大小的塊中,每個(gè)塊都有自己的地址,還可以在設(shè)備的任意位置讀取一定長度的數(shù)據(jù),例如硬盤,U盤,SD卡等。
直接內(nèi)存存取(Direct Memory Access, DMA
)是所有現(xiàn)代電腦的重要特色,它允許不同速度的硬件裝置來溝通,而不需要依賴于CPU的大量中斷負(fù)載。
否則,CPU需要從來源把每一片段的資料復(fù)制到暫存器,然后把它們再次寫回到新的地方。在這個(gè)時(shí)間中,CPU對于其他的工作來說就無法使用。
*
I/O通道控制方式:是DMA方式的發(fā)展,只在一組數(shù)據(jù)的傳輸開始和結(jié)束時(shí)需要CPU干預(yù),可以實(shí)現(xiàn)CPU、通道和I/O設(shè)備三者的并行操作。
該方式適用于設(shè)備與主機(jī)進(jìn)行數(shù)據(jù)交換是一組數(shù)據(jù)塊的情況,使用該方法要求系統(tǒng)必須配置相應(yīng)的通道及通道控制器。
緩沖區(qū)
引入緩沖區(qū)的目的是什么?
* 緩和CPU與I/O設(shè)備間速度不匹配的矛盾;
* 減少對CPU的中斷頻率,放寬對CPU中斷響應(yīng)時(shí)間的限制;
* 解決基本數(shù)據(jù)單元大?。?數(shù)據(jù)粒度)不匹配的問題;
* 提高CPU和I/O設(shè)備之間的并行性。
熱門工具 換一換