1. 程式人生 > >【作業系統】總結

【作業系統】總結

基礎知識

作業系統

作業系統(Operation System, OS)是管理和控制計算機硬體與軟體資源的計算機程式,是直接執行在“裸機”三的最基本的系統軟體,任何其他軟體都必須在作業系統的支援下才能執行。

  • 作業系統是計算機系統資源的管理者:
    • 處理機管理
    • 儲存器管理
    • 裝置管理
    • 檔案管理
  • 作業系統是使用者與計算機硬體系統之間的介面,同時也是計算機硬體和其他軟體的介面:
    • 命令介面
    • 程式介面
  • 功能:
    • 管理計算機系統的硬體、軟體及資料資源;
    • 控制程式執行;
    • 改善人機介面;
    • 為其他應用軟體提供支援,讓計算機系統所有資源最大限度地發揮作用;
    • 提供各種形式的使用者介面,使使用者有一個好的工作環境;
    • 為其他軟體的開發提供必要的服務和相應的介面等。
  • 特徵:
    • 併發:兩個或者多個事件在同一時間間隔內發生;
    • 共享:系統中的資源可供記憶體中多個併發執行的程序共同使用;
    • 虛擬:把一個物理上的實體變為若干個邏輯上的對應物;
    • 非同步:在多道程式環境下,允許多個程式併發執行,但因資源有限,程序的執行不是一貫到底,而是走走停停,以不可預知的速度向前推送,這就是程序的非同步性。

基本概念

  • 互斥:程序之間訪問臨界資源時相互排斥的現象;

    臨界資源:一次僅允許一個程序使用的資源,如 印表機。
    臨界區:每個程序中訪問臨界資源的那段程式碼。

  • 併發:同一時間段有幾個程式都處於已經啟動到執行完畢之間,並且這幾個程式都在同一個處理機上執行,併發的兩種關係是同步和互斥;
  • 並行:單處理器中程序被交替執行,表現出一種併發的外部特徵;在多處理器中,程序可以交替執行,還能重疊執行,實現並行處理,並行就是同時發生的多個併發事件,具有併發的含義,但併發不一定是並行,也就是說事件之間不一定要同一時刻發生;
  • 同步:程序之間存在依賴關係,一個程序結束的輸出作為另一個程序的輸入。具有同步關係的一組併發程序之間傳送的資訊稱為訊息或者事件;
  • 非同步:和同步相對,同步是順序執行,而非同步是彼此獨立,在等待某個事件的過程中繼續做自己的事,不要等待這一事件完成後再工作。
    執行緒是實現非同步的一個方式,非同步是讓呼叫方法的主執行緒不需要同步等待另一個執行緒的完成,從而讓主執行緒幹其他事情。
  • 多執行緒:多執行緒是程序中併發執行的一段程式碼,能夠實現執行緒之間的切換執行;

    非同步和多執行緒:不是同等關係,非同步是目的,多執行緒只是實現非同步的一個手段,實現非同步可以採用多執行緒技術或者交給其他程序來處理。

發展歷程

  • 手工階段
  • 單道批處理系統
  • 多道批處理系統
  • 分時作業系統
  • 實時作業系統
  • 網路作業系統和分散式作業系統

    網路作業系統和分散式作業系統的不同之處在於:
    在分散式作業系統中,若干臺計算機相互協同完成同一任務;
    而在網路作業系統中,每臺計算機都是相互獨立的,它們並不能相互協同完成同一任務。

CPU的工作狀態

大多數計算機系統將CPU執行狀態分為目態與管態。
管態就是 supervisor(管理者) mode翻譯來的。
那麼目態呢,其實是object(目標) mode翻譯來的。

  • 管態:supervisor(管理者) mode又叫特權態、系統態或者核心態。CPU在管態下可以執行指令系統的全集。

    如果程式處於管態,則該程式就可以訪問計算機的任何資源,即 它的資源訪問許可權不受限制。

    通常,作業系統在管態下執行。

  • 目態:object(目標) mode又叫常態或使用者態。機器處於目態時,程式只能執行非特權指令,不能直接使用系統資源,也不能改變CPU的工作狀態,並且只能訪問這個使用者程式自己的儲存空間。

科普:為什麼叫object mode呢?
通常CPU執行兩種不同性質的程式:一種是作業系統核心程式;另一種是使用者自程式設計序或系統外層的應用程式。
對作業系統而言,這兩種程式的作用不同,前者是後者的管理者,因此“管理程式”要執行一些特權指令,而“被管理程式”出於安全考慮不能執行這些指令。
因為管理者需要管理它,它就是管理者的管理目標。所以就叫object mode。

  • 目態(使用者態)→管態(核心態)
    • 系統呼叫:這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作。
      系統呼叫機制的核心是使用了作業系統為使用者開放的一箇中斷來實現。
    • 異常:當CPU在執行使用者態程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,如 缺頁異常。
    • I/O裝置的中斷:當I/O裝置完成使用者請求操作後,會向CPU發出相應的中斷訊號,這時CPU會暫停執行下一條即將要執行的指令,轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。

      例如,硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中,執行後續的操作。

