1. 程式人生 > >作業系統常見記憶體分配演算法及優缺點

作業系統常見記憶體分配演算法及優缺點

常見記憶體分配演算法及優缺點如下:
  (1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到一個能滿足其大小需求的空閒分割槽為止。然後再按照作業的大小,從該分割槽中劃出一塊記憶體分配給請求者,餘下的空閒分割槽仍留在空閒分割槽鏈中。
  該演算法傾向於使用記憶體中低地址部分的空閒分割槽,在高地址部分的空閒分割槽非常少被利用,從而保留了高地址部分的大空閒區。顯然為以後到達的大作業分配大的記憶體空間創造了條件。缺點在於低址部分不斷被劃分,留下許多難以利用、非常小的空閒區,而每次查詢又都從低址部分開始,這無疑會增加查詢的開銷。
  (2)迴圈首次適應演算法。該演算法是由首次適應演算法演變而成的。在為程序分配記憶體空間時,不再每次從鏈首開始查詢,而是從上次找到的空閒分割槽開始查詢,直至找到一個能滿足需求的空閒分割槽,並從中劃出一塊來分給作業。該演算法能使空閒中的記憶體分割槽分佈得更加均勻,但將會缺乏大的空閒分割槽。

  (3)最佳適應演算法。該演算法總是把既能滿足需求,又是最小的空閒分割槽分配給作業。
  為了加速查詢,該演算法需求將所有的空閒區按其大小排序後,以遞增順序形成一個空白鏈。這樣每次找到的第一個滿足需求的空閒區,必然是最優的。孤立地看,該演算法似乎是最優的,但事實上並不一定。因為每次分配後剩餘的空間一定是最小的,在儲存器中將留下許多難以利用的小空閒區。同時每次分配後必須重新排序,這也帶來了一定的開銷。
  (4)最差適應演算法。最差適應演算法中,該演算法按大小遞減的順序形成空閒區鏈,分配時直接從空閒區鏈的第一個空閒分割槽中分配(不能滿足需要則不分配)。非常顯然,如果第一個空閒分割槽不能滿足,那麼再沒有空閒分割槽能滿足需要。這種分配方法初看起來不太合理,但他也有非常強的直觀吸引力:在大空閒區中放入程式後,剩下的空閒區常常也非常大,於是還能裝下一個較大的新程式。

  最壞適應演算法和最佳適應演算法的排序正好相反,他的佇列指標總是指向最大的空閒區,在進行分配時,總是從最大的空閒區開始查尋。
  該演算法克服了最佳適應演算法留下的許多小的碎片的不足,但保留大的空閒區的可能性減小了,而且空閒區回收也和最佳適應演算法相同複雜。

相關推薦

作業系統常見記憶體分配演算法優缺點

常見記憶體分配演算法及優缺點如下:  (1)首次適應演算法。使用該演算法進行記憶體分配時,從空閒分割槽鏈首開始查詢,直至找到一個能滿足其大小需求的空閒分割槽為止。然後再按照作業的大小,從該分割槽中劃出一塊記憶體分配給請求者,餘下的空閒分割槽仍留在空閒分割槽鏈中。  該演算法

作業系統: 最佳適配演算法和鄰近適配演算法的模擬實現(記憶體分配演算法

實現動態分割槽的分配演算法。 (1) 最佳適配演算法:選擇記憶體空閒塊中最適合程序大小的塊分配。 (2) 鄰近適配演算法:從上一次分配的地址開始查詢符合要求的塊,所查詢到的第一個滿足要求的空閒塊就分配給程序。 模擬新增程序的時候,假定記憶體是一塊完整的空閒區,對於演算法(1

C++Primer Plus筆記——第十二章 類和動態記憶體分配總結程式清單

目錄 本章小結 程式清單 本章小結        本章介紹了定義和使用類的許多重要方面。其中的一些方面是非常微妙甚至很難理解的概念。如果其中的某些概念對於您來說過於複雜,也不用害怕——這些問題對於大多數C++的初學者來說都是很難的。 通常,對於諸如複製

幾種常見的排序演算法它們之間的比較

1.穩定性比較 插入排序、氣泡排序、二叉樹排序、二路歸併排序及其他線形排序是穩定的 選擇排序、希爾排序、快速排序、堆排序是不穩定的 2.時間複雜性比較 插入排序、氣泡排序、選擇排序的時間複雜性為O(n2) 其它非線形排序的時間複雜性為O(nlog2n) 線形排序的

C語言記憶體分配方式malloc,realloc,calloc,alloc.free函式

C語言跟記憶體分配方式   (1) 從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   (2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元

作業系統記憶體分配

首先看一下“基本的儲存分配方式”種類:        1.  離散分配方式的出現 由於連續分配方式會形成許多記憶體碎片,雖可通過“緊湊”功能將碎片合併,但會付出很大開銷。於是出現離散分配方式:將一個程序直接分散地裝入到許多不相鄰的記憶體分割槽中。      

JVM筆記4:Java記憶體分配策略配置引數

簡單來說,物件記憶體分配主要是在堆中分配。但是分配的規則並不是固定的,取決於使用的收集器組合以及JVM記憶體相關引數的設定 以下介紹幾條基本規則(使用的ParNew+Serial Old收集器組合): 一,物件優先在新生代Eden區分配 //-XX:+UseParNew

常見加解密演算法opensll的使用

上篇寫了關於jni的使用blog,本文主要在於使用c++實現一些加解密演算法,然後供android開發使用; 首先補充加解密的知識及基本概念 對稱加密VS非對稱加密、公鑰VS私鑰、簽名/驗證、資訊摘要  公鑰加密資料,然後私鑰解密的情況被稱為加密解密,私鑰加密資料,公鑰

c模擬記憶體分配演算法(首次適應演算法,最佳適應演算法,最壞適應演算法

#include<bits/stdc++.h> using namespace std; /*定義記憶體的大小為100*/ #define MEMSIZE 100 /*如果小於此值,將不再分割記憶體*/ #define MINSIZE 2 /*記憶體分割槽空間表結構*/ typedef str

幾種常見的加密演算法 Java 實現

介紹 本文主要對加密演算法做個概況性的介紹,然後給出幾種簡單的加密演算法 Java 實現。 1. 演算法種類 單向加密 對稱加密 非對稱加密 1.1 單向加密 即加密之後不能解密,一般用於資料驗證 1) Base64 Base64

netty 原始碼解讀三 記憶體分配相關(1)-buddy 夥伴記憶體分配演算法

1.前言: PooledByteBufAllocator 實現相當複雜,其中涉及許多複雜的資料結構類: 1)PoolArena 2)PoolChunk  3)PoolSubpage 5)PoolThreadCache 還有其他相關輔助類包括 PoolChunkLi

