1. 程式人生 > >計算機作業系統知識彙總(三)

計算機作業系統知識彙總(三)

作業系統

一、概述

1、基本特徵

(1)併發:併發是指巨集觀上在一段時間內能同時執行多個程式,而並行則指同一時刻能執行多個指令。作業系統通過引入程序和執行緒使得程式能夠併發執行;

(2)共享:共享是指系統中的資源可以被多個併發程序共同使用。共享的方式有兩種:互斥共享和同時共享;其中互斥共享的資源成為臨界資源,例如印表機等,在同一時間只允許一個程序訪問,需要用同步機制來實現對臨界資源的訪問;

(3)虛擬:虛擬是指把一個物理實體轉換為多個邏輯實體。主要的虛擬技術有兩種:時分複用技術和空分複用技術;多個程序能在同一個處理器上併發執行使用了時分複用技術,讓每個程序輪流佔有處理器,每次只執行一小個時間片並快速切換;空分複用技術是指將實體記憶體抽象為地址空間,每個程序都有各自的地址空間。地址空間和實體記憶體使用頁進行交換,地址空間的頁並不需要全部在實體記憶體中,當使用到一個沒有在實體記憶體的頁時,執行頁面置換演算法, 將該頁置換到記憶體中;

(4)非同步:非同步只進程不是一次性執行完畢,而是走走停停,以不可知的速度向前推進;

2、基本功能

(1)程序管理:程序控制、程序同步、程序通訊、死鎖處理、處理機排程等;

(2)記憶體管理:記憶體分配、地址對映、記憶體保護與共享、虛擬記憶體等;

(3)檔案管理:檔案儲存空間的管理、目錄管理、檔案讀寫管理和保護等;

(4)裝置管理:完成使用者的IO請求,方便使用者使用各種裝置,並提高裝置的利用率。主要包括緩衝管理、裝置分配、裝置處理、虛擬裝置等;

3、中斷分類

(1)外中斷:由CPU執行指令以外的時間引起,如IO完成中斷,表示裝置輸入/輸出處理已經完成,處理器能夠傳送下一個輸入/輸出請求。此外還有時鐘中斷、控制檯中斷等;

(2)異常:由CPU執行指令的內部時間引起,如非法操作碼、地址越界、算術溢位等;

(3)陷入:在使用者程式中使用系統呼叫;

二、程序管理

1、程序與執行緒

(1)程序:程序是資源分配的基本單位,程序控制塊PCB描述程序的基本資訊和執行狀態,所謂的建立程序和撤銷程序,都是指對PCB的操作;每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含至少一個執行緒;

(2)執行緒:執行緒是CPU排程的基本單位,一個程序中可以有多個執行緒,它們共享程序資源;每個執行緒有獨立的執行棧和程式計數器PC,執行緒切換開銷小;

區別:

a.擁有資源:程序是資源分配的基本單位,但是執行緒不擁有資源,執行緒可以訪問隸屬程序的資源;

b.排程:執行緒時獨立排程的基本單位,在同一程序中,執行緒的切換不會引起程序切換,從一個程序中的執行緒切換到另一個程序中的執行緒時,會引起程序切換;

c.系統開銷:由於建立或撤銷程序時,系統都要為之分配或回收資源,如記憶體空間、I/O裝置等,所付出的開銷遠大於建立或撤銷執行緒時的開銷。類似地,在進行程序切換時,涉及當前程序CPU環境的儲存及新排程程序CPU環境的設定,而執行緒切換時只需儲存和設定少量寄存機內容,開銷很小;

d.通訊:執行緒間可以通過直接讀寫同一程序中的資料進行通訊,但是程序通訊需要藉助IPC;

2、執行緒狀態切換

(1)新建狀態(New):新建立了一個執行緒物件;

(2)就緒狀態(Runnable):執行緒位於可執行執行緒池中,等待獲取CPU的使用權;

(3)執行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式程式碼;

(4)阻塞狀態(Blocked):因為某種原因放棄CPU使用權,暫時停止執行。其原因主要有:等待阻塞(wait())、同步阻塞(synchronized)、其他阻塞(sleep()、join()、I/O輸入);

(5)死亡狀態(Dead):執行緒執行完成了或因一場退出了run()方法;

3、程序同步

臨界區:對臨界資源進行訪問的那段程式碼稱為臨界區;為了互斥訪問臨界資源,每個程序在進入臨界區之前,需要先進行檢查;

同步:多個程序按一定順序執行;

互斥:多個程序在同一時刻只有一個程序能進入臨界區;

訊號量:訊號量是一個整型變數,可以對其執行down和up操作,也就是常見的P和V操作。

