0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux中的物理內(nèi)存的具體分配情況

454398 ? 來源: Chinaunix ? 作者:StolennnXB ? 2020-09-23 11:26 ? 次閱讀

Linux當中,物理內(nèi)存的劃分之前已經(jīng)寫過一篇了,今天來講講內(nèi)存的具體分配

首先,內(nèi)存被分成一個一個的節(jié)點,每個節(jié)點由不同的區(qū)域組成,當在區(qū)域內(nèi)部需要使用物理內(nèi)存的時候,就是今天要講的伙伴系統(tǒng)登場的時候了。

首先,各個內(nèi)存區(qū)域的空閑可用物理內(nèi)存被分割成一個一個的鏈表,每個鏈表當中的元素表示的空閑頁的大小都是相同的,且都是2的整數(shù)次冪,這一個個的鏈表,就按照整數(shù)次冪(之后叫order)的大小排列在一個數(shù)組當中。

當系統(tǒng)需要分配一個大小為k的空間的時候,會先將k按照2^order對其,之后就會先從本地節(jié)點上,按照order從小到達的次序去遍歷各個鏈表,直到找到剛好匹配。如果沒有剛好匹配,則需要在更大的鏈表上拿下一個更大塊的內(nèi)存,取出自己需要的之后,還要將剩下的部分塞回到對應(yīng)order的鏈表之上。如果當前節(jié)點的所有鏈表均沒有匹配,則需要在其他節(jié)點上“遠程調(diào)度”,這種情況對應(yīng)的消耗會比較大。

以上就是簡單的講述了伙伴系統(tǒng)的功能,其分配的基本單位是頁,一般為4k

由于buddy-system的基本單位為4k,但是內(nèi)核當中的數(shù)據(jù)結(jié)構(gòu)沒有那么大,而且頻繁分配釋放也會造成大量不必要的消耗,這時候就需要slab分配器出場了(它在嵌入式的兄弟叫slob,大型機上的兄弟較slub),其實slab的功能不僅僅是一個分配器,也是一個緩存管理器,其運行在伙伴系統(tǒng)之上。我們熟知的task_struct等很多內(nèi)核結(jié)構(gòu)都是由它來管理的。

當我們要申請一個slab緩存的時候,需要制定要緩存的固定類型,比如task_struct,這樣,當slab拿到物理內(nèi)存的時候,它就會把整塊的內(nèi)存排好,只用于存放task_struct,其他的數(shù)據(jù)類型也一樣,另外,所有的slab緩存是通過鏈表連在一起的。

當確定了slab緩存的類型之后,它就會根據(jù)固定類型的數(shù)據(jù)長度,選取對齊位置,選擇和是的padding進行對其,這個padding可以用來設(shè)置一些下一個空閑量偏移之類的東西。

這樣,當內(nèi)核需要用到某一種數(shù)據(jù)類型的時候,就會先根slab去要,slab如果沒有,slab就會去找buddy-system,拿到物理內(nèi)存之后,就按照請求劃分,返回調(diào)用方想要的。

如果是釋放固定的類型,也不是直接返還給物理內(nèi)存,slab依舊持有,方便下一次調(diào)用的是時候,直接從緩存拿,而較少調(diào)用buddy-system的次數(shù)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1338

    瀏覽量

    40098
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11131

    瀏覽量

    207990