其中,系統呼叫可以認為是使用者程序主動發起的,異常和外部裝置中斷則是被動的。

管理功能

  • 處理機管理:
    • 程序控制:在傳統多道程式環境中,要是作業執行,必須先為它建立一個或多個程序,併為之分配必要的資源。當程序執行結束後,立即撤銷該程序,以便能及時回收該程序所佔用的各類資源。
    • 程序同步:為多個程序(含執行緒)的執行進行協調。
      • 程序互斥方式:程序(執行緒)在對臨界資源進行訪問時,應採用互斥方式。
      • 程序同步方式:在相互合作去完成共同任務的諸程序(執行緒)間,由同步機構對它們的執行次序加以協調。
    • 程序通訊:在多道程式環境下,為了加速應用程序的執行,應在系統中建立多個程序,並且再為一個程序建立若干個執行緒,由這些程序(執行緒)相互合作去完成一個共同的任務,而在這些程序(執行緒)之間又往往需要交換資訊。
    • 排程:在後備佇列上等待的每個作業或者程序,通常都需要排程才能執行,排程的任務,即 將處理機分配給它。
  • 儲存器管理:
    • 記憶體分配:採用靜態和動態兩種方式實現記憶體分配資料結構,以記錄記憶體使用情況,按照一定演算法分配,懟不再需要的記憶體進行回收。
    • 記憶體保護:確保每道使用者程式都只在自己的記憶體空間執行,彼此互不干擾。
    • 地址對映:編譯後的程式的地址分為邏輯地址和實體地址,多道程式環境中,每道程式不可能都從“0”地址開始,要保證程式執行,則須將邏輯地址轉換成記憶體空間中的實體地址。

      動態重定位:在程式執行過程中,每當訪問指令或資料時,將要訪問的程式或資料的邏輯地址轉換成實體地址。

      實現方法:在系統中增加一個重定位暫存器,用來裝入程式在記憶體中的起始地址,程式執行時,真正訪問的記憶體地址是相對地址於重定向暫存器中的地址相加之和,從而實現動態重定位。

    • 記憶體擴充:從邏輯上去擴充記憶體容量,使使用者所感受到的記憶體容量比實際容量大得多,或者讓更多的程式能併發執行。
  • 裝置管理:
    • 緩衝管理:緩衝區機制能夠有效緩解CPU執行的高速性和I/O低速性的矛盾。
    • 裝置分配:設定裝置控制表、控制器控制表等資料結構,能夠了解指定裝置當前是否可用,是否忙碌,以及該裝置被分配出去,系統是否還安全。
    • 裝置處理程式:實現CPU和裝置管理器之間的通訊,由CPU向裝置控制器發出I/O命令,要求它完成指定的I/O操作,反之由CPU接收從控制器發來的中斷請求,並給與迅速的響應和相應的處理。
  • 檔案管理:
    • 檔案儲存空間的管理:由檔案系統對諸多檔案及檔案的儲存空間實施統一的管理,對每個檔案分配必要的外存空間,提高外存的利用率和檔案系統的執行速度。
    • 目錄管理:相當於檔案的索引,建立目錄項(檔名、檔案屬性、檔案在磁碟中的物理位置等),方便使用者查詢檢索。
    • 檔案的讀/寫管理和保護:防止未經批准的使用者存取檔案、防止冒名頂替存取檔案、防止以不正確的方式使用檔案。

程序與執行緒

對於作業系統來說,一個任務就是一個程序(Process),比如開啟一個瀏覽器就是啟動一個瀏覽器程序,開啟一個記事本就啟動了一個記事本程序,開啟兩個記事本就啟動了兩個記事本程序,開啟一個Word就啟動了一個Word程序。
有些程序還不止同時幹一件事,比如Word,它可以同時進行打字、拼寫檢查、列印等事情。在一個程序內部,要同時幹多件事,就需要同時執行多個“子任務”,我們把程序內的這些“子任務”稱為執行緒(Thread)。

類比:
程序=工廠
執行緒=工廠裡各個流水線

程序

程序可以認為是程式執行時的一個例項。程序是系統進行資源分配的獨立實體,且每個程序擁有獨立的地址空間。(即 資源的分配和排程的一個獨立單元)
程序控制塊(Process Control Block, PCB):儲存執行期間程序的資料,PCB是程序存在的唯一標誌。

  • 程序=程式+資料+PCB
  • 一個程序無法直接訪問另一個程序的變數和資料結構,如果希望讓一個程序訪問另一個程序的資源,需要使用程序間通訊,比如:管道、檔案、套接字等。