down:如果訊號量大於0,執行-1操作;如果訊號量等於0,程序睡眠,等待訊號量大於0;
up:對訊號量執行+1操作,喚醒睡眠的程序讓其完成down操作;

down和up操作需要被設計成原語,不可分割,通常的做法是在執行這些操作的時候遮蔽中斷;如果訊號量的取值只能為0或者1,那麼就成為了互斥量,0表示臨界區已經加鎖,1表示臨界區解鎖;

typedef int semaphore;
semaphore mutex = 1;void P1() {
    down(&mutex);
    // 臨界區
    up(&mutex);
}
void P2() {
    down(&mutex);
    // 臨界區
    up(&mutex);
}

經典同步問題: 生產者-消費者問題、讀者-寫者問題、哲學家進餐問題、理髮師問題、煙鬼問題

4、程序通訊

程序同步是控制多個程序按一定順序執行,程序通訊是程序間傳輸資訊;程序通訊是一種手段,而程序同步是一種目的。也可以說,為了能夠達到程序同步的目的,需要讓程序進行通訊,傳輸一些程序同步所需要的資訊;

(1)管道:通常指無名管道,它是半雙工的(即資料只能在一個方向上流動),具有固定的讀端和寫端,且只能在父子程序中使用,它不是普通的檔案,並不屬於其他任何檔案,並且只存在於記憶體中;

(2)FIFO:也稱命名管道,它是一種檔案型別,可以在無關的程序之間交換資料,與無名管道不同,它由路徑名與之相關聯,以一種特殊裝置檔案形式存在於檔案系統中。它的通訊方式類似於在程序中使用檔案來傳輸資料,只不過FIFO型別檔案同時具有管道的特性,在資料讀出時,FIFO管道中同時清除資料,並且“先進先出”;

(3)訊息佇列:是訊息的連結表,存放在核心中。一個訊息佇列由一個識別符號(即佇列ID)來標識,它是面向記錄的,其中的訊息具有特定的格式以及特定的優先順序。相比於FIFO,訊息佇列可以獨立於讀寫程序存在,從而避免了FIFO中同步管道的開啟和關閉時可能產生的困難;避免了FIFO的同步阻塞問題,不需要程序自己提供同步方法;讀程序可以根據訊息型別有選擇地接收訊息,而不像FIFO那樣只能預設地接收;程序在終止時,訊息佇列及其內容並不會被刪除,它可以實現訊息的隨機查詢;

(4)訊號量:它是一個計數器,用於為多個程序提供對共享資料物件的訪問。它基於作業系統的PV操作,程式對訊號量的操作都是原子操作,每次對訊號量的操作不僅限於對訊號量值的+1或-1,可以加減任意正整數,支援訊號量組;

(5)共享記憶體:允許多個程序共享一個給定的儲存區。因為資料不需要在程序之間複製,所以這是最快的一種IPC;需要使用訊號量用來同步對共享記憶體的訪問,多個程序可以將同一個檔案對映到它們的地址空間從而實現共享記憶體。另外XSI共享記憶體不是使用檔案,而是使用記憶體的匿名段;

(6)套接字:與其它通訊機制不同的是,它可以用於不同機器間的程序通訊;

5、程序排程

(1)先來先服務排程演算法(FCFS):按作業或者程序到達的先後順序依次排程;有利於長作業,不利於短作業;

(2)短作業優先排程演算法(SJF):從就緒佇列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行。不利於長作業,未考慮作業的重要性,執行時間是預估的,並不靠譜;

(3)高響應比排程演算法(HRN):響應比=(等待時間+要求服務時間)/要求服務時間;

(4)時間片輪轉排程演算法(RR):將所有就緒程序按FCFS的原則排成一個佇列,每次排程時,把CPU時間分配給隊首程序,該程序可以執行一個時間片。當時間片用完時,由計時器發出時鐘中斷,排程程式便停止該程序的執行,並將它送往就緒佇列的末尾,同時繼續把CPU時間分配給隊首的程序;時間片輪轉演算法的效率和時間片的大小有很大關係,因為程序切換都要儲存程序的資訊並且載入新程序的資訊,如果時間片太小,會導致程序切換得太頻繁,在程序切換上就會花過多的時間;但另一方面,如果時間片過長,那麼實時性就不能得到保證;

(5)優先順序排程演算法:為每個程序分配一個優先順序,按優先順序進行排程;為了防止低優先順序的程序永遠等不到排程,可以隨著時間的推移增加等待程序的優先順序;

