第 1 章 操作系統引論
操作系統
操作系統是一組能有效地組織和管理計算機硬件和軟件資源,合理地對各類作業進行調度,以及方便用戶使用的程序的集合。
單道批處理系統
概念
系統對作業的處理是成批進行的,但在內存中始終只保持一道作業。
缺點
系統中的資源得不到充分的利用。
多道批處理系統
概念
作業先存放在外存上並排成一個隊列,稱為 “后備隊列”。然后由作業調度程序按一定的算法從后備隊列中選擇若干個作業調入內存,使它們共享 CPU 和系統中的各種資源。
優點
- 資源利用率高
- 系統吞吐量大
缺點
- 平均周轉時間長
- 無交互能力
硬實時任務
指系統必須滿足任務對截止時間的要求,否則可能出現難以預測的后果。
軟實時任務
同硬實時任務一樣,也聯系着一個截止時間,但並不嚴格,若偶爾錯過了任務的截止時間,對系統產生的影響也不會太大。
作業周轉時間
從作業進入系統到作業完成退出系統所用時間。
系統吞吐量
單位時間內系統所處理的作業個數。
搶占式調度
該調度方式允許調度程序根據某種原則,去暫停某個正在執行的進程,將已分配給該進程的處理機重新分配給另一進程。
非搶占式調度
采用該調度方式時,一旦把處理機分配給某進程后,就一直讓它運行下去,絕不會因為時鍾中斷或任何其它原因去搶占當前正在運行進程的處理機,直至該進程完成,或發生某事件而被阻塞時,才把處理機分配給其它進程。
第 2 章 進程的描述與控制
程序並發時的特征
-
間斷性
程序在並發執行時,由於它們共享系統資源,以及為完成同一項任務而相互合作,致使在這些並發執行的程序之間形成了相互制約的關系。
-
失去封閉性
當系統中存在着多個可以並發執行的程序時,系統中的各種資源將為它們所共享,而這些資源的狀態也由這些程序來改變,致使其中任一程序在運行時,其環境都必然會受到其它程序的影響。
-
不可再現性
程序在並發執行時,由於失去了封閉性,也將導致其又失去可再現性。
進程
定義
進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位
特征
-
動態性
動態性是進程的最基本的特征。它由創建而產生,由調度而執行,由撤銷而消亡。
-
並發性
指多個進程實體同存於內存中,且能在一段時間內同時運行。
-
獨立性
指進程實體是一個能獨立運行、獨立獲得資源和獨立接受調度的基本單位。
-
異步性
指進程是按異步方式運行的,即按各自獨立的、不可預知的速度向前推進。
五個基本狀態
-
創建狀態
進程已擁有了自己的 PCB,但進程自身還未進入主存,即創建工作尚未完成,進程還不能被調度運行,其所處的狀態。
-
就緒狀態
指進程已處於准備好的狀態,即進程已分配到除 CPU 以外的所有必要資源后,只要再獲得 CPU,便可立即執行。
-
執行狀態
指進程已獲得 CPU,其程序正在執行的狀態。
-
阻塞狀態
指正在執行的進程由於發生某事件(如 I/O 請求、申請緩沖區失敗等)暫時無法繼續執行的狀態,亦即進程的執行收到阻塞。
-
終止狀態
當一個進程到達了自然結束點,或是出現了無法克服的錯誤,或是被操作系統所終結,或是被其他有終止權的進程所終結,它將進入終止狀態。
五個基本狀態的狀態轉換圖

原語
原語是由若干條機器指令所構成,用以完成特定功能的一段程序。
進程創建原語 Create 的功能
- 申請空白 PCB;
- 為新進程分配其運行所需的資源;
- 初始化進程控制塊 PCB;
- 如果進程就緒隊列能接納新進程,便將新進程插入就緒隊列。
臨界資源
一次僅允許一個進程使用的資源,如打印機、變量。
臨界區
臨界區是指每個進程中訪問臨界資源的那段代碼。
臨界區管理的准則
-
空閑讓進
當無進程處於臨界區時,表明臨界資源處於空閑狀態,應允許一個請求進入臨界區的進程立即進入自己的臨界區,以有效地利用臨界資源。
-
忙則等待
當已有進程進入臨界區時,表明臨界資源正在被訪問,因而其它試圖進入臨界區的進程必須等待,以保證對臨界資源的互斥訪問。
-
有限等待
對要求訪問臨界資源的進程,應保證在有限時間內能進入自己的臨界區,以免陷入 “死等” 狀態。
-
讓權等待
當進程不能進入自己的臨界區時,應立即釋放處理機,以免進程陷入 “忙等” 狀態。
信號量
所謂信號量,是一個僅能由同步原語對其進行操作的整型變量。
P、V 操作
指兩個標准的原子操作 wait(S)和 signal(S),執行時不可中斷。
兩個操作的描述如下:
wait(S) {
while (S <= 0); // 不做任何操作
S--;
}
signal(S) {
S++;
}
S > 0 時,S 為可用資源量;S = 0 時,可用資源量用完。
利用信號量實現前驅關系

