1. 程式人生 > >輕量級作業系統FreeRTOS的記憶體管理機制(二)

輕量級作業系統FreeRTOS的記憶體管理機制(二)

本文由嵌入式企鵝圈原創團隊成員朱衡德(Hunter_Zhu)供稿。

FreeRTOS多種記憶體管理機制中最簡單的一種:全域性宣告一個靜態陣列ucHeap,然後通過指標偏移記錄空間的分配情況,在這種記憶體機制下無法對記憶體進行釋放。同時也介紹了記憶體操作過程中位元組對齊的細節,本篇文章將會對FreeRTOS原始碼中第二種記憶體管理機制heap2.c進行講解,在heap2.c中同樣使用一個全域性靜態陣列ucHeap來表示記憶體,heap2.c記憶體管理機制較heap1.c而言增加了記憶體釋放的功能,通過使用連結串列對記憶體進行有效管理。

一、BlockLink_t結構體和連結串列

在hesp2.c中引入了一個重要結構體:


       BlockLink_t結構體用來描述一塊空閒空間的資訊,它放在空閒塊中的前面部分,xBlockSize表示空閒塊空間的大小,空間中供程式用的大小為:xBlockSize-sizeof(BlockLink_t)。


描述空閒塊資訊的所有BlockLink_t結構體根據xBlockSize按小到大連線成連結串列。在heap2.c中,這個連結串列的開頭和結尾節點分別是xStart和xEnd,初始化時heap2.c中的連結串列結構如下:


初始狀態下,連結串列中只有3個節點,xStart是連結串列的頭節點;第二個節點位於記憶體實際有效分配空間的前面部分,這個BlockLink_t結構體描述了實際有效分配空間的資訊,如這裡xBlockSize的值為configADJUSTED_HEAP_SIZE,即初始時整塊可用空間的大小;最後一個節點為xEnd,它的下一個節點指向NULL,xBlockSize值設定為configADJUSTED_HEAP_SIZE是因為連結串列是按xBlockSize大小進行排序的。

二、記憶體分配策略

heap2.c記憶體分配的整體思路是:空閒塊通過連結串列結構進行管理,當需要分配一塊記憶體時,遍歷連結串列(連結串列中的節點已經按空閒塊大小進行排序),找到第一塊夠大的空閒塊進行分配,從連結串列中移除出來,同時檢查這塊空間是否過大,如果過大就將空閒塊進行切割,然後將剩下部分重新用BlockLink_t描述並插入到連結串列中。

下圖是應用程式請求分配8個位元組空間後的連結串列和記憶體空間結構示意圖:


pvPortMalloc()核心程式碼:


三、記憶體回收機制

heap2.c記憶體回收的整理思路:根據應用程式提供的空間地址,基於這個地址加上sizeof(BlockLink_t)位元組偏移可以得到原來空閒塊的首地址,然後再將空閒塊的BlockLink_t結構體按小到大的順序插入到空閒塊連結串列中。

下面兩圖表示了程式釋放8位元組空間後的連結串列和記憶體空間結構示意圖:


下圖展示了經過多次記憶體分配和回收後的連結串列和記憶體空間結構示意圖:


vPortFree()核心程式碼:


可以看出,heap2.c雖然支援記憶體回收,但是回收記憶體時不進行相鄰空閒塊的合併,因此這種策略會導致記憶體碎片,系統執行久了會出現無法分配過大的連續空間的情況,heap4.c中記憶體管理機制就是為了彌補這種缺陷而誕生的,它在heap2.c的基礎上增加了連續空閒塊合併的功能,下一篇會繼續進行分析。

關注微信公眾號:嵌入式企鵝圈,獲得上百篇物聯網原創技術分享!

相關推薦

輕量級作業系統FreeRTOS記憶體管理機制

本文由嵌入式企鵝圈原創團隊成員朱衡德(Hunter_Zhu)供稿。FreeRTOS多種記憶體管理機制中最簡單的一種:全域性宣告一個靜態陣列ucHeap,然後通過指標偏移記錄空間的分配情況,在這種記憶體機

深入理解java虛擬機器之自動記憶體管理機制

垃圾收集演算法     java中的記憶體是交給虛擬機器管理的。要實現垃圾回收,必須考慮如下三個問題:     1. 哪些記憶體需要回收?     2. 什麼時候回收?     3. 怎麼回收?     對於第一點,往大了來說,是堆和方法區的記憶體需要回收。往具體了來說,是堆中哪些物件的記憶體可以回

【python測試開發棧】—python記憶體管理機制—垃圾回收

在上一篇文章中(python 記憶體管理機制—引用計數)中,我們介紹了python記憶體管理機制中的引用計數,python正是通過它來有效的管理記憶體。今天來介紹python的垃圾回收,其主要策略是引用計數為主,標記-清除和分代回收為輔助的策略(熟悉java的同學回回憶下,其實這和JVM的策略是有類似之處的)

輕量級作業系統FreeRTOS記憶體管理機制

 本文由嵌入式企鵝圈原創團隊成員朱衡德(Hunter_Zhu)近幾年來,FreeRTOS在嵌入式作業系統排行榜中一直位居前列,作為開源的嵌入式作業系統之一,它支援許多不同架構的處理器以及多種編譯工具鏈,

Android包管理機制PackageInstaller安裝APK