程序的五種基本狀態及其轉換:

  • 建立狀態:程序正在被建立,尚未轉到就緒狀態,建立程序需要申請一個空白的PCB,並向PCB寫一些控制和管理程序的資訊,然後由系統分配資源,將程序轉入就緒狀態。
  • 就緒狀態:程序已處於準備執行的狀態,獲得了除處理機以外的一切所需資源。
  • 執行狀態:程序在處理機上執行。在單處理機環境下,每一時刻最多隻有一個程序執行。
  • 阻塞狀態:程序正在等待某一事件而暫停執行,如等待某資源變為可用(不包括處理機)或等待輸入輸出I/O完成,即使處理機空閒,該程序也不能執行。
  • 結束狀態:程序正從系統中消失,這可能是程序正常結束或其他原因中斷退出執行,當程序需要結束執行時,系統首先必須置該程序為結束狀態,然後再進一步處理資源釋放和回收。

注意:後備佇列在外存中,而就緒佇列在記憶體中。

程序同步與互斥

PV操作是一種實現程序互斥與同步的有效方法。PV操作與訊號量的處理相關,P表示通過(pass)的意思,V表示釋放(荷蘭語v開頭)的意思。

在作業系統中,訊號量S是一整數。
S大於或等於零,代表可供併發程序使用的資源實體數;
在S小於零時,S表示正在等待使用資源實體的程序數。
建立一個訊號量必須說明此訊號量所代表的意義並且賦初值。
除賦初值外,訊號量僅能通過PV操作來訪問。

  • 訊號量S(semaphore)代表“資源數”
  • P操作的主要動作是:通過(pass)(即 使用資源)
    • S減1;

      類比:“佔用了一個資源”

    • 若S減1後仍大於或等於0,則程序繼續執行;

      類比:“若佔用一個資源後,還有多餘的資源或者剛好用完資源,那麼就代表該程序有資源可以利用,程序也就可以繼續執行”

    • 若S減1後小於0,則該程序被阻塞後放入等待該訊號量的等待佇列中,然後轉程序排程。

      類比:“若佔用一個資源後,還欠別人資源,那麼就代表該程序根本就沒有資源可以用了,如果再用就要欠債了,所以等待”

  • V操作的主要動作是:釋放(荷蘭語v開頭)(即 釋放資源)
    • S加1;

      類比:“資源佔用完了,物歸原主,釋放資源”

    • 若相加後結果大於0,則程序繼續執行;

      類比:“若釋放資源後,資源數大於0,就代表庫存裡還有資源可以給你利用,那就繼續執行”

    • 若相加後結果小於或等於0,則從該訊號的等待佇列中釋放一個等待程序,然後再返回原程序繼續執行或轉程序排程。

      類比:“若釋放資源後,資源數還是欠別人的或者為0,就代表庫存裡沒有資源可以利用了,所以等待”

注意:PV操作對於每一個程序來說,都只能進行一次,而且必須成對使用。

程序通訊

根據交換資訊量的多少和效率的高低,程序通訊分為如下低階通訊和高階通訊。

  • 低階通訊:只能傳遞狀態和整數值(控制資訊)。

    由於程序的互斥和同步,需要在程序間交換一定的資訊,故不少學者將它們也歸為程序通訊。

    • 特點:傳送資訊量小,效率低,每次通訊傳遞的資訊量固定,若傳遞較多資訊則需要進行多次通訊。
    • 程式設計複雜:使用者直接實現通訊的細節,容易出錯。
  • 高階通訊:提高訊號通訊的效率,傳遞大量資料,減輕程式編制的複雜度。
    提供三種方式:
    • 共享記憶體模式
    • 訊息傳遞模式
    • 共享檔案模式

共享記憶體模式

在通訊程序之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作,實現程序之間的資訊交換。

在對共享空間進行寫/讀操作時,需要同步互斥工具(如 P操作、V操作),對共享空間的寫/讀進行控制。

類比:
程序=物品
共享空間=錢
用錢進行交換,而不用物物交換

訊息傳遞模式

在訊息傳遞模式中,程序間的資料交換是以格式化的訊息(Message)為單位的。
程序通過系統提供的傳送訊息和接收訊息兩個原語進行資料交換。

若通訊程序之間不存在可直接訪問的共享空間,則必須利用作業系統提供的資訊傳遞方法實現程序通訊。

可分為直接和間接兩種通訊方式:

  • 直接:將訊息傳送給接收程序,並將它掛在接收程序的資訊緩衝佇列中,接收程序從訊息緩衝佇列中取得訊息。
  • 間接:將訊息傳送給某個中間實體(信箱),接受程序從中間實體中取得訊息,又稱為信箱通訊方式。

    類比:
    甲給乙寫信
    直接:甲直接把信交給乙
    間接:甲通過郵差把信交給乙

共享檔案模式