對於上圖,可用代碼框架描述:
p1() {S1; signal(a); signal(b);}
p2() {wait(a); S2; signal(c); signal(d);}
p3() {wait(b); S3; signal(e);}
p4() {wait(c); S4; signal(f);}
p5() {wait(d); S5; signal(g);}
p6() {wait(e); wait(f); wait(g); S6;}
main() {
semaphore a, b, c, d, e, f, g;
a.value = b.value = c.value = 0;
d.value = e.value = 0;
f.value = g.value = 0;
cobegin
p1(); p2(); p3(); p4(); p5(); p6();
coend
}
生產者 - 消費者問題
有一群生產者進程在生產產品,並將這些產品提供給消費者進程去消費。為使生產者進程與消費者進程能並發執行,在兩者之間設置了一個具有 n 個緩沖區的緩沖池,生產者進程將其所生產的產品放入一個緩沖區中;消費者進程可從一個緩沖區中取走產品去消費。盡管所有的生產者進程和消費者進程都是以異步方式運行的,但它們之間必須保持同步,既不允許消費者進程到--個空緩沖區去取產品,也不允許生產者進程向一個已裝滿產品且尚未被取走的緩沖區中投放產品。
利用記錄型信號量解決
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void producer() {
do {
producer an item nextp;
...
wait(empty);
wait(mutex);
buffer[in] = nextp;
in := (in + 1) % n;
signal(mutex);
signal(full);
} while(TRUE);
}
void consumer() {
do {
wait(full);
wait(mutex);
nextc = buffer[out];
out = (out + 1) % n;
signal(mutex);
signal(empty);
consumer the item in nextc;
...
} while (TRUE);
}
void main() {
cobegin
producer();
consumer();
coend
}
利用 AND 型信號量解決
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void producer() {
do {
producer an item nextp;
...
Swait(empty, mutex);
buffer[in] = nextp;
in := (in + 1) % n;
Ssignal(mutex, full);
} while(TRUE);
}
void consumer() {
do {
Swait(full, mutex);
nextc = buffer[out];
out = (out + 1) % n;
Ssignal(mutex, empty);
consumer the item in nextc;
...
} while (TRUE);
}
void main() {
cobegin
producer();
consumer();
coend
}
哲學家進餐問題
有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五只筷子,他們的生活方式是交替地進行思考和進餐。平時,一個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩只筷子時才能進餐。進餐畢,放下筷子繼續思考。
利用記錄型信號量解決
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
wait(chopstick[i]);
wait(chopstick[(i + 1) % 5]);
...
// eat
...
signal(chopstick[i]);
signal(chopstick[(i + 1) % 5]);
...
// think
...
} while(TRUE);
利用 AND 型信號量解決
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
...
// think
...
Swait(chopstick[(i + 1) % 5], chopstick[i]);
...
// eat
...
Ssignal(chopstick[(i + 1) % 5], chopstick[i]);
} while(TRUE);
讀者 - 寫者問題
利用記錄型信號量解決
semaphore rmutex = 1, wmutex = 1;
int readcount = 0;
void reader() {
do {
wait(rmutex);
if (readcount == 0) {
wait(wmutex);
}
readcount++;
signal(rmutex);
...
perform read operation;
...
wait(rmutex);
readcount--;
if (readcount == 0) {
signal(wmutex);
}
signal(rmutex);
} while(TRUE);
}
void writer() {
do {
wait(wmutex);
perform write operation;
signal(wmutex);
} while(TRUE);
}
void main() {
cobegin
reader();
writer();
coend
}
利用信號量集機制解決
int RN;
semaphore L = RN, mx = 1;
void reader() {
do {
Swait(L, 1, 1);
Swait(mx, 1, 0);
...
perform read operation;
...
Ssignal(L, 1);
} while(TRUE);
}
void writer() {
do {
Swait(mx, 1, 1, L, RN, 0);
perform write operation;
Ssignal(mx, 1);
} while(TRUE);
}
void main() {
cobegin
reader();
writer();
coend
}
用戶態和系統態
概念
用戶態:
當進程在執行用戶自己的代碼時,則稱其處於用戶運行態(用戶態)。
系統態:
當一個任務(進程)執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核運行態(或稱為內核態、系統態、管態)。
優先級