(6)多級反饋佇列排程演算法:一個程序需要執行100個時間片,如果採用時間片輪轉排程演算法,那麼需要交換100次;多級佇列是為這種需要連續執行多個時間片的程序考慮,它設定了多個佇列,每個佇列時間片大小都不同,例如1,2,4,8,…,程序在第一個佇列沒執行完,就會被移到下一個佇列。這種方式下,之前的程序只需要交換7次;每個佇列優先權也不同,最上面的優先權最高。因此只有上一個佇列沒有程序在排隊,才能排程當前佇列上的程序;可以將這種排程演算法看成是時間片輪轉排程演算法和優先順序排程演算法的結合;

三、死鎖

1、必要條件

(1)互斥:每個資源要麼已經分配給了一個程序,要麼就是可用的;

(2)請求和保持:程序被阻塞的時候並不釋放鎖請求到的資源;

(3)不可搶佔:已經分配給一個程序的資源不能強制性地被搶佔,它只能被佔有它的程序顯式地釋放;

(4)環路等待:有兩個或者兩個以上的程序組成一條環路,該環路中的每個程序都在等待下一個程序所佔有的資源;

2、處理方法

(1)鴕鳥策略:把頭埋在沙子裡,假裝根本沒有發生問題;因為解決死鎖問題的代價很高,因此不採取任何措施的方案會獲得更高的效能;當發生死鎖時不會對使用者造成多大影響,或發生死鎖的概率很低,可以採用鴕鳥策略;

(2)死鎖檢測;每種型別一個資源的死鎖檢測、每種型別多個資源的死鎖檢測;

(3)死鎖恢復:利用搶佔恢復、利用回滾恢復、通過殺死程序恢復;

(4)死鎖預防:破壞必要條件任意一條即可;

(5)死鎖避免:銀行家演算法;

四、記憶體管理

虛擬記憶體:從邏輯的角度擴充記憶體容量,基於區域性性原理,在程式裝入的時候,可以將程式的一部分裝入記憶體,而將其餘部分留在外存就可以啟動程式執行。在程式執行過程中,當所訪問的資訊不在記憶體時,由作業系統將所需要的部分調入記憶體,然後繼續執行程式。另一方面,作業系統將記憶體中暫時不使用的內容換出到外存上,從而騰出空間存放將要調入的記憶體的資訊。這樣,系統就好像為使用者提供了一個比實際記憶體大得多的儲存器,稱為虛擬儲存器;

頁面置換演算法:在程式執行過程中,如果訪問的頁面不在記憶體中,就發生缺頁中斷從而將該頁調入記憶體中。此時如果記憶體已無空閒空間,系統必須從記憶體中調出一個頁面到磁碟對換去中來騰出空間;頁面置換演算法和快取淘汰策略類似,可以將記憶體看成磁碟的快取。在快取系統中,快取的大小有限,當有新的快取到達時,需要淘汰一部分已經存在的快取,這樣才有空間存放新的快取資料;

(1)最佳置換演算法:只具有理論意義的演算法,用來評價其他頁面置換演算法;置換策略是將當前頁面中在未來最長時間內不會被訪問的頁置換出去;

(2)先進先出置換演算法:每次淘汰最早調入的頁面,沒有考慮頁面的訪問頻率細資訊。會使缺頁率升高;

(3)最近最久未使用演算法(LRU):將最近最久未使用的頁面換出;實現的時候需要在記憶體中維護一個所有頁面的連結串列,當一個頁面被訪問時,將這個頁面移到連結串列表頭。這樣每次只要找連結串列表尾的頁面就是最近最久未訪問的。因為每次訪問都需要更新連結串列,因此這種方式實現的LRU代價很高;

(4)最近未使用演算法(NRU):每個頁面都有兩個狀態位R與M,當頁面被訪問時設定頁面的R=1,當頁面被修改時設定頁面的M=1。其中R位會定時被清零;當發生缺頁中斷時,NRU演算法隨機地從類編號最小的非空類中挑選一個頁面將它換出;注意,NRU優先換出已經被修改的髒頁面(R=0,M=1),而不是被頻繁使用的乾淨頁面(R=1,M=0);

分頁與分段的比較: (1)對程式設計師的透明性:分頁透明,但是分段需要程式設計師顯示劃分每個段;

(2)地址空間的維度:分頁是一維地址空間,分段是二維的;

(3)大小是否可以改變:頁的大小不可變,段的大小可以動態改變;

(4)出現的原因:分頁主要用於實現虛擬記憶體,從而獲得更大的地址空間;分段主要是為了使程式和資料可以被劃分為邏輯上獨立的地址空間並且有助於共享和保護;