Linux內存分配機制之伙伴系統和SLAB

轉載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html?

??? 內核內存管理的一項重要工作就是如何在頻繁申請釋放內存的情況下,避免碎片的產生。這就要求內核采取靈活而恰當的內存分配策略。通常,內存分配一般有兩種情況:大對象(大的連續空間分配)、小對象(小的空間分配)。針對不同的需求,Linux分別采取了伙伴系統算法和SLAB進行內存分配。

??? 伙伴系統:把所有的空閑頁框分為11個塊鏈表,每個塊鏈表中的結點分別是大小為1,2,4,8,16,32,64,128,256,512和1024個連續頁框的頁框塊。最大的頁框塊包含1024個連續頁框,對應4MB大小的連續內存。假設要申請一個256個頁框的塊,則先從結點為256個連續頁框塊的鏈表中查找空閑塊,如果沒有,就去512個頁框的鏈表中找,找到了則將頁框塊分為2個256個頁框的塊,一個分配給應用,另外一個移到256個頁框的鏈表中。如果512個頁框的鏈表中仍沒有空閑塊,繼續向1024個頁框的鏈表查找—分割—分配和轉移。如果仍然沒有,則返回錯誤。使用過的頁框塊在釋放時,會主動將兩個連續的頁框塊合并為一個較大的頁框塊,然后作為結點插入相應規格的鏈表中。

??? 伙伴系統很好地解決了外部碎片(頁框之間的碎片)問題:

??? 如圖,當前內存段中空閑的頁框最大不過連續3個頁框。如果此時申請4個連續頁框大小的內存則只能去更大的空閑內存處截取了,久而久之,這些頁框之間留下的空隙就成為了外部碎片。而伙伴系統對這些外部碎片進行管理(分配、合并),使得內存中的頁框能盡量得到使用。

??

??? SLAB:伙伴系統分配內存時是基于頁框為單位的,比較大。如果是幾十個字節的小內存分配怎么辦呢?此時就需要用SLAB機制。slab分配器是基于對象進行管理的,所謂的對象就是內核中的數據結構(例如:task_struct,file_struct 等)。相同類型的對象歸為一類,每當要申請這樣一個對象時,slab分配器就從一個slab列表中分配一個這樣大小的單元出去,而當要釋放時,將其重新保存在該列表中,而不是直接返回給伙伴系統,從而避免內部碎片。slab分配器并不丟棄已經分配的對象,而是釋放并把它們保存在內存中。slab分配對象時,會使用最近釋放的對象的內存塊,因此其駐留在cpu高速緩存中的概率會大大提高。也就是說:在內存中維護一個slab列表,列表項對應這各種數據結構大小的內存塊;當有小對象申請內存時,直接從slab列表中找到對象類型的列表項,把相應大小的內存分配出去;對象用完后,釋放掉對象并把對象所占的內存塊歸還到slab列表以供下一個同類型的對象使用。

???? 同理,由于SLAB是對于小對象的內存分配,很好地解決了頁框內部的內存分配產生的碎片(內部碎片)問題。

?????????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396516.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

this.$modal.confirm 自定義按鈕關閉_自定義函數,讓你玩轉Excel得心應手

讓“自動更正”輸入統一的文本,你是不是經常為輸入某些固定的文本,如《電腦報》而煩惱呢?那就往下看吧。1.執行“工具→自動更正”命令,打開“自動更正”對話框。2.在“替換”下面的方框中輸入“pcw”(也可以是其他字符,“pcw”用小寫),在“替換為”下面的方框中輸…

php mysql 排名算法_MySQL PHP:優化排名查詢和計數子查詢

這是原始數據,并希望根據得分(count(tbl_1.id))對它們進行排名.[tbl_1]id | name1 | peter2 | jane1 | peter2 | jane3 | harry3 | harry3 | harry3 | harry4 | ron因此,制作臨時表(tbl_2)來計算每個id的分數.SELECT id, name, COUNT( id ) AS scoreFROM tbl_1GROUP BY idORDER…

CCF-CSP 最大的矩形

問題描述在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了一個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。請找出能放在給定直方圖里面積最大的矩…

Stack Overflow 2016年對50,000名開發人員進行的調查得出的見解

Today, Stack Overflow released the results of their 2016 survey of more than 50,000 developers.今天,Stack Overflow發布了他們2016年對50,000多名開發人員進行的調查的結果。 I’ve combed through this big document to bring you the most surprising ins…

web管理

1.站點根目錄下查找是否被放置webshell***根據語句判斷是不是PHP***腳本# find /storage/www/ -name "*.php" | xargs grep-in --color "eval("# grep -i --include*.php -r system\s*\( /storage/www/2.統計訪問日志中來自同ip出現的次數分析盜鏈、***、機…

MySQL的主從復制云棲社區_MySQL-主從復制