第 3 章 處理機調度與死鎖
處理機調度的層次
高級調度(長程調度)
調度對象:作業;
主要功能:根據某種算法,決定將外存上處於后備隊列中的哪幾個作業調入內存,為他們創建進程、分配必要的資源,並將它們放入就緒隊列。
中級調度(內存調度)
實際上就是存儲器管理中的對換功能。
調度對象:進程;
主要功能:將那些暫時不能運行的進程,調至外存等待(掛起);將外存上已具備運行條件的就緒進程再重新調入內存(就緒)。
低級調度(短程調度)
是最基本的一種調度,運行頻率最高。
調度對象:進程(或內核級進程);
主要功能:根據某種算法,決定就緒隊列中的哪個進程應獲得處理機,並由分派程序將處理機分配給被選中的進程。
處理機調度算法的目標
共同目標
-
資源利用率
使系統中的處理機和其他所有資源都盡可能地保持忙碌狀態。
-
公平性
使諸進程都獲得合理的 CPU 時間,不會發生進程飢餓現象。
-
平衡性
使系統中的 CPU 和各種外部設備都能經常處於忙碌狀態,盡可能保持系統資源使用的平衡性。
-
策略強制執行
對所制訂的策略其中包括安全策略,只要需要,就必須予以准確地執行,即使會造成某些工作的延遲也要執行。
批處理系統的目標
- 平均周轉時間短
- 系統吞吐量高
- 處理機利用率高
分時系統的目標
-
響應時間快
-
均衡性
指系統響應時間的快慢應與用戶所請求服務的復雜性相適應。
實時系統的目標
- 截至時間的保證
- 可預測性
進程調度算法
先來先服務調度算法(FCFS)
英文全稱:Firs-Come First-Served
調度原理:按照作業(進程)進入后備隊列(就緒隊列)的先后次序來挑選作業(進程),先進入先被挑選。
優點:算法容易實現,有利於長作業(進程)和 CPU 繁忙型作業。
缺點:效率不高,只顧及作業(進程)等候時間,沒考慮作業(進程)要求服務時間的長短。不利於短作業(進程)和 I/O 繁忙型作業。
短作業優先調度算法(SJF)
英文全稱:Short Job First
調度原理:以作業的長短來計算優先級,作業越短,其優先級越高,就越先被調度。
優點:降低作業的平均等待時間,提高系統吞吐量。
缺點:
- 必須預知作業 / 進程的運行時間,很難估計准確;
- 歧視長作業,導致其長期等待,得不到調度;(最大缺點)
- 人機無法交互;
- 完全不考慮作業的緊迫程度,不能保證緊迫性作業能得到及時處理,無法用於實時系統。
優先級調度算法(PSA)
英文全稱:Priority-Scheduling Algorithm
調度原理:作為作業調度算法時,系統將從后備隊列中選擇若干個優先級最高的作業裝入內存;作為進程調度算法時,該算法把處理機分配給就緒隊列中優先級最高的進程。
高響應比優先調度算法(HRRN)
英文全稱:Highest Response Ratio Next
調度原理:即考慮等待時間,也考慮運行時間。每當要進行調度時,系統計算每個作業的響應比 R,選擇其中 R 最大者投入執行。
優點:既照顧了短作業,又考慮了作業到達的先后順序,還不會使長作業長期得不到服務。
缺點:每次要進行調度之前,都需要先做響應比的計算,增加了系統開銷。
輪轉調度算法
調度原理:將 CPU 的處理時間分成固定大小的時間片,系統將所有就緒進程按先來先服務的原則排成隊列。調度時,把 CPU 分配給隊首進程,令其執行一個時間片,時間片用完后,若進程未結束,則重新排入就緒隊列尾部。
優點:可以保證就緒隊列中所有進程在一給定時間內,均能獲得一時間片的處理機執行時間。
多隊列調度算法
調度原理:將系統中的進程就緒隊列從一個拆分為若干個,將不同類型或性質的進程固定分配在不同的就緒隊列,不同的就緒隊列采用不同的調度算法,一個就緒隊列中的進程可以設置不同的優先級,不同的就緒隊列本身也可以設置不同的優先級。
優點:系統針對不同用戶進程的需求,很容易提供多種調度策略。
多級反饋隊列調度算法
調度原理:
設置多個就緒隊列,優先級越高的隊列中,為每個進程所規定的執行時間片就越小。
新進程進入內存后,放入第一隊列末尾,按 FCFS 原則等待調度,當輪到該進程執行,一個時間片能完成則撤離系統;否則,將該進程轉入第二隊列末尾重新等待調度執行,以此類推。
僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行,以此類推。如果處理機正在為某隊列的進程服務,又有新進程插入到較高優先級的隊列中,則新進程將搶占正在運行進程的處理機。