共享檔案:用於連線一個傳送程序和一個接收程序,以實現它們之間通訊的檔案,就是共享檔案,又名pipe(管道)檔案。
向管道提供輸入的傳送程序,以位元組流形式將大量的資料送入管道;
而接收管道輸出的接收程序,則從管道中接收資料。

為了協調雙方的通訊,管道機制必須提供互斥、同步和確定對方存在三方面的協調能力。

執行緒

對執行緒最基本的理解就是“輕量級程序”,它是一個基本的CPU執行單元,也是程式執行流的最小單元,由執行緒ID、程式計數器、暫存器集合和堆疊組成。(即 CPU排程的基本單元)
執行緒控制塊(Thread Control Block, TCB):儲存執行期間執行緒的資料,TCB是執行緒存在的唯一標誌。

  • 執行緒屬於程序是程序的一個實體,是被系統獨立和分配的基本單位。
  • 執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源,但它可以與同屬一個程序的其他執行緒共享程序所擁有的全部資源。
  • 一個程序可以建立和撤銷另一個執行緒,同一個程序中的多個執行緒之間可以併發執行。

區別

  • 程序是資源分配和排程的一個獨立單元;
    而執行緒是CPU排程的基本單元。
  • 同一個程序中可以包括多個執行緒,並且執行緒共享整個程序的資源(暫存器、堆疊、上下文),一個程序至少包括一個執行緒。
  • 程序的建立呼叫fork或者vfork,而執行緒的建立呼叫pthread_create;
    程序結束後它擁有的所有執行緒都將銷燬,而執行緒的結束不會影響同個程序中的其他執行緒的結束。
  • 執行緒是輕量級的程序,它的建立和銷燬所需要的時間比程序小很多,所有作業系統中的執行功能都是建立執行緒去完成的。
  • 執行緒中執行時一半都要進行同步和互斥,因為它們共享同一程序的所有資源。
  • 執行緒有自己的私有屬性TCB、執行緒id、暫存器、硬體上下文;
    而程序也有自己的私有屬性程序控制塊PCB,
    這些私有屬性是不被共享的,用來表示一個程序或一個執行緒的標誌。

處理機排程

  • 高階排程:(作業排程)根據某種演算法,把外存上處於後備佇列中那些作業調入記憶體。
  • 中級排程:(記憶體排程)將那些暫時不能執行的程序調至外存等待,把程序狀態改為就緒駐外存狀態或掛機狀態。
  • 低階排程:(程序排程)按照某種演算法從就緒佇列(記憶體)中選取一個程序,將處理機分配給它。

排程演算法

排程演算法是根據系統的資源分配策略所規定的資源分配演算法。
有的排程演算法適用於作業排程,有的適用於程序排程,有的兩種都適用。

  • 週轉時間=等待時間+執行時間

先來先服務排程(FCFS)

先來先服務排程(First Come First Service, FCFS):按照作業/程序進入系統的先後次序進行排程,先進入系統者先排程,即 啟動等待時間最長的作業/程序。

  • 適用性:作業排程、程序排程。
  • 優點:
    • 演算法簡單
    • 對長作業/程序有利(短的要等好久)
    • 有利於CPU繁忙型作業/程序

      CPU繁忙意味著是長作業,不需要頻繁的輸入輸出

  • 缺點:
    • 效率低
    • 對短作業/程序不利

      因為短作業執行時間很短,若令它等待較長時間,則帶權週轉時間會很高。

    • 不利於I/O繁忙型作業程序

      I/O繁忙意味著不停地中斷完成,是短作業

短作業優先排程(SJF)

短作業優先排程(Shortest Job First, SJF):該演算法每次從後備佇列/就緒佇列中選擇一個估計時間最短的作業/程序,將資源分配給它。

  • 適用性:作業排程、程序排程。
  • 優點:
    • 平均等待時間和平均週轉時間最少
  • 缺點:
    • 對長作業/程序不利(可能導致長作業/程序長期不被排程,發生“飢餓”現象)
    • 不能保證緊迫性作業/程序會被及時處理
    • 由於作業/程序的長短只是根據客戶說提供的估計執行時間而定的,而使用者有可能會有意或無意地縮短氣作業的估計執行時間,致使該演算法不一定能真正做到短作業優先排程。

優先順序排程

優先順序排程:該演算法每次從後備佇列/就緒佇列中選擇優先順序最高的一個作業/程序,將資源分配給它。

  • 適用性:作業排程、程序排程。

根據新的更高優先順序程序能否搶佔正在執行的程序,可將該排程分為:

  • 非搶佔式優先順序排程演算法:
    當有程序正在處理機上執行時,即使有更高優先順序的程序進入就緒佇列,也需等待當前程序執行完成,等待主動讓出處理機後,才把處理機分配給高優先順序的程序。
  • 搶佔式優先權排程演算法:
    當有程序正在處理機上執行時,只要又出現了另一個其優先權更高的程序,程序排程程式就立即停止當前程序(原優先權最高的程序)的執行,重新將處理機分配給新到的優先權最高的程序。