tac _id cas 賦值 complete get Owner 執行 context 前言 在本系列上一篇文章Android包管理機制(一)PackageInstaller的初始化中我們學習了PackageInstaller是如何初始化的,這一篇文章我們接著學習Pack

自動記憶體管理機制5- 虛擬機器效能監控

自動記憶體管理機制(5)- 虛擬機器效能監控 0. 概述 在我們日常開發的專案中,有時經常會碰到以下問題: OOM(OutOfMemoryError),記憶體不足 記憶體洩漏 執行緒死鎖 Lock Contention,鎖爭用 Java程序消耗CP

自動記憶體管理機制4- 記憶體分配和回收策略

自動記憶體管理機制(4)- 記憶體分配和回收策略 Java所承諾的自動記憶體管理主要是針對物件記憶體的回收和物件記憶體的分配。 在Java虛擬機器的五塊記憶體空間中,程式計數器、Java虛擬機器棧、本地方法棧記憶體的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的記憶體大小,

自動記憶體管理機制3-HotSpot垃圾收集器

自動記憶體管理機制(3)-HotSpot垃圾收集器 如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實現。 這裡討論的收集器都是JDK1.7(包含JDK1.7)以後的HotSpot虛擬機器: 上半部屬於新生代收集器,下半部屬於老年代收集器。如果兩個收集器

自動記憶體管理機制2- 記憶體回收和垃圾收集演算法

自動記憶體管理機制(2)- 記憶體回收和垃圾收集演算法 1. 概述 首先思考三個問題: 哪些記憶體需要回收 什麼時候回收 如何回收 程式計數器、虛擬機器棧、本地方法棧是執行緒私有的,因此這幾個區域的記憶體分配和回收都具有確定性(執行緒結束時執行垃圾回

自動記憶體管理機制1- java記憶體區域與虛擬機器物件

自動記憶體管理機制(1)- java記憶體區域與虛擬機器物件 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。有的區域隨著虛擬機器進行的啟動而存在,有些區域則以來使用者執行緒的啟動和結束而建立和銷燬。 有以下幾個區域

深入理解java虛擬機器之自動記憶體管理機制

  各類垃圾收集器與GC日誌 (一)垃圾收集器   一、Serial收集器     最基本、歷史最悠久的收集器。使用複製演算法,用在新生代,通常老年代用Serial old配合。GC過程需要stop the world。適用於client模式下的虛擬機器。   二、ParNew收集器  

深入理解java虛擬機器之自動記憶體管理機制

記憶體分配與回收策略 (一)記憶體分配策略     給誰分配?分配到哪?是記憶體分配策略必須解答的問題。     java物件是分配的物件,往大方向來說,是分配到堆中,更細一點說,根據物件不同的特點分配到新生代和老年代區域。如果啟動了本地執行緒分配緩衝,就按執行緒優先在TLAB上分配。     一、新

InnoDB日誌管理機制 – 運維派

一個BufferPool例項中的所有控制頭資訊連續儲存在一起,所以控制資訊儲存完成之後才是真正的緩衝頁面,下圖表示的是一個BufferPool例項的記憶體分佈情況。 對於BufferPool中的所有頁面,都有一個控制頭資訊與它對應,從上圖可以看出,每一個ctl都表示了一個屬於自己的page使用

java記憶體管理機制-執行時資料區

前言   本打算花一篇文章來聊聊JVM記憶體管理機制,結果發現越扯越多,於是分了三遍文章(文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8),本文為其中第一篇。from java記憶體管理機制(一)-執行時資料區    1、 java記憶體管理機制-執行時資料區

python深入之python記憶體管理機制重點

關於python的儲存問題 (1)由於python中萬物皆物件,所以python的儲存問題是物件的儲存問題,並且對於每個物件,python會分配一塊記憶體空間去儲存它 (2)對於整數和短小的字元等,python會執行快取機制,即將這些物件進行快取,不會為相同的物件分配多個

初窺Cocos2d-x記憶體管理機制1

Cocos2d-x版本:cocos2d-2.1rc0-x-2.1.3 windows下測試。 VS版本:VS2010. .在Cocos2d記憶體管理中使用的引用計數機制,每個物件都包含一個用來控制生命週期的引用計數器,它就是CCObject的成員變數m_uReference

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

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

iOS開發中的ARC記憶體管理機制1——基礎概念

由於移動裝置的記憶體資源一般比較少,所以垃圾回收機制的操作會對裝置的效能造成比較明顯的影響,有可能在執行垃圾回收的時候讓移動裝置出現卡頓,這對於使用者來說是很難受的事。 由此蘋果公司提出了ARC方案。 0x01 自動引用計數 自動引用計數(Automatic Ref

你必須瞭解的java記憶體管理機制-垃圾標記

本文在個人技術部落格不同步釋出,詳情可用力戳 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩... 相關連結(注:文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8) 1、 你必須瞭解的java記憶體管理機制-執行時資料區 2、 你必須瞭解的java記憶體管理機制-記

你必須瞭解的java記憶體管理機制-垃圾回收

本文在個人技術部落格不同步釋出,詳情可用力戳 亦可掃描螢幕右側二維碼關注個人公眾號,公眾號內有個人聯絡方式,等你來撩... 相關連結(注:文章講解JVM以Hotspot虛擬機器為例,jdk版本為1.8) 1、 你必須瞭解的java記憶體管理機制-執行時資料區 2、 你必須瞭解的java記憶體管理機制-記