吴忠躺衫网络科技有限公司

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

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

3天內不再提示

內存的基本概念以及操作系統的內存管理算法

MCU開發加油站 ? 來源:LiteOS物聯網操作系統 ? 作者:LiteOS物聯網操作系 ? 2022-08-18 15:52 ? 次閱讀

本文主要介紹內存的基本概念以及操作系統的內存管理算法。

內存的基本概念

內存是計算機系統中除了處理器以外最重要的資源,用于存儲當前正在執行的程序和數據。內存是相對于CPU來說的,CPU可以直接尋址的存儲空間叫做內存,CPU需要通過驅動才能訪問的叫做外存。

ROM RAM Flash

內存一般采用半導體存儲單元,分為只讀存儲器(ROM,Read Only Memory)、隨機存儲器(RAM,Random Access Memory)ROM一般只能讀取不能寫入,掉電后其中的數據也不會丟失。RAM既可以從中讀取也可以寫入,但是掉電后其中的數據會丟失。內存一般指的就是RAM。ROM在嵌入式系統中一般用于存儲BootLoader以及操作系統或者程序代碼或者直接當硬盤使用。近年來閃存(Flash)已經全面代替了ROM在嵌入式系統中的地位,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程的特性,而且斷電也不會丟失數據,同時可以快速讀取數據。

兩類內存管理方式

內存管理模塊管理系統的內存資源,它是操作系統的核心模塊之一。主要包括內存的初始化、分配以及釋放。

從分配內存是否連續,可以分為兩大類。

連續內存管理:

為進程分配的內存空間是連續的,但這種分配方式容易形成內存碎片(碎片是難以利用的空閑內存,通常是小內存),降低內存利用率。連續內存管理主要分為單一連續內存管理和分區式內存管理兩種。

非連續內存管理:

將進程分散到多個不連續的內存空間中,可以減少內存碎片,內存使用率更高。如果分配的基本單位是頁,則稱為分頁內存管理;如果基本單位是段,則稱為分段內存管理。

當前的操作系統,普遍采用非連續內存管理方式。不過因為分配粒度較大,對于內存較小的嵌入式系統,一般采用連續內存管理。本文主要對嵌入式系統中常用的連續內存管理的分區式內存管理進行介紹。

分區式內存管理

分區式內存管理分為固定分區和動態分區。

固定分區:

事先就把內存劃分為若干個固定大小的區域。分區大小既可以相等也可以不等。固定分區易于實現,但是會造成分區內碎片浪費,而且分區總數固定,限制了可以并發執行的進程數量。

動態分區:

根據進程的實際需要,動態地給進程分配所需內存。

動態分區式內存管理

1運作機制動態分區管理一般采用空閑鏈表法,即基于一個雙向鏈表來保存空閑分區。對于初始狀態,整個內存塊都會被作為一個大的空閑分區加入到空閑鏈表中。當進程申請內存時,將會從這個空閑鏈表中找到一個大小滿足要求的空閑分區。如果分區大于所需內存,則從該分區中拆分出需求大小的內存交給進程,并將此拆分出的內存從空閑鏈表中移除,剩下的內存仍然是一個掛在空閑鏈表中的空閑分區。2數據結構

空閑鏈表法有多種數據結構實現,這里介紹一種較為簡單的數據結構。每個空閑分區的數據結構中包含分區的大小,以及指向前一個分區和后一個分區的指針,這樣就能將各個空閑分區鏈接成一個雙向鏈表。

8865bf06-1ea3-11ed-ba43-dac502259ad0.png

3內存分配算法

First Fit (首次適應算法)

First Fit要求空閑分區鏈表以地址從小到大的順序連接。分配內存時,從鏈表的第一個空閑分區開始查找,將最先能夠滿足要求的空閑分區分配給進程。

Next Fit (循環首次適應算法)

Next Fit由First Fit算法演變而來。分配內存時,從上一次剛分配過的空閑分區的下一個開始查找,直至找到能滿足要求的空閑分區。查找時會采用循環查找的方式,即如果直到鏈表最后一個空閑分區都不能滿足要求,則返回到第一個空閑分區開始查找。

Best Fit (最佳適應算法)

從所有空閑分區中找出能滿足要求的、且大小最小的空閑分區。為了加快查找速度,Best Fit算法會把所有空閑分區按其容量從小到大的順序鏈接起來,這樣第一次找到的滿足大小要求的內存必然是最小的空閑分區。

Worst Fit (最壞適應算法)

從所有空閑分區中找出能滿足要求的、且大小最大的空閑分區。Worst Fit算法按其容量從大到小的順序鏈接所有空閑分區。

Two LevelSegregated Fit (TLSF)

使用兩層鏈表來管理空閑內存,將空閑分區大小進行分類,每一類用一個空閑鏈表表示,其中的空閑內存大小都在某個特定值或者某個范圍內。這樣存在多個空閑鏈表,所以又用一個索引鏈表來管理這些空閑鏈表,該表的每一項都對應一種空閑鏈表,并記錄該類空閑鏈表的表頭指針。