優勢:
- 較好的性能,終端用戶交互一般在第一隊列就能完成,能夠照顧到用戶的利益;
- 短作業、長作業都能得到比較滿意的處理。
最早截止時間優先調度算法(EDF)
英文全稱:Earliest Deadline First
調度原理:根據任務截止時間來確定任務的優先級,任務截止時間越早,優先級越高,具有最早截止時間的任務排在隊列的隊首。調度程序在選擇任務時,總是選擇就緒隊列中的第一個任務,為之分配處理機。
缺點:只考慮了截止時間,沒有考慮執行時間。如果本身要求執行時間較多,很可能被錯過。
最低松弛度優先調度算法(LLF)
英文全稱:Least Laxity First
調度原理:根據任務緊急(或松弛)的程度來確定優先級,緊急程度越高(松弛程度愈低)優先級越高,越先執行。
優先級倒置
形成原因
高優先級進程(線程)被低優先級進程(線程)延遲或阻塞:共享臨界資源,低優先級的先進入臨界區,導致高優先級的阻塞.
解決方法
- 進入臨界區的進程所占用的處理機不允許被搶占。
- 當高優先級進入臨界區時,如果已有一個低優先級進程正在使用該資源,低優先級進程繼承高優先級進程的優先級,並一直保持到其退出臨界區。
死鎖
概念
所謂死鎖,是指多個進程在運行過程中因爭奪資源而造成的一種僵局,當進程處於這種僵持狀態時,若無外力作用,他們都將無法再向前推進。
如果一組進程中的每一個進程都在等待僅由該組進程中的其他進程才能引發的事件,那么該組進程是死鎖的。
產生死鎖的必要條件
-
互斥條件(不能被破壞)
進程互斥使用資源,即在一段時間內,某資源只能被一個進程占用。
-
請求和保持條件
進程申請新資源時不釋放已占有資源。
-
不可搶占條件
一個進程不能搶奪其他進程占有的資源。
-
循環等待條件
存在一組進程循環等待資源的環形鏈。
處理死鎖的方法
-
預防死鎖
通過設置某些限制條件,破壞產生死鎖四個必要條件中的一個或幾個來預防產生死鎖。
-
避免死鎖
在資源的動態分配過程中,用某種方法防止系統進入不安全狀態。
-
檢測死鎖
通過檢測機構及時地檢測出死鎖的發生,然后采取適當的措施,把進程從死鎖中解脫出來。
-
解除死鎖
檢測到已發生死鎖時,采取適當的措施,把進程從死鎖中解脫出來。
預防死鎖
-
破壞 ”請求和保持“ 條件
靜態資源分配法:
第 1 種協議:一個進程必須在執行前就申請它所要的全部資源,並且直到它所要的資源都得到滿足后才開始執行。
(優點:簡單易行。缺點:資源浪費嚴重,進程時常飢餓。)
第 2 種協議:允許進程只獲得運行初期所需的資源,便開始運行。這些資源使用完畢並全部釋放,再申請新的所需資源。
(優點:資源利用率有所提高,減少飢餓現象。)
-
破壞 ”不可搶占“ 條件
采用剝奪控制:
當進程在申請資源未獲准許時,先主動釋放已占有的資源,然后才去等待,以后再一起向系統提出申請。
(缺點:代價較高,如打印機,可能造成前面的打印工作全部白做,或者信息不連續,還可能因為反復請求和釋放資源而導致進程無限期被推遲。)
-
破壞 ”循環等待“ 條件
順序資源分配法:
對系統的全部資源編號,並規定進程申請資源時只能按升序進行。如果申請了一個較高序號資源后,又想申請低序號資源,那么必須釋放所有相同或者更高序號的資源后,才能申請低序號資源。
(優點:資源使用率和系統吞吐量都有明顯提高。缺點:資源序號設置不易,且相對固定,不適用於新資源增加;作業使用資源順序可能與系統規定不同,造成資源浪費;限制用戶編程自由度)
銀行家算法
安全序列的求法

