計算機作業系統——離散儲存
固定分割槽,會產生頁內碎片等缺點,為此引入了動態分割槽方式。但動態分割槽又產生了外部碎片,導致記憶體的利用率也不理想。為了進一步提高記憶體的利用率,所以就產生了離散的分配方式。(理論來源於實際問題,這很好的體現在電腦科學中)
離散分配首先要解決的是分配的基本單位問題。通常,分配的基本單位是頁與段。
頁:固定大小的片段。段:長度可變,它是使用者可以自己定義的一段資料集合(即使用者根據需要來劃分程式:程式碼段,靜態資料段,堆段,棧段)。
根據分配基本單位 的不同,離散分配管理 方式分為一下三種:
1、分頁儲存管理
分頁儲存管理是將一個程序的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,併為各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把實體記憶體空間分成與頁面相同大小的若干個儲存塊,稱為(物理)塊或頁框(frame),也加以編號,如第0塊,第1塊等等。
使用者空間的每個頁面在需要載入系統時,都需要管理系統請求一個空閒的頁框(即在記憶體中找到空閒的區域),並將該頁面與該頁框之間聯絡起來。一個程序的兩個連續 頁面也可以分配到不連續的兩個頁框中,這樣就實現了離散分配。
在分頁系統中,允許將程序的各個頁離散地儲存在記憶體不同的物理塊中,但系統應能保證程序的正確執行,即能在記憶體中找到每個頁面所對應的物理塊,為了描述程序的記憶體分佈情況,引入一個單獨的資料結構(頁表
如上圖,在一個32位機中,當頁面大小為4kB時,它的頁內偏移量(也稱為頁內地址)所佔的位數最大為2的12次方,即需要12位,所以0~11位是頁內偏移量,其餘的12~31位存放頁號。
地址轉換是分頁系統必須實現的功能。設定 一個暫存器來進行地址轉換,即快表(也稱為聯想暫存器)。由於快表成本的原因,快表不能很大,通常在16~512個頁表之間。快表中只存放當前使用頻繁的頁表。
2、分段儲存管理
在分段式儲存管理系統中,使用者把自己的作業(程序)按照邏輯關係劃分為若干個段,每個段都是從0開始編址,並有自己的名字和長度。因此,希望要訪問的邏輯地址是由段名(段號)和段內偏移量(段內地址)決定的。
為每個分段分配一個連續的分割槽,而程序中的各個段可以離散地裝入記憶體中不同的分割槽中,因此也實現了離散儲存。
為使程式能正常執行,即能從實體記憶體中找出每個邏輯段所對應的位置,應像分頁系統那樣,在系統中為每個程序建立一張段對映表,簡稱“段表”。
---- 每個段在表中佔有一個表項,其中記錄了該段在記憶體中的起始地址(“基址”)和段長(位元組)。段表一般放在記憶體中。在配置了段表後,
執行中的程序可通過查詢段表找到每個段所對應的記憶體區。可見,段表是用於實現從邏輯段到實體記憶體區的對映。
3. 段頁式儲存管理
為了解決分段的外部碎片問題,再次將“頁”引入,即把一個段劃分為許多頁,形成兩者的集合體,稱為段頁式儲存管理。這是現代作業系統採用的最多的方式,而單純的分頁儲存,分段儲存從來就沒被採用過(哈哈)。同理,將頁劃分為段,就稱為頁段式儲存。不過一般段比頁要大得多,所以都用段頁式。
現在邏輯地址就是如下狀態:
由於程序的段不多,所以段的位數比較少。32位機上通常是8位,即256個段。如果頁面大小為4KB,那麼頁內地址12位,段地址8位,段內頁號32-8-12=12位,即一個段有4K大小的頁。
一個段內的每個頁都可以裝入記憶體的頁框(塊)中去。所以與分頁系統一樣,這裡也有一個頁表,來記錄段的頁的記憶體駐留情況。程序的段也需要一個段表來記錄,以實現分段保護和共享等功能。
地址轉換這裡也是用快表,利用硬體也完成地址轉換。這裡複雜一些,需要分別獲取段表,頁表。所以產生了額外的記憶體開銷
總結:
在頁式、段式儲存管理中,為獲得一條指令或資料,須兩次訪問記憶體(一次訪問頁表/段表,一次訪問記憶體取真正的記憶體單元);
而段頁式則須三次訪問記憶體(第一次是由段表地址暫存器得段表始址後訪問段表,由此取出對應段的頁表在記憶體中的地址。 第二次則是訪問頁表得到所要訪問的實體地址。 第三次才能訪問真正需要訪問的物理單元)