887ab0c8-1ea3-11ed-ba43-dac502259ad0.png

圖中,第一層鏈表將空閑內存塊的大小根據2的冪進行分類。第二層鏈表是具體的每一類空閑內存塊按照一定的范圍進行線性分段。

比如25這一類,以23即8分為4個內存區間

【25,25+8),

【25+8,25+16),

【25+16,25+24),

【25+24,25+32);

216這一類,以214分為4個小區間

【216,216+214),

【216+214,216+2*214),

【216+2*214,216+3*214),

【216+3*214,216+4*214)。

同時為了快速檢索到空閑塊,每一層鏈表都有一個bitmap用于標記對應的鏈表中是否有空閑塊,比如第一層bitmap后3位010,表示25這一類內存區間有空閑塊。對應的第二層bitmap為0100表示【25+16,25+24)這個區間有空閑塊,即下面的52Byte。

Buddysystems(伙伴算法)

Segregated Fit算法的變種,具有更好的內存拆分和回收合并效率?;锇樗惴ㄓ泻芏喾N類,比如BinaryBuddies,Fibonacci Buddies等。Binary Buddies是最簡單也是最流行的一種,將所有空閑分區根據分區的大小進行分類,每一類都是具有相同大小的空閑分區的集合,使用一個空閑雙向鏈表表示。BinaryBuddies中所有的內存分區都是2的冪次方。

因為無論是已分配的或是空閑的分區,其大小均為 2 的冪次方,即使進程申請的內存小于分配給它的內存塊,多余的內存也不會再拆分出來給其他進程使用,這樣就容易造成內部碎片。

當進程申請一塊大小為n的內存時的分配步驟為:

計算一個i值,使得2i-1

在空閑分區大小為2i的空閑鏈表中查找。

如果找到空閑塊,則分配給進程。

如果2i的空閑分區已經耗盡,則在分區大小為2i+1的空閑鏈表中查找。

如果存在2i+1的空閑分區,則將此空閑塊分為相等的兩個分區,這兩分區就是一對伙伴,其中一塊分配給進程,另一塊掛到分區大小為2i的空閑鏈表中。

如果2i+1的空閑分區還是不存在,則繼續查找大小為2i+2的空閑分區。如果找到,需要進行兩次拆分。第一次拆分為兩塊大小為2i+1的分區,一塊分區掛到大小為2i+1的空閑鏈表中,另一塊分區繼續拆分為兩塊大小為2i的空閑分區,一塊分配給進程,另一塊掛到大小為2i的空閑鏈表中。

如果2i+2的空閑分區也找不到,則繼續查找2i+3,以此類推。

在內存回收時,如果待回收的內存塊與空閑鏈表中的一塊內存互為伙伴,則將它們合并為一塊更大的內存塊,如果合并后的內存塊在空閑鏈表中還有伙伴,則繼續合并到不能合并為止,并將合并后的內存塊掛到對應的空閑鏈表中。

889a54d2-1ea3-11ed-ba43-dac502259ad0.png

下面的表格對上面6種算法的優缺點進行了比較:

內存算法優點缺點

First Fit高地址空間大空閑塊被保留低地址空間被不斷拆分,造成碎片;每次都從第一個空閑分區開始查找,增加了查找時的系統開銷

Next Fit空閑分區分布比較均勻,算法開銷小缺乏大內存空閑塊

Best Fit用最小內存滿足要求,保留大內存空閑塊每次分配后所拆分出來的剩余空閑內存總是最小的,造成許多小碎片,算法開銷大

Worst Fit每次分配后所拆分出來的剩余空閑內存仍較大,減少小碎片產生缺乏大內存空閑塊,算法開銷大

TLSF查找效率高,時間復雜度小,碎片問題表現良好內存回收時算法復雜,系統開銷大

Buddy systems內部碎片比較嚴重外部碎片較少

審核編輯:湯梓紅

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

    關注

    68

    文章

    10902

    瀏覽量

    213001
  • ROM
    ROM
    +關注

    關注

    4

    文章

    575

    瀏覽量

    85987
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74327
  • 操作系統
    +關注

    關注

    37

    文章

    6892

    瀏覽量

    123742

原文標題:如何高效管理MCU內存? 多種分配算法對比