資源分配

優點
資源利用率比靜態資源分配法高,同時又避免了死鎖。
缺點
對資源分配過於保守;計算太多,並且需知道對資源的最大需求量,不太實際。
第 4 章 存儲器管理
存儲器的層次結構
動態重定位
地址變換過程是在程序執行期間,隨着對每條指令或數據的訪問自動進行的,稱為動態重定位。

對換
概念
所謂 “對換(交換)”, 是指把內存中暫時不能運行的進程或者暫時不用的程序和數據,調出到外存上,以便騰出足夠的內存空間,再把已具備運行條件的進程或進程所需要的程序和數據換入內存。
類型
- 整體對換
- 頁面(分段)對換
分頁存儲管理方式
概念
在該方式中,將用戶程序的地址空間分為若干個固定大小的區域,稱為 “頁” 或 “頁面”。典型的頁面大小為 1 KB。相應地,也將內存空間分為若干個物理塊或頁框,頁和塊的大小相同。這樣可將用戶程序的任一頁放入任一物理塊中,實現了離散分配。
地址結構

前一部分為頁號 P,后一部分為位移量W,即頁內地址。圖中的地址長度為 32 位,其中 0 ~ 11 位為頁內地址,即每頁的大小為 4 KB;12 ~ 31 位為頁號,地址空間最多允許有 1 M 頁。
對某特定機器,其地址結構是一定的。 若給定一個邏輯地址空間中的地址為 A,頁面
的大小為 L,則頁號 P 和頁內地址 d 可按下式求得:
例如:系統頁面大小為 1 KB,設 A = 2170 B,則由上式可以求得 P = 2,d = 122。
頁表

地址變換機構
當進程要訪問某個邏輯地址中的數據時,分頁地址變換機構會自動地將有效地址(相對地址)分為頁號和頁內地址兩部分,再以頁號為索引去檢索頁表。
在執行檢索之前,先將頁號與頁表長度進行比較,如果頁號大於或等於頁表長度,則表示本次所訪問的地址已超越進程的地址空間,於是出現越界錯誤,並產生地址越界中斷。
若未出現越界錯誤,則將頁表始址與頁號和頁表項長度的乘積相加,便得到該表項在頁表中的位置,於是可從中得到該頁的物理塊號,將之裝入物理地址寄存器中。
與此同時,再將有效地址寄存器中的頁內地址送入物理地址寄存器的塊內地址字段中。這樣便完成了從邏輯地址到物理地址的變換。

分段存儲管理方式
概念
在分段存儲管理方式中,作業的地址空間被划分為若干個段,每個段定義了一組邏輯信息。每個段都從 0 開始編址,並采用一段連續的地址空間。每個段既包含了一部分地址空間,又標識了邏輯關系。其邏輯地址由段號和段內地址所組成。
地址結構

該地址結構中,允許一個作業最長有 64 K 個段,每個段的最大長度為 64 KB。
段表
用於實現從邏輯段到物理內存的映射。

地址變換機構
在進行地址變換時,系統將邏輯地址中的段號與段表長度 TL 進行比較。
若 S > TL,表示段號太大,是訪問越界,於是產生越界中斷信號。
若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在內存的起始地址。
然后,再檢查段內地址 d 是否超過該段的段長 SL。若超過,即 d > SL,同樣發出越界中斷信號。若未越界,則將該段的基址 d 與段內地址相加,即可得到要訪問的內存物理地址。

