1. 程式人生 > >轉:常用的記憶體管理演算法的簡要介紹

轉:常用的記憶體管理演算法的簡要介紹

1 sequential fit

包括first fit,next fit,以及best fit

這種演算法的實現基本來說都是基於一個雙向連結串列或者迴圈連結串列來儲存所有的free memory.而且一般都會使用kunth的boundary tag演算法來合併臨近的記憶體(這個演算法可以去網上搜索下,這裡就不介紹了).

其中free block的順序一般為FIFO,LIFO或者address order(AO).

而從free list中分配block則有三種方法. 第一種 就是 first fit,也就是從頭開始搜尋,找到第一個可以滿足請求大小的block. 第二種是next fit,它是從最後一次搜尋停止的地方開始搜尋,找到下一個滿足請求大小的block.
第三種是best fit,它是每次都是遍歷list,然後找到滿足請求大小的最小的那個block.

fist fit : 當找到的block比請求的大的話,就分割這個block將剩餘的插入到free list中.我們可以看到,這樣的話會使得前面的block越來越小,從而導致每次搜尋都會越來越遠.

next fit: 可以看做是優化版的 first fit.

best fit: 它是從生成的記憶體碎片來看,最好的一種策略,因為它會產生最小的碎片.可是由於它會每次遍歷所有block,所以它的效率比較低.為了解決它的碎片問題,那就是每次提交給請求者的記憶體都會大於等於它的請求值.不過這樣會導致記憶體浪費. 而segreganted fit演算法可以看做是best fit的一種很好的補充(下面會介紹這個演算法).


2 segreganted free list


這種資料結構其實也就是將相同大小的block放在一個連結串列,然後將將這些連結串列再組合成一個連結串列或者陣列(可以看到memcached也就是用的這種演算法).當請求到來時,從最合適的size大小的連結串列中取得一個block.而一般block的大小都是2的次冪.比如2,4,8等等.

segreganted fit演算法

也就是當請求到來時,會將每次提交的值按一定的規則對齊,然後從free list搜尋的話就按對齊後的這個值來搜尋,一般都是先從陣列或者連結串列中去的當前的size class然後再在這個size class中搜索可用的block(memcached也就是使用的這種記憶體管理演算法).


3 buddy system


包括binary buddy和double buddy.

buddy system可以說是segreganted free list的一個變體.它只不過提供了一個受限制的但是高效的分割和組合記憶體塊的演算法.在一個簡單的buddy結構中,整個記憶體堆被分為兩個塊,這兩個塊就稱作一對buddy.而當記憶體請求到來時,它會像segreganted free list中處理的那樣,先將請求大小對齊,然後再遞交給buddy system.將會不斷地平均切割記憶體,直到得到一個最小的滿足請求的大小的塊.而當記憶體塊被釋放時,它會嘗試合併記憶體塊,而合併記憶體塊的話,一個記憶體塊只能和它的buddy合併.


可以看下面的圖:





binary buddy

這個是最簡單的也是最流行的,所有的buddy大小都是2的次冪,然後每次分割都是將一個塊分為相等的兩個塊.這個缺點就是容易造成記憶體碎片.

Fibonacci buddy

和binary buddy 類似,只不過buddy大小是按Fibonacci排列(16, 32, 48, 80, 128, 208...)

double buddy

這個它會使用兩個buddy system,比如一個是按binary buddy(2,4,8,16...)而另一個則使用2的倍數並且起始數是一個不同的值(3,6,12....).當請求到來,會選擇一個最合適的塊.這個會很大的降低記憶體碎片.

通過這個解決方法我們也可以在segreganted fit中使用,也就是我們可以提供兩種機制,也就是每次提供一對記憶體塊給請求,然後選擇最合適的(可以試下改進memcached).

相關推薦

常用記憶體管理演算法簡要介紹

