離散分配首先要解決的是分配的基本單位問題。通常,分配的基本單位是頁與段。頁:固定大小的片段。段:長度可變,它是使用者可以自己定義的一段資料集合(即使用者根據需要來劃分程式:**段,靜態資料段,堆段,棧段)。
根據分配基本單位 的不同,離散分配管理 方式分為一下三種:
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大小的頁。
乙個段內的每個頁都可以裝入記憶體的頁框(塊)中去。所以與分頁系統一樣,這裡也有乙個頁表,來記錄段的頁的記憶體駐留情況。程序的段也需要乙個段表來記錄,以實現分段保護和共享等功能。
位址轉換這裡也是用快表,利用硬體也完成位址轉換。這裡複雜一些,需要分別獲取段表,頁表。所以產生了額外的記憶體開銷
總結:在頁式、段式儲存管理中,為獲得一條指令或資料,須兩次訪問記憶體(一次訪問頁表/段表,一次訪問記憶體取真正的記憶體單元);
而段頁式則須三次訪問記憶體(第一次是由段表位址暫存器得段表始址後訪問段表,由此取出對應段的頁表在記憶體中的位址。 第二次則是訪問頁表得到所要訪問的實體地址。 第三次才能訪問真正需要訪問的物理單元)
參考:
記憶體分配方式
記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...
記憶體分配方式
記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...
記憶體分配方式
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...