第 5 章 虛擬存儲器
虛擬存儲器的定義和特征
定義
所謂虛擬存儲器,是指具有請求調入功能和置換功能,能從邏輯上對內存容量加以擴充的一種存儲器系統。其邏輯容量由內存容量和外存容量之和所決定,其運行速度接近於內存速度,而每位的成本卻又接近於外存。
特征
-
多次性
作業無需一次性裝入,可以分多次調入內存;每次只需調入需要的程序和數據。
-
對換性
作業的程序和數據也無需常駐內存,暫時不用的部分可以調出,需要時候再調入。
-
虛擬性
邏輯上擴充內存,從磁盤借用空間(機械磁盤和 SSD)
影響缺頁率的因素
-
頁面大小
頁面划分較大,則缺頁率較低;反之,缺頁率較高。
-
進程所分配物理塊的數目
所分配的物理塊數目越多,缺頁率越低;反之則越高。
-
頁面置換算法
算法的優劣決定了進程執行過程中缺頁中斷的次數,因此缺頁率是衡量頁面置換算法的重要指標。
-
程序固有特性
程序本身的編制方法對缺頁中斷次數有影響,根據程序執行的局部性原理,程序編制的局部化程度越高,相應執行時的缺頁程度越低。
頁面置換算法
最佳置換算法(Optimal)
原理:所選擇的被淘汰頁面將是以后永不使用的,或許是在未來最長時間內不再被訪問的頁面。

優點:可保證獲得最低的缺頁率。
缺點:為理想算法。由於無法預知未來的頁面訪問情況,實際上無法實現。
先進先出置換算法(FIFO)
原理:總是淘汰最先進入內存的頁面,即選擇在內存中駐留時間最久的頁面予以淘汰。

優點:實現簡單。
缺點:與進程實際運行的規律不適應,因為在進程中,有些頁面經常被訪問。
最近最久未使用置換算法(LRU)
英文全稱:Least Recently Used
原理:該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t。當需淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最久未使用的頁面予以淘汰。

影響頁面換進換出效率的因素
- 頁面置換算法
- 寫回磁盤的頻率
- 讀入內存的頻率
抖動
概念
在虛擬內存中,頁面在內存與外存之間頻繁調度,以至於調度頁面所需時間比進程實際運行的時間還多,此時系統效率急劇下降,甚至導致系統崩潰。這種現象稱為顛簸或抖動。

