chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

如何高效管理MCU內存? 多種分配算法對比?

jf_pJlTbmA9 ? 來源:LiteOS物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:LiteOS物聯(lián)網(wǎng)操作系 ? 2023-10-17 18:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

內存的基本概念

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

ROM RAM Flash

內存一般采用半導體存儲單元,分為只讀存儲器(ROM,Read Only Memory)、隨機存儲器(RAM,Random Access Memory)ROM一般只能讀取不能寫入,掉電后其中的數(shù)據(jù)也不會丟失。RAM既可以從中讀取也可以寫入,但是掉電后其中的數(shù)據(jù)會丟失。內存一般指的就是RAM。

ROM在嵌入式系統(tǒng)中一般用于存儲BootLoader以及操作系統(tǒng)或者程序代碼或者直接當硬盤使用。近年來閃存(Flash)已經(jīng)全面代替了ROM在嵌入式系統(tǒng)中的地位,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程的特性,而且斷電也不會丟失數(shù)據(jù),同時可以快速讀取數(shù)據(jù)。

兩類內存管理方式

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

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

連續(xù)內存管理:

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

非連續(xù)內存管理:

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

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

分區(qū)式內存管理

分區(qū)式內存管理分為固定分區(qū)和動態(tài)分區(qū)。

固定分區(qū):

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

動態(tài)分區(qū):

根據(jù)進程的實際需要,動態(tài)地給進程分配所需內存。

動態(tài)分區(qū)式內存管理

01、運作機制

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

02、數(shù)據(jù)結構

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

pYYBAGIB2s-AZy1DAAAWb1ntR1A194.png

03、內存分配算法

First Fit (首次適應算法)

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

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

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

Best Fit (最佳適應算法)

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

Worst Fit (最壞適應算法)

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

Two LevelSegregated Fit (TLSF)

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

poYBAGIB2tGAA4N9AACxrZnxVeM462.png

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

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

【25,25+8),

【25+8,25+16),

【25+16,25+24),

【25+24,25+32);

216這一類,以214分為4個小區(qū)間

【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這一類內存區(qū)間有空閑塊。對應的第二層bitmap為0100表示【25+16,25+24)這個區(qū)間有空閑塊,即下面的52Byte。

Buddysystems(伙伴算法)

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

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

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

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

b、在空閑分區(qū)大小為2i的空閑鏈表中查找。

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

d、如果2i的空閑分區(qū)已經(jīng)耗盡,則在分區(qū)大小為2i+1的空閑鏈表中查找。

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

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

g、如果2i+2的空閑分區(qū)也找不到,則繼續(xù)查找2i+3,以此類推。

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

pYYBAGIB2tOAEH4CAADeLjHl060116.png

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

wKgaomUD4BSAdimlAADQnNnRuNw451.png

來源:LiteOS物聯(lián)網(wǎng)操作系統(tǒng)
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯(lián)系小編進行處理

