作業系統基本原理---儲存管理
儲存管理
儲存器是計算機系統中最重要的資源之一。因為任何程式和資料以及各種控制用的資料結構都必須佔有一定的儲存空間,因此,儲存管理直接影響系統性能。
儲存器由記憶體和外存組成。記憶體是由系統實際提供的儲存單元(常指位元組)組成的一個連續地址空間,處理器可直接存取。外存(輔存)是指軟盤、硬碟、光碟和磁帶等一些外部儲存部件,常用來存放暫不執行的程式和資料。處理器不能直接訪問外存,需通過啟動 I/O(Input/Output,輸入/輸出)裝置才能進行記憶體、外存交換,其訪問速度慢,但價格便宜,常用作記憶體的後援裝置。
記憶體大小由系統硬體決定,儲存容量受到實際儲存單元的限制。虛擬儲存器(簡稱虛存)不考慮實際記憶體的大小和資料存取的實際地址,只考慮相互有關的資料之間的相對位置,其容量由計算機地址的位數決定。
系統中記憶體的使用一般分成兩部分,一部分為系統空間,存放作業系統本身及相關的系統程式;另一部分為使用者空間,存放使用者的程式和資料。
儲存管理主要是指對記憶體儲器的管理,負責對記憶體的分配和回收、記憶體的保護和記憶體的擴充。儲存管理的目的是儘量提高記憶體的使用效率。儲存管理的機制經歷了多次變遷,由以前的單一連續區管理到分割槽儲存管理再發展為段頁式管理。目前前兩種技術已逐步被淘汰,下面我們將詳細解讀段頁式儲存管理。
1.頁式儲存管理
分頁的基本思想是把程式的邏輯空間和記憶體的物理空間按照同樣的大小劃分成若干頁面,並以頁面為單位進行分配。在頁式儲存管理中,系統中虛地址是一個有序對(頁號,位移)。系統為每一個程序建立一個頁表,其內容包括程序的邏輯頁號與物理頁號的對應關係、狀態等。
頁式系統的動態地址轉換是這樣進行的:當程序執行時,其頁表的首地址已在系統的動態地址轉換機構中的基本地址暫存器中。執行的指令訪問虛存地址(p,d)時,首先根據頁號 p 查頁表,由狀態可知,這個頁是否已經調入記憶體。若已調入記憶體,則得到該頁的記憶體位置 p',然後,與頁內相對位移 d 組合,得到實體地址 r。如果該頁尚未調入記憶體,則產生缺頁中斷,以裝入所需的頁,如圖 2-5 所示。
頁式虛擬儲存管理是在頁式儲存管理的基礎上實現虛擬儲存器的。首先把作業資訊作為副本存放在磁碟上,作業執行時,把作業資訊的部分頁面裝入記憶體儲器,作業執行時若所訪問的頁面已在記憶體中,則按頁式儲存管理方式進行地址轉換,得到欲訪問的記憶體絕對地址,若欲訪問的頁面不在記憶體中,則產生一個“缺頁中斷”,由作業系統把當前所需的頁面裝入記憶體儲器中。
為此,在裝入作業時,就應在該作業的頁表中指出哪些頁已在記憶體儲器中,哪些頁還沒有裝入記憶體。可用一個標誌位指示對應頁是否在記憶體儲器,可假設標誌位為 1 表示該頁在記憶體,而標誌位為 0 表示該頁尚未裝入記憶體。為了能方便地從磁碟上找到作業資訊的副本,故在頁表中還可指出每一頁副本在磁碟上的位置。
當要裝入一個當前需要的頁面時,如果記憶體儲器中無空閒塊,則可選擇一個已在記憶體儲器中的頁面,把它暫時調出記憶體。若在執行中該頁面被修改過,則把該頁資訊重新寫回到磁碟上,否則不必重新寫回磁碟。當一頁被暫時調出記憶體後,讓出的記憶體空間用來存放
當前需要使用的頁面。以後再使用被調出的頁面時,可用同樣的方法調出另一個頁面而將其再裝入記憶體。頁面被調出或裝入之後都要對頁表中的相應表目做修改。
當記憶體中無空閒塊時,為了裝入一個頁面而必須按某種演算法從已在記憶體的頁中選擇一頁,將它暫時調出記憶體,讓出記憶體空間以存放所需裝入的頁面,這個工作稱為“頁面排程”。如何選擇調出的頁面是很重要的,如果採用了一個不合適的演算法,就會出現這樣的現象:剛被調出的頁面又立即要用,因而又要把它裝入,而裝入不久又被選中調出,調出不久又被裝入,如此反覆,使排程非常頻繁。這種現象稱為“抖動”。一個好的排程演算法應減少或避免抖動現象。常用的頁面排程演算法有:
(1)最優(OPT)演算法。選擇不再使用或最遠的將來才被使用的頁,這是理想的演算法,但是難以實現,常用於淘汰演算法的比較。
(2)隨機(RAND)演算法。隨機地選擇被淘汰的頁,開銷小,但是可能選中立即就要訪問的頁。
(3)先進先出演算法。選擇在記憶體駐留時間最長的頁似乎合理,但可能淘汰掉頻繁使用的頁。另外,使用 FIFO 演算法時,在未給予程序分配足夠的頁面數時,有時會出現給予程序的頁面數增多,缺頁次數反而增加的異常現象。FIFO 演算法簡單,易實現。可以把裝入記憶體儲器的那些頁的頁號按進入的先後順序排成佇列,每次總是調出隊首的頁,當裝入一個新頁後,把新頁的頁號排到隊尾。
(4)最近最少使用(Least Recently Used,LRU)演算法。選擇離當前時間最近的一段時間內使用得最少的頁。這個演算法的主要出發點是,如果某個頁被訪問了,則它可能馬上就要被訪問;反之,如果某個頁長時間未被訪問,則它在最近一段時間也不會被訪問。
2.段式儲存管理
段式儲存管理與頁式儲存管理相似。分段的基本思想是把使用者作業按邏輯意義上有完整意義的段來劃分,並以段為單位作為內外存交換的空間尺度。
一個作業是由若干個具有邏輯意義的段(如主程式、子程式、資料段等)組成。分段系統中,容許程式(作業)佔據記憶體中許多分離的分割槽。每個分割槽儲存一個程式分段。這樣,每個作業需要幾對界限地址暫存器,判定訪問地址是否越界也就更困難了。在分段儲存系統中常常利用儲存保護鍵實現儲存保護。分段系統中虛地址是一個有序對(段號,位移)。系統為每個作業建立一個段表,其內容包括段號、段長、記憶體起始地址和狀態等。狀態指出這個段是否已調入記憶體,即記憶體起始地址指出這個段,狀態指出這個段的訪問許可權。
分段系統的動態地址轉換是這樣進行的:程序執行時,其段表的首地址已在基本地址暫存器中,執行的指令訪問虛存(s,d)(取指令或取運算元)時,首先根據段號 s 查段表,若段已經調入記憶體,則得到該段的記憶體起始地址,然後與段內相對地址(段內偏移量 d)相加,得到實地址。如果該段尚未調入記憶體,則產生缺段中斷,以裝入所需要的段。段式儲存與頁式儲存的地址轉換方式類似,參看圖 1-6。
段式虛擬儲存管理仍然以段式儲存管理為基礎,為使用者提供比記憶體實際容量大的虛擬空間。段式虛擬儲存管理把作業中的各個分段資訊都保留在磁碟上,當作業可以投入執行時,做如下操作:
(1)首先把當前需要的一段或幾段裝入記憶體。
(2)作業執行時,如果要訪問的段已經在記憶體,則按照“段式儲存管理”中的方式進行地址轉換;如果要訪問的段不在記憶體中,則產生一個“缺段中斷”,由作業系統把當前需要的段裝入記憶體。
因此,在段表中應增設段是否在記憶體的標誌以及各段在磁碟上的位置,已在記憶體中的段仍要指出該段在記憶體中的起始地址和佔用記憶體區長度。
作業執行要訪問的段時,由硬體的地址轉換機構查段表。若該段在記憶體中,則立即把邏輯地址轉換成絕對地址;若該段不在記憶體中,則形成“缺段中斷”,由作業系統處理這個中斷。
處理的辦法是,查記憶體分配表,找出一個足夠大的連續區以容納該分段,如果找不到足夠大的連續區則檢查空閒區的總和,若空閒區總和能滿足該段要求,那麼進行適當移動將分散的空閒區集中;若空閒區總和不能滿足該段要求,可把記憶體中的一段或幾段調出,然後把當前要訪問的段裝入記憶體中。段被移動、調出和裝入後都要對段表中的相應表目做修改。新的段被裝入後應讓作業重新執行被中斷的指令,這時就能找到要訪問的段,也可以繼續執行下去。
3.段頁式儲存管理
段頁式管理是段式和頁式兩種管理方法結合的產物,綜合了段式組織與頁式組織的特點,根據程式模組分段,段內再分頁,記憶體被分劃成定長的頁。段頁式系統中虛地址形式是(段號、頁號、頁內偏移),如圖 2-6 所示。系統為每個程序建立一個段表,為每個段建立一個頁表。段頁式管理採用段式分配、頁式使用的方法,便於動態連線和儲存的動態分配。這種儲存管理能提高記憶體空間的利用率。
段式虛擬管理還是以段為單位分配記憶體空間,整段的調出、裝入,有時還要移動,這些都增加了系統的開銷。如果按段頁式儲存管理的方式,把每一段再分成若干頁面,那麼,每一段不必佔用連續的儲存空間;甚至當記憶體塊不夠時,可只將一段中的部分頁面裝入記憶體,這種管理方式稱為“段頁式虛擬儲存管理”。
段頁式虛擬儲存管理為每一個裝入記憶體的作業建立一張段表,還要為每一段建立頁表。段表中指出該段的頁表存放位置及長度,頁表中應指出該段的各頁在磁碟上的位置以及頁是否在記憶體中,若在記憶體中則填上佔用的記憶體塊號。作業執行時按段號查段表,找到相應的頁表再根據頁號查頁表,由標誌位判定該頁是否已在記憶體,若是,則進行地址轉換;否則進行頁面排程。地址轉換過程如圖 2-7 所示。
段頁式虛擬儲存管理結合了段式和頁式的優點,但增加了設定表格(段表、頁表)和查表等開銷,段頁式虛擬儲存器一般只在大型計算機系統中使用。