1 sequential fit 包括first fit,next fit,以及best fit 這種演算法的實現基本來說都是基於一個雙向連結串列或者迴圈連結串列來儲存所有的free memory.而且一般都會使用kunth的boundary tag演算法來合併臨近的記憶體(這個演算法可以去網上搜索下,這裡就

Python記憶體管理演算法介紹

1      介紹 使用Python語言的一個好處是Python和其它一些高階語言一樣,會進行自動的記憶體管理。它使用引用計數機制檢測為物件分配的記憶體是否可以被釋放。然而,在Python中記憶體永遠不會還給作業系統,Python會持有這些記憶體並在需要時重新使用它們。在很

幾種常用記憶體管理底層介紹

需求 系統的實體記憶體是有限的,而對記憶體的需求是變化的, 程式的動態性越強,記憶體管理就越重要,選擇合適的記憶體管理演算法會帶來明顯的效能提升。 比如nginx, 它在每個連線accept後會malloc一塊記憶體,作為整個連線生命週期內的記憶體池。 當HTTP請求

linux記憶體管理演算法 夥伴演算法和slab

良好的作業系統效能部分依賴於作業系統有效管理資源的能力。在過去,堆記憶體管理器是實際的規範,但是其效能會受到記憶體碎片和記憶體回收需求的影響。現在,Linux® 核心使用了源自於 Solaris 的一種方法,但是這種方法在嵌入式系統中已經使用了很長時間了,它是將記憶體作為物件按照大小進行分配。本文將探索

第四節FreeRTOS 記憶體管理

目錄 記憶體管理的介紹 記憶體碎片 Heap_1-5記憶體分配的區別 Heap_1:適用於一旦建立好記憶體,就不刪除的任務。       (本質是分配的大陣列做記憶體堆.) Heap_2:適用於重複分配和刪除具有相同堆疊空間任務。(本質是分配的大

】Linux記憶體管理

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理與使用者記憶體管理之間的

C語言基礎知識筆記day5記憶體管理

day10 記憶體管理 @toc 一、變數作用域 全域性變數和區域性變數 一個C語言變數的作用域可以是程式碼塊,作用域就是函式作用域或者檔案作用域 程式碼塊:{}之間的一段程式碼; 1.檔案作用域: 如果一個變數在其他的程式碼檔案中已經定義了,可以在本程式中使用

】Linux記憶體管理(最透徹的一篇)

摘要:本章首先以應用程式開發者的角度審視Linux的程序記憶體管理,在此基礎上逐步深入到核心中討論系統實體記憶體管理和核心記憶體的使用方法。力求從外到內、水到渠成地引導網友分析Linux的記憶體管理與使用。在本章最後,我們給出一個記憶體對映的例項,幫助網友們理解核心記憶體管理

memcached記憶體管理演算法

簡單的寫寫,看完了memcached的這部分程式碼之後覺得跟我的ccache還是很像的.1) 分配memcached中的記憶體全部由型別為slabclass_t的結構體儲存 typedef struct {    unsigned int size;      /* sizes of items *

【無監督學習】5譜聚類演算法原理介紹

前言:學習譜聚類,最好有一些圖論、矩陣分解(SVD)方面的知識,這樣會更加有利於譜聚類的學習。當然,譜聚類理解起來並不困難,實際操作也大多是譜聚類+K-means聚類聯合使用的。 –—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—

第九章自動記憶體管理

實驗一: 從AMM改成ASMM管理 #######備份引數檔案 SQL> create pfile='/tmp/init1222.ora' from spfile; File created. SQL> show parameter memory_target; NAM

機器學習總結(十)常用聚類演算法(Kmeans、密度聚類、層次聚類)及常見問題

任務:將資料集中的樣本劃分成若干個通常不相交的子集。 效能度量:類內相似度高,類間相似度低。兩大類:1.有參考標籤,外部指標;2.無參照,內部指標。 距離計算:非負性,同一性(與自身距離為0),對稱性

JAVA隨時筆記(四)常用的排序演算法實現

1、氣泡排序 原理: 比較array[n]和array[n+1]的大小,把大的數交換到後面,即array[n]>array[n+1],就交換。迴圈到陣列最後,就可以把最大值找出來,放到array[length-1]上。 第二次迴圈,把第二大的數交換到

Buddy夥伴堆記憶體管理演算法

參考了三篇部落格的內容,一篇的介面,一篇的演算法和一篇的原理解釋,都對程式碼進行了一定的改變,介面增加了很多部分,內部的話可變性提高,動態適應資料變化。 可以與這三篇部落格內容對比著看,便於理解演算法。  理解的話看 https://blog.csdn.net/orange_os/ar

作業系統核心原理-5.記憶體管理(下)段式記憶體管理

一、分頁系統的缺點   分頁系統存在的一個無法容忍,同時也是分頁系統無法解決的一個缺點就是:一個程序只能佔有一個虛擬地址空間。在此種限制下,一個程式的大小至多隻能和虛擬空間一樣大,其所有內容都必須從這個共同的虛擬空間內分配。 二、分段管理系統 2.1 何為分段管理   分段管理就是將一個程式按照邏輯單

作業系統核心原理-5.記憶體管理(上)基本記憶體管理

  作業系統的兩個角色分別是魔術師和管理者,在管理者這個角色中,除了CPU之外,記憶體是作業系統要管理的另外一個重要資源。記憶體管理需要達到兩個目標:一是地址保護,即一個程式不能訪問另一個程式的地址空間。二是地址獨立,即程式發出的地址應該與物理主存地址無關。這兩個目標就是衡量一個記憶體管理系統是否完善的標準,

java虛擬機器記憶體管理機制(一)JVM記憶體管理總結【分享】

近期看了看Java記憶體洩露的一些案例,跟原來的幾個哥們討論了一下,深入研究發現JVM裡面還是有不少以前不知道的細節,這裡稍微剖析一下。先看一看JVM的內部結構——如圖所示,JVM主要包括兩個子系統和兩個元件。兩個子系統分別是Class loader子系統和Execution

記憶體管理演算法--夥伴演算法

本來想年前就把記憶體管理這部分結束,可是計劃趕不上變化啊,過年事情太多,只能一拖再拖了,今天終於把夥伴演算法機制寫完了。這一節不再像前面似的只給出理論框架,畢竟linux記憶體管理的兩個演算法--夥伴演算法和slab網上資料太多了,在家時間比起上班畢竟是多一些,所以想直接用

Git和Repo管理使用簡要介紹

 原創http://blog.csdn.net/stevenhu_223/article/details/8828130 在Linux平臺下進行Android系統專案開發時,需要git或repo管理。 一. Git和Repo的區別:        1. Git:Git是一個

整理STL sort排序演算法詳細介紹

一切複雜的排序操作,都可以通過STL方便實現 ! 0 前言: STL,為什麼你必須掌握 對於程式設計師來說,資料結構是必修的一門課。從查詢到排序,從連結串列到二叉樹,幾乎所有的演算法和原理都需要理解,理解不了也要死記硬背下來。幸運的是這些理論都已經比較成熟,演算法也基本