高響應比優先排程(HRRN)

高響應比優先排程(Highest Response Ratio Next, HRRN):該演算法是對FCFS排程演算法和SJF排程演算法的一種綜合平衡,同時考慮每個作業的等待時間和估計的執行時間。

在每次進行作業排程時,先計算後備作業佇列中每個作業的響應比,從中選出響應比最高的作業投入執行。

響應比=作業週轉時間/作業執行時間=(等待時間+要求服務時間)/要求服務時間

  • 適用性:主要用於作業排程
  • 優點:
    • 等待時間相同的作業,要求服務的時間越短,其優先權越高,此時對短作業有利;
    • 等待時間相同的作業,等待時間越長,其優先權越高,此時等同於先來先服務排程演算法;
    • 對於長作業,優先權隨等待時間的增加而提高,其等待時間足夠長時,其優先權便可提升到很高,從而也可獲得處理機,此時對長作業有利,克服了飢餓狀態。
  • 缺點:
    • 要進行響應比計算,增加了系統開銷。

時間片輪轉排程

該演算法將所有就緒程序按到達的先後次序排成一個佇列,每次排程時,把處理機分配給隊首程序,並令其執行一個時間片;
當執行的時間片用完時,由一個計時器發出時鐘中斷請求,排程程式便停止該程序的執行,並將其放到就緒佇列尾;
然後,再把處理機分配給就緒佇列中新的隊首。

  • 適用性:主要用於分時系統中程序排程

多級反饋佇列排程

該演算法是時間片輪轉排程演算法和優先順序排程演算法的綜合和發展,通過動態調整程序優先順序和時間片大小,可以兼顧多方面的系統目標。

設定多個就緒佇列,並賦予不同優先順序,優先順序越高,時間片越小,程序在進入待排程的佇列等待時,首先進入優先順序最高的Q1等待,一個時間片結束後,若程序沒有執行完,則轉入低一級的就緒佇列隊尾,僅當高優先順序佇列中無就緒程序才開始排程低一級的就緒佇列中的程序(若此刻有程序進入了高優先順序佇列中,那麼要先轉去呼叫高優先順序佇列)。

  • 例子:
    假設系統中有3個反饋佇列Q1,Q2,Q3,時間片分別為2,4,8。
    設有3個作業J1,J2,J3分別在時間 0 ,1,3時刻到達。而它們所需要的CPU時間分別是3,2,1個時間片。
    1. 時刻0 J1到達。於是進入到佇列1 , 執行1個時間片 , 時間片還未到,此時J2到達。
    2. 時刻1 J2到達。 由於同一佇列採用先來先服務,於是J2等待。 J1在運行了1個時間片後,已經完成了在Q1中的2個時間片的限制,於是J1置於Q2等待被排程。當前處理機分配給J2。
    3. 時刻2 J1進入Q2等待排程,J2獲得CPU開始執行。
    4. 時刻3 J3到達,由於同一佇列採用先來先服務,故J3在Q1等待排程,J1也在Q2等待排程。
    5. 時刻4 J2處理完成,由於J3,J1都在等待排程,但是J3所在的佇列比J1所在的佇列的優先順序要高,於是J3被排程,J1繼續在Q2等待。
    6. 時刻5 J3經過1個時間片,完成。
    7. 時刻6 由於Q1已經空閒,於是開始排程Q2中的作業,則J1得到處理器開始執行。J1再經過一個時間片,完成了任務。於是整個排程過程結束。

      從上面的例子看,在多級反饋佇列中,後進的作業不一定慢完成。

死鎖

死鎖是指多個程序因競爭臨界資源而造成的一種僵局(互相等待),若無外力作用,這些程序都無法向前推進。

  • 產生死鎖的根本原因是系統能夠提供的資源個數比要求該資源的程序數要少。
  • 產生死鎖的基本原因:
    • 資源競爭

      例子:
      A有紙,B有筆
      A:你不給我筆,我就寫不完作業
      B:你不給我紙,我就寫不了作業
      彼此僵持不下。。

    • 程序推進順序非法

      例子:
      A要前進2步,到桌子前,再後退2步,結果順序非法:
      A先後退,就永遠到不了桌子前,觸發不了,死鎖

  • 產生是死鎖的必要條件:
    • 互斥條件:涉及的資源是非共享的,即 一次只有一個程序使用。如果有另一個程序申請該資源,那麼申請程序必須等待,直到該資源被釋放。
    • 不剝奪條件(非搶佔):程序所獲得的資源在未使用完畢之前,不能被其他程序強行奪走,即 只能由獲得該資源的程序自己來釋放。
    • 佔有並等待(部分分配):程序每次申請它所需要的一部分資源。在等待一新資源的同時,程序繼續佔用已分配到的資源。
    • 環路條件(迴圈等待):存在一種程序迴圈鏈,鏈中每一個程序已獲得的資源同時被鏈中下一個資源所請求。

      注意:這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立;
      反之,只要上述條件之一不滿足,就不會發生死鎖。

