作業系統知識點整理(持續更新)
阿新 • • 發佈:2019-01-07
基礎概念
- 作業系統的四個特性
1. 併發: 同一時間間隔內支援執行多個任務, 對於一個核則是交替執行;
2. 共享: 硬體資源或資料資源支援多個程序共享;
3. 非同步: 併發情況下, 一個程式會陸陸續續被執行,完成時間不可預知;
4. 虛擬: 物理實體轉化為邏輯實體,如虛擬記憶體。
- 作業系統的基本功能
1. CPU管理, 作業排程
2. 儲存管理, 資料存取
3. 裝置管理, 與外圍裝置互動
4. 介面管理, 嚮應用程式/使用者提供互動介面
- 軟中斷與硬中斷
系統在執行某個任務程式時收到中斷訊號, 需要讓出當前CPU來執行中斷處理。中斷處理完成後,CPU再繼續執行之前的任務程式。
1. 軟中斷:
>當前執行的程式產生的中斷訊號,通常是I/O請求;
>不會直接中斷CPU,需要核心去為當前程序完成一些類似I/O的請求;
>中斷過程: 程序->核心裝置驅動程式。
2. 硬中斷:
>由硬體產生,比如磁碟,網絡卡,時鐘,鍵盤等;
>直接中斷CPU,通常一箇中斷只中斷一個CPU;
>中斷過程: 硬體->CPU->核心裝置驅動程式。
3. 中斷優先順序:
硬體錯誤>時鐘>磁碟>網路裝置>其他終端裝置>軟體中斷
- 動態連結及靜態連結
動態連結: 在程式執行期間, 所依賴的模組來自於程式外部,在記憶體中動態載入/解除安裝,按需載入可節省記憶體; 靜態連結: 在程式執行期間, 所依賴的模組來自於程式內部,即編譯時已打包好,程式啟動時便會載入記憶體。
程序管理
- 程序的狀態型別與轉換
5個狀態模型:
- 程序與執行緒的區別
概念區別:
1. 程序: 一個程式的動態執行過程, 分配資源的基本單位;
2. 執行緒: 一個程序內排程的基本單位,一個程序包含一個或多個執行緒。
執行區別:
1. 程序:擁有獨立記憶體空間,支援內部多個執行緒共享;
2. 執行緒:必須依賴於程序來執行,每個執行緒有獨立入口/執行序列/出口。
應用意義區別:
一個應用執行時對應一個或多個程序, 而執行緒在程序的基礎上提供了可以執行不同調度邏輯的入口,易於實現任務的併發執行。
- 程序間通訊的幾種方式
1. 管道pipe
管道是獨立的檔案系統,有自己的資料結構。實際上是隻存在於記憶體中的檔案,需要通過兩個開啟的檔案控制代碼來進行操作,他們分別表示管道的兩端。管道分為無名管道和有名管道。
2. 共享記憶體
共享記憶體由一個程序建立, 能被其他程序訪問, 最快的IPC方式。
3. 訊息佇列
訊息的連結串列, 存放於核心並由佇列識別符號標識;克服了緩衝區大小受限,訊號資訊有限,管道無格式位元組流等缺點。
4. 訊號
用於通知某個程序某個事件已經發生,可觸發程序已註冊的處理函式。
5. 訊號量
一種計數器,用來控制多個程序對共享資源的訪問, 通常作為一種鎖機制, 常應用於程序間或程序內多個執行緒的同步。
6. Socket
通過套接字通訊,也可用於不同host之間的程序見通訊。
- 程序同步,執行緒同步的幾種方式
1. 臨界區(CriticalSection)(程序內執行緒同步)
一次只能被一個程序所佔用的資源為臨界資源;程序內訪問臨界資源的程式碼就是臨界區。
進入區/臨界區/退出區/剩餘區
2. 事件
基於事件機制, 一個程序/執行緒主動喚醒另一個程序/執行緒;比如監聽通訊埠A。
3. 互斥量(Mutex)
類似臨界區,但是能在程序間使用。Futex由一塊能被多個程序共享的記憶體空間(對齊後的整型變數)組成, 儲存在使用者空間的共享記憶體中,通過原子操作進行操作。操作基本在使用者空間內進行(需要仲裁時使用系統核心呼叫), 減少了系統呼叫次數, 提供系統性能。
4. 訊號量(Semphore)
訊號量建立在原子操作上,使用訊號量可以用來限制共享資源的執行緒數目。
- 執行緒的實現方式
使用者級執行緒(也可看作協程):程序內的執行緒切換不用切換到核心進行, 核心並沒有感知程序內的執行緒存在, 所以即使多執行緒並不能利用多核來進行操作。一個執行緒如果呼叫了阻塞系統呼叫, 那整個程序都會被阻塞。
核心級執行緒(通常所說的執行緒):也即核心管理的所有執行緒, 核心頭既包含程序表, 也包含執行緒表。多執行緒可以利用到多核,多核下微觀和巨集觀下都能做到並行。
混合模式: 核心執行緒可以在使用者空間完成建立,應用的多個使用者級執行緒可以被對映到核心執行緒中,提高併發效率。
- 使用者態與核心態的區別
使用者態:執行使用者級別的程式碼,許可權受限,由CPU標誌flag來控制;
核心態:執行核心模組程式碼,比如執行磁碟IO,網路IO處理等。
應用程序可通過系統呼叫由使用者態進入核心態,在缺頁錯誤或中斷髮生時進入核心態。
- 使用者棧與核心棧的區別
使用者棧: 程序在使用者空間時建立的棧,比如函式呼叫時壓棧出棧, 儲存了函式互相呼叫的引數/返回值等;
核心棧: 中斷進入核心態時,用核心棧來儲存使用者態程序的狀態資訊,返回使用者鈦再將這些資訊出棧;核心棧位置在核心的一塊固定區域,儲存中斷現場,程序呼叫資料等。
- 記憶體池,程序池,執行緒池
所謂池的概念, 一般是指應用提前向核心批量申請資源,用於接下來的使用和回收再利用, 減少資源的初始化和銷燬次數等開銷, 以達到提高系統性能的目標。
記憶體池:真正使用前申請一片記憶體區域,有新需求時取出其中一部分使用,不夠用時再重新申請新記憶體。
程序池:
>應用預先建立一組子程序,所有子程序執行相同程式碼,擁有相同屬性,比如PGID和優先順序等;
>常見兩種工作方式:
1. 主程序通過隨機或round robin演算法來選擇子程序作為新任務的服務程序;
2. 通過一個共享佇列來進行同步,所有子程序從該佇列中獲取任務,不過同時只能有一個子程序能成功獲得新任務處理權。
執行緒池:
主要應用於任務小而多,處理時間短的場景,比如簡單網頁請求等。
- 死鎖的概念,產生條件及處理策略
死鎖:一組競爭同一系統資源或通訊的程序由於互相等待而造成的永久阻塞。
產生死鎖的四個條件:
1. 互斥: 一次只能有一個程序使用一個資源。
2. 佔有並等待: 一個程序等待另一個資源的同時佔有一個已分配的資源。
3. 不可搶佔: 一個已被某個程序佔有的資源不可被其他程序搶奪。
4. 迴圈等待: 在一個封閉程序鏈中,每個程序至少佔有下一個程序所等待的資源。
處理死鎖幾種方式:預防/避免/檢測,比如一次性申請所需資源,銀行家演算法。
- 程序排程演算法
排程種類:
1. 高階排程: 作業排程,決定把後備作業調入記憶體執行;
2. 中級排程: 記憶體,外存交換區進行程序對換;
3. 低階排程: 程序排程,決定把就緒狀態的程序獲得CPU。
CPU任務種類: 互動式任務和批處理任務。
排程演算法:
1. FIFO(FCFS): 公平簡單,不利於互動式,不利於IO密集型作業;
2. SJF:短作業優先排程,可以保證整體的最小等待時間,但不利於長作業;
3. 優先權排程:擁有高優先權的作業優先處理, 有可能出現優先權低的任務“飢餓”情況;
4. Round-Robin:按時間片進行輪轉排程,讓每個任務定時有響應但是上下文切換次數可能會過多。
5. 多級優先順序佇列:按不同規則建立多個程序佇列,不同佇列擁有不同的優先順序以及可以分配不同的時間片/排程策略。但是也存在”飢餓“可能性。
6. 多級反饋佇列:在多級優先順序佇列基礎上,長期得不到執行的佇列優先順序會被提高。
記憶體管理
- 記憶體管理的技術發展
1. 固定分割槽:系統初始化階段,記憶體被固定劃分成多個靜態分割槽,程序可以一次性被裝載到大於或等於自身空間的分割槽;
2. 動態分割槽:動態建立分割槽,程序可以被裝載到與自身相等大小的分割槽中;
3. 虛擬記憶體分頁:系統初始化階段,記憶體被劃分為多個大小一致的頁框;每個程序被劃分成多個與頁框相等的頁;根據實時需要載入一定數量的頁。
4. 虛擬記憶體分段:每個程序維護一個段表,系統維護一個空閒的塊表,按需載入段。
5. 段頁式: 單按頁載入的排程粒度太細,單按段載入的排程粒度太粗, 結合使用可有效提高系統性能。應用地址空間可劃分成多個段,每個段又劃分為多個固定大小的頁,段偏移量在系統角度可看作是指定段中的一個頁好和頁偏移。
- 實體記憶體與虛擬記憶體
實體地址:實際實體記憶體中的儲存地址;
虛擬地址: 編碼時將程式碼或資料分成若干段,每條程式碼或資料對應的地址由段號加段內偏移地址構成。
MMU: 實現將虛擬地址對映到實體地址的CPU中的硬體電路。
- 幾種頁面置換演算法
FIFIO: 淘汰最早調入的頁面;
OPT: 理想化的最佳置換演算法,將標記為下次最遲才會被訪問的頁面淘汰;
LRU: 將最近一段時間內最久沒有被使用的頁置換出去。
- DMA定義及工作流程
DMA指外部裝置不經過CPU而直接與記憶體交換資料的技術。
主要通過DMA控制器來實現: 控制器向CPU請求系統匯流排並獲得控制權後, 與儲存器直接進行資料交換, 完成後向CPU傳送結束訊號並交還控制權。
- 外存分配的幾種方式
外存:CPU快取及記憶體以外的儲存器, 如硬碟/光碟等。
分配方式:
1. 連續分配:建立檔案時,分配一組連續的塊, FAT中每個檔案只需要一項,用以說明起始塊及檔案大小。
2. 鏈式分配: 檔案存放在若干不連續的物理塊,各塊之間通過指標連線。
3. 索引分配: 每個檔案在FAT中有一個一級索引, 包含檔案各個分割槽的入口;這個索引資訊儲存在單獨個一個塊當中, 作為檔案的訪問入口。
- CPU中的快取及OS中的快取
CPU快取: 介於CPU與記憶體之間的臨時儲存器, 有一級/二級/三級快取之分;
系統快取: 如塊表,用於存放當前訪問最頻繁的少量活動頁,提高資料存取速度。通過需要存取的資料所在邏輯地址,在塊表中找到其對應的記憶體塊地址, 結合其頁偏移地址獲得實體地址;如果塊表中沒有該邏輯頁號,則通過查詢空閒塊來更新塊空閒區資訊;如果塊表沒有空閒區,則通過演算法來淘汰塊表中某一行,並填入新的空閒區。