前言前篇說了作為運維在數據庫塊最起碼要會兩大技能,今天來說說第二技能--主從復制隨著業務的增長,一臺數據庫服務器以滿足不了需求了,負載過重,這時候就需要減壓,實現負載均衡讀寫分離,一主一從或一主多從…

數據存儲(SharedPreferences存儲)

SharedPreferences是通過 鍵值對 的方式存儲數據SharedPreferences是通過鍵值對的方式存儲的 將數據存儲到SharedPreferences中有3種方法:1.Context類中的getSharedPreferences()方法2.Activity類中的getPreferences()方法3.PreferencesManager類中的getDefaultShar…

編程程序的名稱要記住嗎_學習編程時要記住的5件事

編程程序的名稱要記住嗎by Kurt由庫爾特 學習編程時要記住的5件事 (5 Things to Remember When You’re Learning to Program) Learning to program is challenging. Aside from choosing a language or setting up a development environment that you know nothing about, t…

mysql 數據分析的步驟_數據分析8個主要步驟

# 在對數據進行分析時,主要細分為明確目標、應用思維和如下8個具體步驟:1、讀取數據2、清洗數據3、操作數據4、轉換數據5、整理數據6、分析數據7、展現數據8、總結報告接下來將介紹使用python來具體處理數據,包括上面幾個步驟的實現&#xff…

python學習的一個定位_python學習之——selenium元素定位

web自動化測試按步驟拆分,可以分為四步操作:定位元素,操作元素,獲取返回結果,斷言(返回結果與期望結果是否一致),最后自動出測試報告。其中定位元素尤為關鍵,此篇是使用webdriver通過頁面各個元…

Invoker

Invoker 是實體,dubbo外其他對象的轉化。轉載于:https://www.cnblogs.com/gtaxmjld/p/9786894.html

如何在開源社區貢獻代碼_如何在15分鐘內從瀏覽器獲得您的第一個開源貢獻

如何在開源社區貢獻代碼Matt Mullenweg, founder of Automattic, recently offered this advice to aspiring developers: “Contribute to open source.”Automattic的創始人Matt Mullenweg最近向有抱負的開發人員提供了以下建議 :“ 致力于開源。 ” Mullenweg —…

小心情。

從一開始學習html到現在的nodejs,也有段時間了,那個時候什么都不知道,記得一兩年之前還沉迷在一些網絡技術的圈子里面,每天看著那些大牛,感覺都很是厲害,每一項技術總是那樣的讓我著迷,從易語言…

一、win7下安裝yii2

作者:PHP學習網 出處:http://www.viphper.com/?p1159 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 之前在liunx上安裝過yii…

js獲取瀏覽器滾動條距離頂端的距離

js獲取瀏覽器滾動條距離頂端的距離 一、jQuery獲取的相關方法 jquery 獲取滾動條高度獲取瀏覽器顯示區域的高度 :$(window).height(); 獲取瀏覽器顯示區域的寬度 :$(window).width(); 獲取頁面的文檔高度 :$(document).height(); 獲取頁面的文…

vs dll必須和exe在同一個目錄_Win10系統丟失 .dll 文件的三種解決方案教程

有時候開機或打開一個軟件時,系統會提示無法啟動程序,這是怎么回事呢?這是因為計算機丟失某個或某些dll文件,由于系統本身不存在這些運行庫文件,需要進行添加才能使用該軟件。方法一:下載丟失的.dll文件&am…

datagrid頁面獲取表單一條數據的例子

【問題背景】 最近在做ITOO考評的時候想從頁面獲取表單選中的數據: 【代碼】 在數據網格(datagrid)組件包含兩種方法來檢索選中行數據: getSelected:取得第一個選中行數據,如果沒有選中行,則返回…

utf-8轉換gbk代碼_將代碼轉換為現金-如何以Web開發人員的身份賺錢并講述故事。...

utf-8轉換gbk代碼by Kurt由庫爾特 將代碼轉換為現金-如何以Web開發人員的身份賺錢并講述故事。 (Turning code to cash — How to make money as a Web Developer and live to tell the tale.) So you just learnt to code. You’re eager and anyone who can’t code thinks …

Spring+SpringMVC+MyBatis+easyUI整合基礎篇(十)SVN搭建

前言 前面一篇文章講了一下版本控制,但其實這一篇并沒有打算講細節的,感覺應該自己去動手弄一下,后來考慮了一下,版本控制真的挺重要的,如果自己實在搭建不好反而不去使用的話,真的有點可惜,當然…

AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵)

AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵) 1 #Warn2 #NoEnv ; # 禁用環境變量檢查:不檢查空變量是否為"環境變量",可以極大地提高效率3 #Hotstring EndChars ◎ ; # 熱字串終止符號設置:只把空格作為終止符,(文檔上所說是不能單獨用空格的…