處理策略

預防死鎖

預防死鎖:通過設定一些限制條件,破壞死鎖的一些必要條件,讓死鎖無法發生。

避免死鎖

避免死鎖:在動態分配資源的過程中,用一些演算法(如 銀行家演算法)防止系統進入不安全狀態,避免死鎖的發生。

銀行家演算法

Dijkstra E W於1968年提出銀行家演算法。之所以稱為銀行家演算法,是因為該演算法可用於銀行系統。

新程序進入系統時,它必須說明各類資源型別的例項的最大需求量,這一數量不能超過系統各類資源的總數。
當程序申請一組資源時,該演算法需要檢查申請者懟各類資源的最大需求量,如果系統現存的各類資源的數量可以滿足當前它懟各類資源的最大需求量時,就滿足當前的申請;否則,程序必須等待,直到其他程序釋放足夠的資源為止。
換言之,僅當申請者可以在一定時間內無條件地歸還它所申請的全部資源時,才能把資源分配給它。

死鎖的檢測及解除

死鎖的檢測及解除:在死鎖發生前不做任何操作,只是檢測當前是否發生死鎖,若發生死鎖,則採取一些措施(如 資源剝奪法、撤銷程序法、程序回退法)來解除死鎖。

主存管理

分割槽儲存管理

在分割槽儲存管理中,程式的地址空間是一維線性的,因為指令或運算元地址只要給出一個資訊量即可決定。

分割槽儲存管理中常用的分配策略有:首次適應演算法、迴圈首次適應演算法、最佳適應演算法和最壞適應演算法。

首次適應演算法

首次適應演算法:按地址從小到大排序,分配第一個符合條件的分割槽。

  • 優點:
    • 保留高地址部分的大空閒區,有利於後來的大型作業分配。
  • 缺點:
    • 低地址部分被不斷劃分,留下許多難以利用的小空閒區;
    • 每次分配時都要從低地址部分開始查詢,增加查詢時的系統開銷。

迴圈首次適應演算法

迴圈首次適應演算法:在首次適應演算法的基礎上,從上次查詢結束的位置開始查詢,分配第一個符合的分割槽。

  • 優點:
    • 使記憶體中的空閒分割槽分佈更均勻,減少了查詢時的系統開銷。
  • 缺點:
    • 缺乏大的空閒區,可能導致不能裝入大型作業。

最佳適應演算法

最佳適應演算法:是按空間從小到大排序,分配第一個符合條件的分割槽。

  • 優點:
    • 每次分配的空閒區都是最合適的
  • 缺點:
    • 在記憶體中留下許多難以利用的小空閒區

最壞適應演算法

最壞適應演算法:是按地址從大到小排序,分配第一個符合條件的分割槽。

  • 優點:
    • 產生碎片的機率最小,對中小型作業有利。
  • 缺點:
    • 缺乏大的空閒區,對大型作業不利。

頁式儲存管理

在頁式儲存管理中,程式的地址空間是一維線性的,因為指令或運算元地址只要給出一個資訊量即可決定。

理解:頁式儲存管理只用給出一個邏輯地址就行,因為頁的大小是固定的,邏輯地址÷頁的大小=頁號...餘 偏移量,所以是地址空間一維的,只用一個邏輯地址。

頁面置換演算法

在地址對映過程中,若在頁面中發現所要訪問的頁面不在記憶體中,則產生缺頁中斷。
當發生缺頁中斷時,如果作業系統記憶體中沒有空閒頁面,則作業系統必須在記憶體選擇一個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。

抖動(顛簸):是指在頁面置換過程中,剛剛調出的頁面馬上又要調入記憶體,剛剛調入的頁面馬上又要調出,發生頻繁的頁面排程行為。

  • 缺頁中斷率=成功訪問次數/總訪問次數
  • 最佳置換演算法(OPTimal replacement, OPT):將以後永不使用的或者在最長時間內不會被訪問的頁面調出,但由於人們無法預知程序在記憶體下的若干頁面中哪個是未來最長時間內不再被訪問的,因而該演算法無法實現。
  • 先進先出置換演算法(First In First Out, FIFO):將最早進入記憶體的頁面調出。

    該演算法會產生Belady異常,即 發生缺頁時,如果對一個程序未分配它所要求的全部頁面,有時分配頁數↑,缺頁率反而↑的異常現象。(先進先出,結果進來了一個需要的頁,也出去了一個需要的頁)

  • 最近最久未使用置換演算法(Least Recently Used, LRU):是將最近最長時間未訪問的頁面調出。該演算法為每個頁面設定一個訪問欄位,記錄頁面上次被訪問以來所經歷的時間,調出頁面時選擇時間最長的頁面。
  • 最不經常使用置換演算法(Least Frequently Used ,LFU):將最近應用次數最少的頁淘汰。
  • 時鐘置換演算法(CLOCK):也稱為最近未用演算法(NRU),該演算法是為每個頁面設定一個使用位,需要替換頁面時,迴圈檢查各個頁面,將使用位為1的頁面重置為0(使用時再置為1),直到遇到第一個使用位為0的頁面,將其調出。
    如果在每個頁面再增加一個修改位,則得到改進型的CLOCK置換演算法,類似的,需要替換頁面時,將使用位和修改位都為0的頁面調出。