產生抖動的原因
同時在系統中運行的進程太多,由此分配給每一個進程的物理塊太少,不能滿足進程正常運行的基本要求,致使每個進程在運行時,頻繁地出現缺頁,必須請求系統將所缺之頁調入內存。
這會使得在系統中排隊等待頁面換進 / 換出的進程數目增加。
顯然,對磁盤的有效訪問時間也隨之急劇增加,造成每個進程的大部分時間都用於頁面的換進 / 換出,而幾乎不能再去做任何有效的工作,從而導致發生處理機的利用率急劇下降並趨於 0 的情況。
第 6 章 輸入輸出系統
與設備的無關性
概念
指應用程序獨立於具體使用的物理設備。
設置設備無關性的優點
- 設備分配時的靈活性;
- 易於實現 I/O 重定向。
塊設備
概念
所謂塊設備,是指數據的存儲和傳輸都是以數據塊為單位的設備。
典型的塊設備是磁盤。
特點
- 傳輸速率較高
- 可尋址
字符設備
概念
所謂字符設備,是指數據的存取和傳輸是以字符為單位的設備。
典型的字符設備是鍵盤、打印機等。
特點
- 傳輸速率較低
- 不可尋址
I/O 設備的控制方式
使用輪詢的可編程 I/O 方式
在處理機向控制器發出一條 I/O 指令,啟動輸入設備輸入數據時,要同時把狀態寄存器中的忙 / 閑標志 busy 置為 1,然后便不斷地循環測試 busy(稱為輪詢)。當 busy = 1 時,表示輸入機尚未輸完一個字符, 處理機應繼續對該標志進行測試,直至 busy = 0,表明輸入機已將輸入數據送入控制器的數據寄存器中。於是處理機將數據寄存器中的數據取出,送入內存指定單元中,這樣便完成了一個字符的 I/O。接着再去啟動讀下一個數據,並置 busy = 1。
特點:CPU 和 I/O 設備串行工作,使主機不能充分發揮效率,外圍設備也不能得到合理使用,整個系統效率很低。
使用中斷的可編程 I/O 方式
當某進程要啟動某個 I/O 設備工作時,便由 CPU 向相應的設備控制器發出一條 I/O 命令,然后立即返回繼續執行原來的任務。設備控制器於是按照該命令的要求去控制指定 I/O 設備。此時 CPU 與 I/O 並行操作。
特點:
- 不必忙式查詢 I/O 准備情況,CPU 和 I/O 設備可實現部分並行,與程序查詢的串行工作方式相比,使 CPU 資源得到較充分利用;
- I/O 操作直接由 CPU 控制,每傳送一個字符或字,要發生一次中斷,仍然消耗大量 CPU 時間。
直接存儲器(DMA)訪問方式
I/O 設備直接與主存交換數據,不占用 CPU。
特點:
- 數據傳輸的基本單位是數據塊;
- 所傳送的數據塊是從設備直接送入內存,或者相反;
- 在傳送一個或多個數據塊的開始和結束才需 CPU 干預,傳送過程是在控制器的控制下完成。
I/O 通道控制方式
由通道管理和控制 I/O 操作,減少了外圍設備和 CPU 的邏輯聯系。把 CPU 從瑣碎的 I/O 操作中解放出來。
特點:實現 CPU、通道和 I/O 設備三者的並行操作,從而更有效地提高整個系統的資源利用率。
SPOOLing 技術——假脫機系統
概念
多道程序環境中,用程序模擬外圍控制機功能。
輸出時把處理機數據快速寫入磁盤,之后再從磁盤輸出到外圍低速設備;
輸入時把外圍 I/O 設備數據先讀入磁盤,CPU 再脫機從磁盤讀入數據。
特點
- 提高了 I/O 的速度
- 將獨占設備改造為共享設備
- 實現了虛擬設備功能
緩沖
概念
改善中央處理器與外圍設備之間速度不配的矛盾,凡是數據到達和離去速度不匹配的地方均可采用緩沖技術。
作用
- 緩和 CPU 與 I/O 設備間速度不匹配的矛盾;
- 減少對 CPU 的中斷頻率,放寬對 CPU 中斷響應時間的限制;
- 解決數據粒度不匹配的問題;
- 提高 CPU 和 I/O 設備之間的並行性。
磁盤調度算法
先來先服務(FCFS)
原理:根據進程請求訪問磁盤的先后次序進行調度。
優點:公平、簡單,且每個進程的請求都能依次地得到處理,不會出現某一進程的請求
長期得不到滿足的情況。
缺點:由於未對尋道進行優化,致使平均尋道時間可能較長。
平均尋道長度舉例:

最短尋道時間優先(SSTF)
原理:選擇距當前磁頭所在磁道最近的磁道進行訪問。
優點:比 FCFS 有更好的尋道性能。
缺點:可能導致某個進程發生飢餓現象。
平均尋道長度舉例:

掃描算法(SCAN)
又名電梯調度算法。
原理:選擇與當前磁頭移動方向一致且距離最近的進程。一個方向數據讀完再掉頭,避免了進程飢餓。
優點:尋道性能較好,避免出現飢餓現象。
缺點:當磁頭移動時,剛好跨過的某一磁道,被一進程請求,則該進程會被迫等待較長時間,產生飢餓。
平均尋道長度舉例:

循環掃描算法(CSCAN)
原理:磁頭單向移動,循環執行。
平均尋道長度舉例:

NStepSCAN 算法
原理:將磁盤請求隊列分成若干個長度為 N 的子隊列,磁盤調度將按 FCFS 算法依次處理這些子隊列。而每個隊列的處理是按 SCAN 算法,一個處理完畢再處理下一個隊列。
FSCAN 算法
原理:是 NStepSCAN 算法的簡化,只分為兩個子隊列。一個是由當前所有請求磁盤 I/O 的進程形成的隊列,由磁盤調度按 SCAN 算法進行處理。另一個是在掃描期間,將新出現的所有請求磁盤 I/O 的進程放入等待處理的請求隊列。
第 7 章 文件管理
文件、記錄和數據項之間的層次關系