審核編輯 黃宇

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

    關注

    147

    文章

    18786

    瀏覽量

    392962
  • 算法
    +關注

    關注

    23

    文章

    4775

    瀏覽量

    97622
  • 內存
    +關注

    關注

    9

    文章

    3185

    瀏覽量

    76242
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內存系統(tǒng): Linux 內存分配算法

    內存管理算法:對討厭自己管理內存的人來說是天賜的禮物。1、內存碎片1) 基本原理· 產生原因:內存
    發(fā)表于 08-24 07:44

    靈動微課堂 (第134講) | 基于MM32 MCU的OS移植與應用——RT-Thread 內存管理

    分配,會考慮多線程間的互斥問題,所以不要在中斷服務例程中分配或釋放動態(tài)內存塊,因為它可能會引起當前上下文被掛起等待。針對靈動的MCU,較為適用小內存
    發(fā)表于 08-28 16:52

    STM32內存管理 精選資料分享

    內存管理詳解1、介紹內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是
    發(fā)表于 08-24 06:52

    如何在MCU上進行內存管理分配

    從事嵌入式產品開發(fā)已有十余年了,從最開始的8051一直用到現(xiàn)在流行的Cortex M系列的內核的單片機。從最開始用VC6.0開發(fā)PC端的軟件到現(xiàn)在使用Mircrosoft WPF框架進行PC端的軟件開發(fā)。發(fā)現(xiàn)現(xiàn)在的新人對MCU內存管理
    發(fā)表于 11-04 06:06

    如何使用嵌入式的內存分配管理技術

    嵌入式---內存分配管理嵌入式的內存一般都非常的小,最進在學習LWIP協(xié)議棧的移植,在正點原子的學習資料中找到了許多關于怎么移植協(xié)議棧的東西,其中使用到了
    發(fā)表于 12-17 06:41

    RT-Thread系統(tǒng)動態(tài)內存堆有哪幾種管理算法

    管理上,根據(jù)上層應用及系統(tǒng)資源的不同,有針對性地提供了不同的內存分配管理算法。內存管理根據(jù)具體
    發(fā)表于 03-31 13:53

    動態(tài)內存管理是什么?動態(tài)內存管理算法有哪幾種

    詳細描述動態(tài)內存堆接口動態(tài)內存管理是一個真實的堆內存管理模塊,可以在當前資源滿足的情況下,根據(jù)用戶 的需求
    發(fā)表于 08-29 15:23

    關于RTT支持的內存分配算法

    1.靜態(tài)內存管理。 2.針對小內存塊的分配管理(小內存管理
    發(fā)表于 04-27 14:40

    關于RTT支持的內存分配算法

    1.靜態(tài)內存管理。 2.針對小內存塊的分配管理(小內存管理
    發(fā)表于 04-27 14:42

    MCU內存分配

    MCU內存分配參考ram(即SRAM)和rom(即Flash)參考http://www.eeworld.com.cn/mcu/2014/1212/article_17648.htmlr
    發(fā)表于 10-25 11:51 ?7次下載
    <b class='flag-5'>MCU</b><b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    MCU內存分配管理

    從事嵌入式產品開發(fā)已有十余年了,從最開始的8051一直用到現(xiàn)在流行的Cortex M系列的內核的單片機。從最開始用VC6.0開發(fā)PC端的軟件到現(xiàn)在使用Mircrosoft WPF框架進行PC端的軟件開發(fā)。發(fā)現(xiàn)現(xiàn)在的新人對MCU內存管理
    發(fā)表于 11-01 16:24 ?10次下載
    <b class='flag-5'>MCU</b><b class='flag-5'>內存</b><b class='flag-5'>分配</b>與<b class='flag-5'>管理</b>

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

    本文主要介紹內存的基本概念以及操作系統(tǒng)的內存管理算法。內存的基本概念內存是計算機系統(tǒng)中除了處理器以外最重要的資源,用于存儲當前正在執(zhí)行的程序
    發(fā)表于 12-03 17:06 ?8次下載
    <b class='flag-5'>高效</b><b class='flag-5'>管理</b><b class='flag-5'>MCU</b><b class='flag-5'>內存</b>的6種<b class='flag-5'>分配</b><b class='flag-5'>算法</b><b class='flag-5'>對比</b>

    STM32內存管理

    內存管理詳解1、介紹內存管理,是指軟件運行時對計算機內存資源的分配和使用的技術。其最主要的目的是
    發(fā)表于 12-24 19:37 ?14次下載
    STM32<b class='flag-5'>內存</b><b class='flag-5'>管理</b>

    如何在MCU高效管理內存?

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

    Linux內核引導內存分配器的原理

    Linux內核引導內存分配器使用的是伙伴系統(tǒng)算法。這種算法是一種用于動態(tài)內存分配
    發(fā)表于 04-03 14:52 ?774次閱讀