文章出處:【微信號:mcugeek,微信公眾號:MCU開發加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread內存管理算法源碼閱讀

    RT-Thread對于內存管理主要有三種方式:小內存管理算法、slab管理算法和memheap管理算法
    的頭像 發表于 08-10 16:03 ?1637次閱讀
    RT-Thread<b class='flag-5'>內存</b><b class='flag-5'>管理算法</b>源碼閱讀

    【安富萊】【RTX操作系統教程】第18章 內存管理

    ,malloc()和free()函數的執行時間是不確定的。 在RTX中,操作系統把連續的大塊內存按分區來管理。每個分區中包含整數個大小相同的內存塊。如圖18.1所示:圖18.1
    發表于 02-03 13:23

    什么是嵌入式操作系統內存管理技術?

    1 概 述內存管理操作系統的中心任務之一。內存管理模塊通常是操作系統內核的一部分,其主要任務是
    發表于 07-30 07:19

    操作系統對于內存管理

    操作系統如何有效的管理內存便顯得尤為重要。本文講述操作系統對于內存管理的過去和現在,
    發表于 08-07 06:53

    操作系統原理基本概念

    操作系統原理基本概念計算機硬件系統組成中央處理器中央處理器是計算機的運算核心(Core)和控制單元( Control Unit) ,主要包括:運算邏輯部件: 一個或多個運算器寄存器部件: 包括通用
    發表于 07-26 07:46

    內存基本概念以及操作系統內存管理算法

    本文主要介紹內存基本概念以及操作系統內存管理算法。內存
    發表于 01-27 06:08

    RT-Thread系統動態內存堆有哪幾種管理算法

    每種 RTOS 均有內存管理機制,RT-Thread 的內存管理分為兩類:動態內存管理、
    發表于 03-31 13:53

    有關RT-Thread操作系統內存管理模塊基本知識簡析

    ?! T-Thread操作系統將內核與內存管理分開實現,操作系統內核僅規定了必要的內存管理函數
    發表于 05-11 15:14

    動態內存管理是什么?動態內存管理算法有哪幾種

    使用。RT-Thread 系統為了滿足不同的需求,提供了兩套不同的動態內存 管理算法,分別是小堆內存管理算法和 SLAB
    發表于 08-29 15:23

    嵌入式操作系統內存管理技術的分析與比較

    嵌入式操作系統內存管理技術的分析與比較  1 概 述   內存管理操作系統的中心任務之一
    發表于 01-14 11:30 ?751次閱讀
    嵌入式<b class='flag-5'>操作系統</b><b class='flag-5'>內存</b><b class='flag-5'>管理</b>技術的分析與比較

    嵌入式操作系統FreeRTOS內存如何管理和堆

    嵌入式操作系統FreeRTOS內存管理和堆
    的頭像 發表于 01-10 15:17 ?4816次閱讀
    嵌入式<b class='flag-5'>操作系統</b>FreeRTOS<b class='flag-5'>內存</b>如何<b class='flag-5'>管理</b>和堆

    內存基本概念以及操作系統內存管理算法

    本文主要介紹內存基本概念以及操作系統內存管理算法。 一、
    的頭像 發表于 08-14 14:39 ?3937次閱讀

    高效管理MCU內存的6種分配算法對比

    本文主要介紹內存基本概念以及操作系統內存管理算法。內存
    發表于 12-03 17:06 ?8次下載
    高效<b class='flag-5'>管理</b>MCU<b class='flag-5'>內存</b>的6種分配<b class='flag-5'>算法</b>對比

    如何在MCU上高效地管理內存?

    本文主要介紹內存基本概念以及操作系統內存管理算法
    發表于 02-08 15:29 ?2次下載
    如何在MCU上高效地<b class='flag-5'>管理</b><b class='flag-5'>內存</b>?

    Linux內核實現內存管理基本概念

    本文概述Linux內核實現內存管理基本概念,在了解基本概念后,逐步展開介紹實現內存管理的相關技
    發表于 06-23 11:56 ?888次閱讀
    Linux內核實現<b class='flag-5'>內存</b><b class='flag-5'>管理</b>的<b class='flag-5'>基本概念</b>
    澳门百家乐游戏说明书| 大世界百家乐赌场娱乐网规则| 基础百家乐规则| 真人娱乐城排行榜| 百家乐官网庄家出千内幕| 巨星百家乐官网的玩法技巧和规则 | 百家乐官网单注打法| 百家乐沙| bet365体育投注心得| 百家乐官网破解| 百家乐一黑到底| 皇冠现金投注网| 百家乐官网庄闲局部失| 百家乐空调维修| 齐齐哈尔市| 做生意讲究风水| 大发888 大发888游戏平台| 保单百家乐官网游戏机| 做生意必须看风水吗| 大发888网站是多少呢| 网络百家乐官网真假| 百家乐园36bol在线| 战神娱乐城| 豪华百家乐官网桌子厂家| 澳门百家乐实战视频| 皇冠开户正网 | 法拉利百家乐官网的玩法技巧和规则| 威尼斯人娱乐网可信吗| 3U百家乐官网娱乐城| 塑料百家乐筹码| 星期八百家乐的玩法技巧和规则| 闸北区| 百家乐发牌器8副| 尤溪县| 澳门百家乐赢钱技术| 必博网址| 百家乐牌数计算法| 永利高足球投注网| 百家乐园会员注册| E乐博网址| 澳门百家乐国际娱乐城|