段式儲存管理

段式儲存管理的使用者地址是二維的、按段劃分的。

理解:段式儲存管理必須給出(段號,偏移量),因為段的大小不固定,必須給出這兩個,所以是二維的。

在這樣的系統中作業的地址空間由若干邏輯分段組成,每個分段有自己的名字,對於一個分段而言,它是一個連續的地址區。

  • 由於標識某一程式地址時,要同時給出段名和段內地址,因此地址空間是二維的(實際上,為了實現方便,在第一次訪問某段時,作業系統就用唯一的段號來代替該段的段名)。
  • 程式地址的一般形式由(s,w)組成,這裡s是段號,w是段內位移。
段號 段內位移
s w

分頁和分段的異同

  • 相同點:
    • 分頁和分段都採用離散分配(也就是不連續的分配地址,類似於連結串列)的方式
    • 都要通過地址對映機構來實現地址變換
  • 不同點:
    • 從功能上看,
      頁是資訊的物理單位,分頁是為實現離散分配方式,以消除記憶體的外零頭,提高記憶體利用率,是為了滿足系統管理的需要;
      而段是資訊的邏輯單位,它含有一組意義相對完整的資訊,是為了滿足使用者的需要。
    • 頁的大小是由系統確定且固定不變的;
      而段的長度不固定,取決於使用者編寫的程式。
    • 分頁的作業地址空間是一維的;
      而分段的作業地址空間是二維的。

段頁式儲存管理

段頁式儲存管理的使用者地址也是二維的、按段劃分的。只是在段中再劃分成若干大小相等的頁。

理解:段頁式儲存管理也必須給出(段號,偏移量),雖然段的大小不固定,但是段內頁號和頁內偏移可以根據偏移量算出來,所以還是二維的。

  • 地址結構就由段號、段內頁號、頁內位移三部分組成。

    注意:不要看三部分就是三維的了,其實使用者使用的部分也是二維的。

段號 段內頁號 頁內位移
  • 使用者使用的仍是段號和段內相對地址,
    由地址變換機構自動將段內相對地址的高几位解釋為段內頁號,將剩餘的低位解釋為頁內位移。

  • 使用者地址空間的最小單位不是段而是頁,而主存按頁的大小劃分,按頁裝入。

    這樣,一個段可以裝入到若干個不連續的主存塊內,段的大小不再受主存可用區的限制了。

虛擬儲存器

虛擬儲存器:是指具有請求調入功能和置換功能,並能從邏輯上對記憶體容量加以擴充的一種儲存器系統。

  • 區域性性原理:是指CPU訪問儲存器時,無論是存取指令還是存取資料,所訪問的儲存單元都趨於聚集在一個較小的連續區域中。
    • 時間區域性性(Temporal Locality):如果一個資訊項正在被訪問,那麼在近期它很可能還會被再次訪問。

      程式迴圈、堆疊等是產生時間區域性性的原因。

    • 空間區域性性(Spatial Locality):在最近的將來將用到的資訊很可能與正在使用的資訊在空間地址上是臨近的。
    • 順序區域性性(Order Locality):在典型程式中,除轉移類指令外,大部分指令是順序進行的。順序執行和非順序執行的比例大致是5:1。此外,對大型陣列訪問也是順序的。

      指令的順序執行、陣列的連續存放等是產生順序區域性性的原因。

虛擬儲存器基於區域性性原理,在程式裝入時,可以只將程式的一部分裝入記憶體,就可以啟動程式執行。
在執行過程中,當所訪問的資訊不在記憶體中時,由作業系統將所需內容調入記憶體,使程式繼續執行;
同時,作業系統將記憶體中暫時不用的內容調出到外存。

這樣,系統就好像為使用者提供了一個比實際記憶體大得多的儲存器,稱為虛擬儲存器。

  • 特徵:
    • 離散性:是指記憶體分配時採用離散分配的方式。若採用連續分配方式,需要將作業裝入到連續的記憶體區域,這樣需要連續地一次性申請一部分記憶體空間,無法實現虛擬儲存功能,只有採用離散分配方式,才能為它申請記憶體空間,以避免浪費記憶體空間。
    • 多次性:作業無需在執行時一次性全部裝入記憶體,而是可以分成多次調入記憶體。
    • 對換性:作業執行時無需常駐記憶體,可以進行調入調出。
    • 虛擬性:從邏輯上擴充了記憶體的容量,使使用者所感覺到的記憶體容量遠大於實際容量。

