目錄
概述
爲進程分配內存空間的兩個基本原則——出於直覺:
(1)位置:爲程序分配連續的內存空間,亦即按順序存儲在內存中:
(2)尺寸:按程序的大小來確定所分配內存空間的大小;
連續分配方式會形成許多“碎片”,雖然可通過“緊湊”方法將許多碎片拼接成可用的大塊空間,但須爲之付出很大開銷。如果允許將一個進程直接分散地裝入到許多不相鄰接的分區中, 便可充分地利用內存空間,而無須再進行“緊湊”。基於這一思想而產生了離散分配方式。根據在離散分配時所分配地址空間的基本單位的不同,又可將離散分配分爲以下三種:分段、分頁、段頁式存儲管理方式。
一、分頁存儲管理方式
1,設計思想概述
分頁存儲管理將進程的邏輯地址空間分成若干個頁,併爲各頁加以編號,從0開始,如第0頁、第1頁等。相應地,也把內存的物理地址空間分成若干個塊(頁框),同樣也爲它們加以編號,如0#塊、1#塊等等。在爲進程分配內存時,以塊爲單位,將進程中的若干個頁分別裝入到多個可以不相鄰接的物理塊中。由於進程的最後一頁經 常裝不滿一塊,而形成了不可利用的碎片,稱之爲“頁內碎片”。
Windows系統使用此方法。
2,頁面大小
頁面過小:雖然一方面可以減小內存碎片,起到減少內存碎片總空間的作用,有利於內存利用率的提高,但另一方面卻會造成每個進程佔用較多的頁面,從而導致進程的頁表過長,佔用大量內存。此外,還會降低頁面換進換出的效率。
頁面過大:雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此,頁面的大小應選擇適中,且頁面大小應是2的冪,通常爲1 KB~8 KB。
3,頁表
在分頁系統中,允許將進程的各個頁離散地存儲在內存的任一物理塊中,爲保證進程仍然能夠正確地運行,即能在內存中找到每個頁面所對應的物理塊,系統又爲每個進程建立了一張頁面映像表,簡稱頁表。在進程地址空間內的所有頁(0~n),依次在頁表中有一頁表項,其中記錄了相應頁在內存中對應的物理塊號。在配置了頁表後,進程執行時,通過查找該表,即可找到每頁在內存中的物理塊號。可見,頁表的作用是實現從頁號到物理塊號的地址映射。
即使在簡單的分頁系統中,也常在頁表的表項中設置一存取控制字段,用於對該存儲塊中的內容加以保護。當存取控制字段僅有一位時,可用來規定該存儲塊中的內容是允許讀/寫還是隻讀;若存取控制字段爲二位,則可規定爲讀/寫、只讀和只執行等存取方式。如果有一進程試圖去寫一個只允許讀的存儲塊時,將引起操作系統的一次中斷。如果要利用分頁系統去實現虛擬存儲器,則還須增設一個數據項。
頁表描述
- 以數組形式存放至內存中;(進程開始時,大小就已經固定)
- 頁表大小不固定,故不存放在PCB中,只是在PCB中記錄頁表起始地址;
頁表的作用:分頁系統的核心數據結構
- 記錄程序各頁面所在的頁框位置;
- 支持進行地址重定位;
- 實現頁面訪問控制;(地址結構中存取控制字段,但有時一個頁面中數據和程序混合存放,而存取控制類型唯一,這也是分頁存儲的缺點)
- 存儲保護:限制程序在操作系統指定的內存區域內運行。(頁表長度寄存器)
4,地址機構
5,地址重定位
指令跨頁怎麼辦?
PC+地址重定位
PC指向(邏輯地址中的)下一條指令的地址,每次取出一個字節,並對其進行地址重定位。
如圖,一條多字節指令跨1-2兩個頁面,PC先指向頁面1中的指令,進行地址重定位,並將物理地址放入內存,然後PC加一,到達頁面2,接着進行地址重定位......。這樣便解決了指令跨頁的問題。
6,地址變換機構
操作系統調度某個進程到CPU上執行時,需要先佈置CPU現場(包括通用寄存器設置,以及PCB中的頁表地址寄存器和頁表長度寄存器)
性能問題:
訪問1次內存變量,涉及2次地址訪問:頁表+變量(訪問內存中的頁表,進而獲得內存地址;訪問內存地址,進而獲得變量)
解決辦法: 快表
- 設置在CPU內 部;
- 具有並行查找能力;
- 暫存當前正在使用的頁表項;
- 尺寸:16-512。可達到90%以上命中率
- 別名:聯想存儲器(相聯存儲器) ( associative memory),Intel術語: TLB( Translation lookaside buffers )
7,頁表的存儲問題
現代的大多數計算機系統都支持非常大的邏輯地址空間( B~ B)。在這樣的環境下,頁表就變得非常大,要佔用相當大的內存空間。
例如,對於一個具有32位邏輯地址空間的分頁系統,規定頁面大小爲4KB即B,頁表項佔4字節,故一個頁面可以存放1K個頁表項。然而當一個進程所需頁表項超過1K時(當頁表項不超過1K時,一個頁框可以存放所有頁表項,故只需將頁框號存放至PCB中即可),便無法滿足需求。
我們可以採用這樣兩個方法來解決這一問題:
①對於頁表所需的內存空間,可採用離散分配方式,以解決難以找到一塊連續的大內存空間的問題;
②只將當前需要的部分頁表項調入內存,其餘的頁表項仍駐留在磁盤上,需要時再調入。
這裏介紹一下方法一:離散分配方式——多級頁表
仍然假設一個頁框4KB,每個頁表項佔4字節,一個頁框可容納1024個頁表項。由於頁表的大小超過一個頁框的大小,所以可以將頁表分爲若干個小的頁表,每個1024個連續頁表項佔一個頁框,並設置外部頁表,來指向這些頁表(即對頁表項的存儲也使用分頁思想)。
此時地址結構變爲:
外層頁號確定頁表在哪個頁框(物理塊),找到頁框後,再對應頁號找到變量在哪個頁框,最後根據這個頁框+偏移量,找到變量的物理地址。
二、分段存儲管理方式
1,分段管理方式的引入
爲什麼要引入分段存儲管理方式,可從下面兩個方面說明:
- 一方面是由於通常的程序都可分爲若干個段,如主程序段、子程序段A、子程序段B、...數據段以及棧段等,每個段大多是一個相對獨立的邏輯單位;
- 另一方面,實現和滿足信息共享、信息保護、動態鏈接以及信息的動態增長等需要,也都是以段爲基本單位的。更具體地說,分段存儲管理方式更符合用戶和程序員多方面的需要。(分頁系統中,4K的空間數據、程序混合存放,且只有一種存取方式,不方便進行信息共享)
2,分段
在分段存儲管理方式中,作業的地址空間被劃分爲若干個段,每個段定義了一組邏輯信息。(這些分段在內存中的分配類似於動態分區分配的思想,會產生外零頭)
例如,有主程序段MAIN、子程序段X、數據段D及棧段S等,如圖4-19 所示。每個段都有自己的名字。爲了實現簡單起見,通常可用一個段號來代替段名,每個段都從0開始編址,並採用一段連續的地址空間。段的長度由相應的邏輯信息組的長度決定,因此各段的長度並不相等。
整個作業的地址空間由於被分成多個段,所以呈現出二維特性,亦即,每個段既包含了一部分地址空間,又標識了邏輯關係。其邏輯地址由段號(段名)和段內地址所組成。
- 分段是一段有意義的信息集合;
- 分段的劃分由程序員完成;
- 分段的長度不定;
- 指令不存在跨分段情況;
3,地址結構
包括段號和段地址。
在下圖地址結構中,允許-一個作業最長有64K個段,每個段的最大長度爲64 KB。
4,段表
在前面所介紹的動態分區分配方式中,系統爲整個進程分配一個 連續的內存空間。
而在分段式存儲管理系統中,則是爲每個分段分配一個連續的分區。
進程中的各個段,可以離散地裝入內存中不同的分區中。爲保證程序能正常運行,就必須能從物理內存中找出每個邏輯段所對應的位置。爲此,在系統中,類似於分頁系統,需爲每個進程建立一張段映射表,簡稱“段表”。每個段在表中佔有一一個表項,其中記錄了該段在內存中的起始地址(又稱爲“基址”)和段的長度。
段表可以存放在一組寄存器中,以利於提高地址轉換速度。但更常見的方法是將段表放在內存中。在配置了段表後,執行中的進程可通過查找段表,找到每個段所對應的內存區。
可見,段表是用於實現從邏輯段到物理內存區的映射的。
段表的作用:分段系統的核心數據結構
- 記錄程序各分段所在的內存位置;
- 支持進行地址重定位;
- 實現分段訪問控制;
- 存儲保護:限制程序在操作系統指定的內存區域內運行。
5,地址變換機構
爲了實現進程從邏輯地址到物理地址的變換功能,在系統中設置了段表寄存器,用於存放段表始址和段表長度TL;
在進行地址變換時,系統將邏輯地址中的段號與段表長度TL進行比較。若S>TL,表示段號太大,是訪問越界,於是產生越界中斷信號。若未越界,則根據段表的始址和該段的段號,計算出該段對應段表項的位置,從中讀出該段在內存的起始地址。
然後,再檢查段內地址d是否超過該段的段長SL。若超過,即d>SL,同樣發出越界中斷信號。若未越界,則將該段的基址d與段內地址相加,即可得到要訪問的內存物理地址。
6,分段與分頁的區別
三、段頁式存儲管理方式
1,基本思想
分頁系統:負責解決主存分配問題,內存按頁分配;
分段系統:負責解決邏輯地址空間管理問題,按段爲應用程序分配邏輯地址空間;
2,地址結構
3,段表與頁表
在段頁式系統中,爲了實現從邏輯地址到物理地址的變換,系統中需要同時配置段表和頁表。段表的內容與分段系統略有不同,它不再是內存始址和段長,而是頁表始址和頁表長度。
4,地址變化機構
在段頁式系統中,爲了獲得一條指令或數據,須三次訪問內存。第一次訪問是訪問內存中的段表,從中取得頁表始址:第二次訪問是訪問內存中的頁表,從中取出該頁所在的物理塊號,並將該塊號與頁內地址起形成指令或數據的物理地址: 第三次訪問才 是真正從第二次訪問所得的地址中取出指令或數據。