1. 程式人生 > >記憶體連續分配方式採用的幾種演算法及各自優劣。

記憶體連續分配方式採用的幾種演算法及各自優劣。

連續分配方式,是指為一個使用者程式分配一個連續的記憶體空間。它主要包括單一連續分配、固定分割槽分配和動態分割槽分配。

單一連續分配

記憶體在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低地址部分;使用者區是為使用者提供的、除系統區之外的記憶體空間。這種方式無需進行記憶體保護。
這種方式的優點是簡單、無外部碎片,可以釆用覆蓋技術,不需要額外的技術支援。缺點是隻能用於單使用者、單任務的作業系統中,有內部碎片,儲存器的利用率極低。

固定分割槽分配

固定分割槽分配是最簡單的一種多道程式儲存管理方式,它將使用者記憶體空間劃分為若干個固定大小的區域,每個分割槽只裝入一道作業。當有空閒分割槽時,便可以再從外存的後備作業佇列中,選擇適當大小的作業裝入該分割槽,如此迴圈。

這種分割槽方式存在兩個問題:一是程式可能太大而放不進任何一個分割槽中,這時使用者不得不使用覆蓋技術來使用記憶體空間;二是主存利用率低,當程式小於固定分割槽大小時,也佔用了一個完整的記憶體分割槽空間,這樣分割槽內部有空間浪費,這種現象稱為內部碎片。

固定分割槽是可用於多道程式設計最簡單的儲存分配,無外部碎片,但不能實現多程序共享一個主存區,所以儲存空間利用率低。固定分割槽分配很少用於現在通用的作業系統中,但在某些用於控制多個相同物件的控制系統中仍發揮著一定的作用。

動態分割槽分配

動態分割槽分配又稱為可變分割槽分配,是一種動態劃分記憶體的分割槽方法。這種分割槽方法不預先將記憶體劃分,而是在程序裝入記憶體時,根據程序的大小動態地建立分割槽,並使分割槽的大小正好適合程序的需要
。因此係統中分割槽的大小和數目是可變的。

動態分割槽在開始分配時是很好的,但是之後會導致記憶體中出現許多小的記憶體塊。隨著時間的推移,記憶體中會產生越來越多的碎片,記憶體的利用率隨之下降。這些小的記憶體塊稱為外部碎片,指在所有分割槽外的儲存空間會變成越來越多的碎片,這與固定分割槽中的內部碎片正好相對。

在程序裝入或換入主存時,如果記憶體中有多個足夠大的空閒塊,作業系統必須確定分配哪個記憶體塊給程序使用,這就是動態分割槽的分配策略,考慮以下幾種演算法:

  • 首次適應(First  Fit)演算法:空閒分割槽以地址遞增的次序連結。分配記憶體時順序查詢,找到大小能滿足要求的第一個空閒分割槽。
  • 最佳適應(Best  Fit)演算法:空閒分割槽按容量遞增形成分割槽鏈,找到第一個能滿足要求的空閒分割槽。
  • 最壞適應(Worst  Fit)演算法:又稱最大適應(Largest Fit)演算法,空閒分割槽以容量遞減的次序連結。找到第一個能滿足要求的空閒分割槽,也就是挑選出最大的分割槽。
  • 鄰近適應(Next  Fit)演算法:又稱迴圈首次適應演算法,由首次適應演算法演變而成。不同之處是分配記憶體時從上次查詢結束的位置開始繼續查詢。

在這幾種方法中,首次適應演算法不僅是最簡單的,而且通常也是最好和最快的。在UNIX 系統的最初版本中,就是使用首次適應演算法為程序分配記憶體空間,其中使用陣列的資料結構 (而非連結串列)來實現。不過,首次適應演算法會使得記憶體的低地址部分出現很多小的空閒分割槽,而每次分配查詢時,都要經過這些分割槽,因此也增加了查詢的開銷。

鄰近適應演算法試圖解決這個問題,但實際上,它常常會導致在記憶體的末尾分配空間(因為在一遍掃描中,記憶體前面部分使用後再釋放時,不會參與分配),分裂成小碎片。它通常比首次適應演算法的結果要差。

最佳適應演算法雖然稱為“最佳”,但是效能通常很差,因為每次最佳的分配會留下很小的難以利用的記憶體塊,它會產生最多的外部碎片。

最壞適應演算法與最佳適應演算法相反,選擇最大的可用塊,這看起來最不容易產生碎片,但是卻把最大的連續記憶體劃分開,會很快導致沒有可用的大的記憶體塊,因此效能也非常差。

http://c.biancheng.net/cpp/html/2610.html

https://book.douban.com/reading/26342531/

相關推薦

記憶體連續分配方式採用演算法各自優劣

連續分配方式,是指為一個使用者程式分配一個連續的記憶體空間。它主要包括單一連續分配、固定分割槽分配和動態分割槽分配。 單一連續分配 記憶體在此方式下分為系統區和使用者區,系統區僅提供給作業系統使用,通常在低地址部分;使用者區是為使用者提供的、除系統區之外的記憶體空間。這

05 識別毒酒——演算法和編碼方式的分析和比較

說明 問題 識別毒酒 方法1 視為一個有約束的最優化問題進行求解 1 模型的進一步討論 3方法2 使用編碼的方法 1 結論 2 具體方法 3一個瑕疵和改進的方法

連續最大子序列和的演算法