檔案系統

檔案分配

檔案分配對應於檔案的物理結構,是指如何為檔案分配磁碟塊(外存)。

常用的磁碟空間分配方法有三種:

  • 連續分配:要求每個檔案在磁碟上佔有一組連續的塊。
  • 連結分配:採取離散分配的方式,分為隱式連結分配和顯式連結分配。
    • 隱式連結分配:每個檔案對應一個磁碟塊的連結串列,磁碟塊任意分佈,除最後一個盤塊外,每一個盤塊都有指向下一個盤塊的指標(類似於資料結構中的連結串列)。
    • 顯式連結分配:把用於連結檔案各物理塊的指標提取出來,顯示地存放在記憶體裡的一張連結表中,該表整個磁碟僅設定一張,由於分配給檔案的所有盤塊號都放在該表中,故稱該表為檔案分配表(FAT)。
  • 索引分配:把每個檔案的所有盤塊號集中在一起構成索引塊(表)。

磁碟排程演算法

  • 先來先服務演算法(First Come First Service, FCFS):根據程序請求訪問磁碟的先後順序進行排程。
  • 最短尋找時間優先演算法(Shortest Seek Time First, SSTF):選擇處理的磁軌是與當前磁頭所在磁軌距離最近的磁軌,使每次的尋找時間最短。

    該演算法會產生“飢餓”現象。

  • 掃描演算法(SCAN):也叫電梯演算法,在磁頭當前移動方向上選擇與當前磁頭所在距離最近的請求作為下一次服務的物件。

    實際上是在SSTF演算法的基礎上規定了磁頭運動的方向。

  • 迴圈掃描演算法(Cyclic SCAN, C-SCAN):在SCAN演算法的基礎上規定磁頭單向移動來提供服務,到達磁碟端點返回時,直接快速返回起始端。

    若磁頭移動到最遠端的請求後,即刻返回,而不是到達端點再返回,則將改進後的SCAN演算法和C-SCAN演算法稱為LOOK演算法和C-LOOK演算法。

I/O管理

I/O控制方式

  • 程式I/O方式:計算機從外部裝置讀取資料到儲存器,每次讀取一個字的資料。對讀入的每個字,CPU需要對外設狀態進行迴圈檢查,直到確定該字已經在I/O控制器的資料暫存器中。

    該方式適用於早期的無中斷計算機系統中。
    CPU和I/O裝置只能序列工作,導致CPU的利用率相當低。

  • 中斷驅動I/O控制方式:允許I/O裝置主動打斷CPU的執行並請求服務,從而使CPU在對I/O控制器傳送命令後可以做其他工作。

    該方法普遍用於現代的計算機系統中。
    由於資料中每個字在儲存器與I/O控制器之間 的傳輸都必須經過CPU,仍然會小號CPU較多的時間。

  • DMA I/O控制方式:在I/O裝置和記憶體之間開闢直接的資料交換通路,資料的基本單位是資料塊,所傳送的資料是從裝置直接送入記憶體;
    或者相反,僅在傳送資料塊的開始和結束時需要CPU干預,資料傳送是在DMA控制器的控制下完成的。

    該方法適用於I/O裝置為塊裝置時和主機進行資料交換。

    塊裝置是I/O裝置中的一類,是將資訊儲存在固定大小的塊中,每個塊都有自己的地址,還可以在裝置的任意位置讀取一定長度的資料,例如硬碟,U盤,SD卡等。

    直接記憶體存取(Direct Memory Access, DMA)是所有現代電腦的重要特色,它允許不同速度的硬體裝置來溝通,而不需要依賴於CPU的大量中斷負載。
    否則,CPU需要從來源把每一片段的資料複製到暫存器,然後把它們再次寫回到新的地方。在這個時間中,CPU對於其他的工作來說就無法使用。

  • I/O通道控制方式:是DMA方式的發展,只在一組資料的傳輸開始和結束時需要CPU干預,可以實現CPU、通道和I/O裝置三者的並行操作。

    該方式適用於裝置與主機進行資料交換是一組資料塊的情況,使用該方法要求系統必須配置相應的通道及通道控制器。

緩衝區

引入緩衝區的目的是什麼?

  • 緩和CPU與I/O裝置間速度不匹配的矛盾;
  • 減少對CPU的中斷頻率,放寬對CPU中斷響應時間的限制;
  • 解決基本資料單元大小(即 資料粒度)不匹配的問題;
  • 提高CPU和I/O裝置之間的並行性。