收藏 人收藏

    評論

    相關(guān)推薦

    邏輯內(nèi)存物理內(nèi)存的區(qū)別

    邏輯內(nèi)存物理內(nèi)存是計算機系統(tǒng)兩個重要的概念,它們在計算機的運行和數(shù)據(jù)處理起著至關(guān)重要的作用。 1.
    的頭像 發(fā)表于 09-27 15:38 ?47次閱讀

    轉(zhuǎn)載 golang內(nèi)存分配

    Go 的分配采用了類似 tcmalloc 的結(jié)構(gòu).特點: 使用一小塊一小塊的連續(xù)內(nèi)存頁, 進行分配某個范圍大小的內(nèi)存需求. 比如某個連續(xù) 8KB 專門用于
    的頭像 發(fā)表于 09-05 14:12 ?132次閱讀
    轉(zhuǎn)載 golang<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    Linux內(nèi)核的頁面分配機制

    Linux內(nèi)核是如何分配出頁面的,如果我們站在CPU的角度去看這個問題,CPU能分配出來的頁面是以物理頁面為單位的。也就是我們計算機中常講
    的頭像 發(fā)表于 08-07 15:51 ?152次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>中</b>的頁面<b class='flag-5'>分配</b>機制

    FreeRTOS如何在中斷調(diào)用內(nèi)存分配函數(shù)?

    最近在玩FreeRTOS,遇到一個問題,就是不知如何在中斷調(diào)用內(nèi)存分配函數(shù)。pvPortMalloc函數(shù)中會調(diào)用xTaskResumeAll,而這個函數(shù)不能再中斷調(diào)用,所以請問在中斷中進行內(nèi)
    發(fā)表于 05-08 08:25

    物理內(nèi)存模型的演變

    內(nèi)存管理概述,主要是以Linux v2.6.11為例進行分析的,但是計算技術(shù)在不斷發(fā)展,新的存儲架構(gòu)、新的指令集架構(gòu)、新的SoC架構(gòu)等都對物理內(nèi)存
    的頭像 發(fā)表于 02-25 10:35 ?359次閱讀

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

    的主要優(yōu)點是避免了外部碎片,而缺點是需要修改內(nèi)核頁表。顯然,非連續(xù)內(nèi)存區(qū)域的大小必須是4096的倍數(shù)。Linux使用非連續(xù)物理內(nèi)存區(qū)的場景有幾種:(1)為swap區(qū)
    的頭像 發(fā)表于 02-23 09:44 ?764次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>內(nèi)存</b>管理之內(nèi)核非連續(xù)<b class='flag-5'>物理</b><b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>

    Linux內(nèi)核內(nèi)存管理之ZONE內(nèi)存分配

    內(nèi)核中使用ZONE分配器滿足內(nèi)存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內(nèi)存大小請求。
    的頭像 發(fā)表于 02-21 09:29 ?761次閱讀

    linux系統(tǒng)查看物理地址

    Linux系統(tǒng),訪問和查看物理地址是一個非常重要的任務(wù),因為它提供了對硬件設(shè)備的直接訪問。本文將詳細介紹如何在Linux系統(tǒng)查看
    的頭像 發(fā)表于 11-16 16:47 ?2954次閱讀

    查看Linux系統(tǒng)內(nèi)存使用情況的幾種方法

    Linux系統(tǒng),內(nèi)存監(jiān)控是優(yōu)化系統(tǒng)性能的關(guān)鍵。本文為你介紹12種方法,幫助你全面掌握Linux系統(tǒng)的內(nèi)存使用
    的頭像 發(fā)表于 11-13 09:30 ?1w次閱讀
    查看<b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>內(nèi)存</b>使用<b class='flag-5'>情況</b>的幾種方法

    Linux內(nèi)核內(nèi)存規(guī)整總結(jié)

    1.前言 伙伴系統(tǒng)作為內(nèi)核最基礎(chǔ)的物理內(nèi)存分配器,具有高效、實現(xiàn)邏輯簡介等優(yōu)點,其原理頁也盡可能降低內(nèi)存外部碎片產(chǎn)生,但依然無法杜絕碎片問題。外部碎片帶來的最大影響就是
    的頭像 發(fā)表于 11-11 11:17 ?1159次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>內(nèi)存</b>規(guī)整總結(jié)

    linux內(nèi)存性能優(yōu)化介紹

    不同;圖示為 32 位和 64 位系統(tǒng)的虛擬地址空間; 內(nèi)存映射是將虛擬內(nèi)存地址映射到物理內(nèi)存地址,內(nèi)核為每個進程都維護了一張頁表,記錄虛擬地址與
    的頭像 發(fā)表于 11-10 15:23 ?586次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b>性能優(yōu)化介紹

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對系統(tǒng)內(nèi)存分配、釋放、映射、管理、交換、壓縮
    的頭像 發(fā)表于 11-10 14:58 ?445次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)存</b>管理總結(jié)

    linux free命令詳解

    系統(tǒng)內(nèi)存分配和使用情況,以便及時采取措施優(yōu)化系統(tǒng)性能。 free命令的輸出信息,總內(nèi)存(Total):顯示系統(tǒng)的總
    的頭像 發(fā)表于 11-08 11:20 ?1164次閱讀

    C語言程序設(shè)計動態(tài)內(nèi)存分配如何實現(xiàn)

    C語言程序設(shè)計,動態(tài)內(nèi)存分配如何實現(xiàn),需要注意哪些問題?
    發(fā)表于 09-28 16:53 ?1173次閱讀

    Linux內(nèi)存方面的初始化和常見的內(nèi)存分配方式

    | --- >mem_init linux4.14/init/main.c 在 mem_init 函數(shù)中會初始化伙伴系統(tǒng)和 slab 分配器。 先說兩個概念: 外部碎片 :有一段小內(nèi)存,夾在兩個大
    的頭像 發(fā)表于 09-28 16:13 ?690次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>方面的初始化和常見的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>分配</b>方式