題目: 連續子序列最大和,其實就是求一個序列中連續的子序列中元素和最大的那個。 比如例如給定序列: { -2, 11, -4, 13, -5, -2 } 其最大連續子序列為{ 11, -4, 13 },最大和為

3.記憶體連續分配管理方式

轉載自:http://c.biancheng.net/cpp/html/2610.html點選開啟連結 連續分配方式,是指為一個使用者程式分配一個連續的記憶體空間。它主要包括單一連續分配、固定分割槽分配和動態分割槽分配。 單一連續分配 記憶體在此方式下分為系統區和使用者區

CSS 中定位方式,說明他們的意義

sta 對象 偏移 nbsp fixed static 進行 方式 自身 1.static 默認定位方式 顯示為沒有設置定位時的位置 2.fixed(固定定位) 他所相對固定的對象是可視窗口,與其他無關。以瀏覽器窗口作為參考進行定位 3.relative(相對定位)

作業系統 第四章 2 儲存器管理 連續分配方式

1)單一連續分配: 記憶體分為系統區和使用者區兩部分 2)固定分割槽分配: 把記憶體分為一些大小相等或不等的分割槽,每個應用程序佔用一個分割槽。作業系統佔用其中一個分割槽。(劃分為幾個分割槽,便只允許幾道作業併發)    建立一記錄相關資訊的分割槽表(或分割槽連結

Java中建立物件的方式

建立物件的方式 方式 是否呼叫了建構函式 使用new關鍵字 是 使用Class類的newInstance方法 是 使用Constructor類的newInstance方法 是 使用clone方法 否 使用反序列化 否

dwz action返回方式實戰程式碼分享

1、jsp返回         @org.apache.struts2.convention.annotation.Result(name = "add", location = "/vivi/vivigsrp/jsp/vivigsrp/urzinfoadd.jsp"),

擁塞控制的演算法

在某段時間內,對網路中的資源(鏈路容量,交換節點中的快取和處理機等)需求大於可用的,就會造成擁塞。 擁塞控制就是防止過多的資料注入到網路中造成擁塞,是路由器或鏈路不會過載。 擁塞控制和流量控制的區別: 擁塞控制是一個全域性性的過程,涉及所有主機和路由器,以

NLP-關鍵詞抽取的演算法

TextRank 從PageRank PageRank的思想是這樣的: 求解網頁的重要性就是求解有向圖中節點的重要性,或者說節點的權重。圖中節點的重要性和節點的入度有關,越多的其他節點連線到該節點說明該節點的重要性越大。因此,節點的重要性與節點的入度有

Java資料庫的操作——DBUtils工具類結果集處理的方式

public class QueryRunnerDemo{ private static Connection con=JDBCUtils.getConnection(); public static void main(String[] args) throws SQLException{ QueryRun

js實現常見的演算法(陣列去重、字元統計、二分查詢等)

1、陣列去重:利用物件屬性進行篩選 function filter(arr){ let obj={}; let newArr=[]; for (let i=0;i<arr.

聚類分析中演算法的比較

將資料庫中的物件進行聚類是聚類分析的基本操作,其準則是使屬於同一類的個體間距離儘可能小,而不同類個體間距離儘可能大,為了找到效率高、通用性強的聚 類方法人們從不同角度提出了近百種聚類方法,典型的有K-means方法、K-medoids方法、CLARANS方法,BIRCH方

math: 求質數的演算法

1、根據質數的定義求  質數定義:只能被1或者自身整除的自然數(不包括1),稱為質數。  利用它的定義可以迴圈判斷該數除以比它小的每個自然數(大於1),如果有能被它整除的,則它就不是質數。對應程式碼是: /// <summary> /

求線段交點"的演算法(js實現,完整版)

“求線段交點”是一種非常基礎的幾何計算, 在很多遊戲中都會被使用到. 下面我就現學現賣的把最近才學會的一些”求線段交點”的演算法說一說, 希望對大家有所幫助. 本文講的內容都很初級, 主要是面向和我一樣的初學者, 所以請各位演算法帝們輕拍啊 嘎嘎 引

java多執行緒程式設計之連續列印abc的解法

java多執行緒程式設計之連續列印abc的解法 一道程式設計題如下: 例項化三個執行緒,一個執行緒列印a,一個執行緒列印b,一個執行緒列印c,三個執行緒同時執行,要求打印出10個連著的abc。 題目分析: 通過題意我們可以得出,本題需要我們使用三個執行緒

計算1-1/2+1/3-1/4+...-1/100的演算法總結

計算1-1/2+1/3-1/4+…-1/100 int main() { //法一: double n = 1; double sub = 0; double trem = 0; double q = 1; fo

java獲取時間戳的方式方式速度對比

最近做監控系統,發現程式碼中有前兩種方法,然後突然有了一個想法,到底哪個更快呢? 然後做了如下實驗: Java程式碼   import java.util.Calendar;   import java.util.Date;   public class TimeTest {       pr

flex彈出視窗的方式

Flex 中有兩種彈出視窗: 1. 最簡單的警告視窗 你需要先匯入Alert類: import mx.controls.Alert; 然後在想要彈出警告的時候使用:Alert.show(“你確定要退出系統嗎?”,“確認”,Alert.YES|Alert.NO,null,log

索引演算法

資料庫mysql索引:使用B樹索引 下面介紹一下B樹索引: Lucene全文檢索使用:二分查詢 下面介紹一下二分查詢: 二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列; 1、時間