十一種通用濾波演算法優缺點

1、限幅濾波法(又稱程式判斷濾波法) A、方法:    根據經驗判斷,確定兩次取樣允許的最大偏差值(設為A)    每次檢測到新值時判斷:    如果本次值與上次值之差<=A,則本次值有效    如果本次值與上次值之差>A,則本次值無效,放棄本次值,用上次值代替本次值 B、優點:    能有效克服

記憶體分配演算法-(首次分配法和最佳分配法)

/* implement a memory allocation scheme by using algorithms first-fit, next-fit, and best-fit * freelist為空閒區連結串列的頭,它的下一個節點才指向空閒緩衝區 * fr

作業系統處理機排程常見的排程演算法

一.處理機排程的層次: 1.高階排程:高階排程又稱為作業排程或長程排程,其主要功能是根據某種演算法,把外存上處於後備佇列中的那些作業調入記憶體,也就是說,它的排程物件是作業。 2.中級排程:中級排程又稱中程排程。引入中程排程的主要目的是為了提高記憶體利用率和系統吞吐量。中級

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

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

常見動態記憶體分配malloc()/free()、new/delete使用方法常見錯誤

1.動態記憶體分配的幾種方式 ①從靜態儲存區分配記憶體,記憶體在編譯時已經分配好了,這塊記憶體在整個程式執行期間都存在,比如全域性變數 ②從棧上分配記憶體,函式體結束時,棧記憶體自動銷燬,比如區域性變數 ③從堆上開闢記憶體,比如malloc()/ne

JVM記憶體分配策略,垃圾回收演算法

本人免費整理了Java高階資料,一共30G,需要自己領取; 傳送門:https://mp.weixin.qq.com/s/J

jsonp跨域請求,常見的集中書寫方式,優缺點比較

簡介     符合Web2.0特徵的眾多網站一個明顯的特點就是採用Ajax。Ajax提供了在後臺提交請求訪問資料的功能。其實現主要使用的是XMLHttpRequest函式,這個函式允許客戶端的Javascript傳送到伺服器端的HTTP請求並獲得返回資料。Ajax同時也是

【筆記】DLX演算法常見應用

參考資料 精確覆蓋問題講解——grenet 數獨模型轉換——bl0ss0m DLX演算法求解數獨——grenet 問題引入 精確覆蓋問題: 有r個由1~n組成的集合S1,S2,S3....Sr,要求選擇若干集合,使得1~n恰好只在一個集合裡出現。 數獨問題: 在9×9的矩陣裡填數,使得每一行每

三、Java虛擬機器自動記憶體管理機制、物件建立記憶體分配

  1、物件是如何建立: 步驟:    (1)、虛擬機器遇到new <類名>的指令---->根據new的引數是否在常量池中定位一個類的符號引用    (2)、檢測該符號引用代表的類是否已經被載入、解析、和初始化。(如果沒有則