記錄
記錄是一組相關數據項的集合,用於描述一個對象在某方面的屬性。
在記錄的各個數據項中,能唯一地標識一個記錄的一個或幾個數據項,稱為關鍵字。
文件
文件是指由創建者所定義的、具有文件名的一組相關元素的集合,可分為有結構文件和無結構文件兩種。
文件的邏輯結構
概念
從用戶觀點出發所觀察到的文件組織形式,即文件是由一系列的邏輯記錄組成的,是用戶可以直接處理的數據及其結構,它獨立於文件的物理特性,又稱為文件組織。
分類
按文件是否有結構分類:
-
有結構文件
有標准格式,各種屬性項描述文件的一個實體,分為定長記錄,變長記錄。例如:各種數據庫文件
-
無結構文件
流式文件。無法直接讀取查詢,只能靠指針移動定位。
按文件的組織方式分類:
-
順序文件
指由一系列記錄按某種順序排列所形成的文件,其中的記錄可以是定長記錄或可變長記錄。
-
索引文件
指為可變長記錄文件建立一張索引表,為每個記錄設置一個表項,以加速對記錄的檢索速度。
-
索引順序文件
建立一張索引表時,並不是為每一個記錄建立一個索引表項,而是為一組記錄中的第一個記錄建立一個索引表項。
第 8 章 磁盤存儲器的管理
外存的組織方式
連續組織方式
原理:為每個文件分配連續的磁盤空間。(基本不可能)

優點:
- 順序訪問容易;
- 順序訪問速度快。
缺點:
- 要求為一個文件分配連續的存儲空間,從而產生大量碎片;
- 必須事先知道文件的長度;
- 不能靈活地刪除和插入記錄;
- 不便於動態增長的文件。
鏈接組織方式
概念:為文件分配多個不連續的盤塊,再通過每個盤塊上的鏈接指針,將同屬於一個文件的多個離散的盤塊鏈接成一個鏈表, 由此所形成的物理文件稱為鏈接文件。
優點:
-
消除了磁盤的外部碎片,提高了外存的利用率。
-
對插入、刪除和修改記錄都非常容易。
-
能適應文件的動態增長,無需事先知道文件的大小。
隱式鏈接
原理:每個目錄項含有指向文件第一個和最后一個塊的指針。每個盤塊中含有指向下一個盤塊的指針。

缺點:只能順序訪問,隨機訪問效率極低,同時也很不安全,中間鏈接斷開,后面全部都找不到了。
顯式鏈接
原理:
構建一張鏈接表,把文件各物理塊的指針顯式存放,該表在整個磁盤中僅僅有一張,即文件分配表 FAT。鏈首指針對應的盤塊號,作為文件地址填入 FCB 的物理地址字段中。

索引組織方式
將文件和對應的盤塊號集中放在一起,訪問文件時將該文件說對應的盤塊號一起調入內存。
在索引分配中,為每個文件分配一個索引塊(表),文件盤塊號都在該索引表中。建立文件時,只需要在建立的目錄項中填上指向索引表達指針即可。
單級索引組織方式

優點:支持直接訪問,不會產生外部碎片。當文件較大時,索引方式要優於鏈式分配方式。
缺點:每一個文件都需要一個索引表。對於小文件來說,索引分配利用率低,浪費空間建立索引。
多級索引組織方式

優點:對大型文件查找迅速。
缺點:隨着索引級數增多,所需啟動磁盤的次數增加。對小文件來說浪費資源,只適合大型文件。
FAT 技術
原理
在 FAT 中引入 “卷” 的概念,支持將物理磁盤分為四個邏輯磁盤,每個邏輯磁盤就是一個卷,也叫分區。
每個卷都是能被單獨格式化和使用的邏輯單元,卷中包含了文件系統信息、一組文件以及空閑空間。每個卷都有專門區域存放 FAT 表和文件目錄表,以及自己的邏輯驅動器字母。
一個物理磁盤可以分為多個邏輯卷,一個邏輯卷也可以由多個物理磁盤組成。
FAT 表大小的計算
對於 1.2 MB 的軟盤,每個盤塊的大小為 512 B,在每個 FAT 中共含有 2.4 K 個表項,由於每個 FAT 表項占 12 位(1.5個B),故 FAT 表占用 3.6 KB 的存儲空間。
NTFS 的新特征
-
使用了 64 位磁盤地址;
-
可以很好地支持長文件名,單個文件名限制在 255 個字符以內,全路徑名為 32767 個字符;
-
具有系統容錯功能,即在系統出現故障或差錯時,仍能保證系統正常運行;
-
能保證系統中的數據一致性,這是一個非常有用的功能;
-
提供了文件加密、文件壓縮等功能。
NTFS 的磁盤組織
分區稱為卷。
NTFS 以族為磁盤空間分配和回收的基本單位,又稱為卷因子。
卷因子是物理磁盤扇區的整數倍,是格式化命令時候確定的。
