嵌入式操作系統使用malloc申請內存的危險

    在ANSI C中,可以使用malloc()和free()這兩個函數動態分配內存和釋放內存,但是,在嵌入式操作系統中,調用malloc()和free()(不可重入函數)卻是很危險的(由於多任務,有可能在某個任務執行接口函數的過程中阻塞,然後新任務再調用接口函數),因爲多次調用這兩個函數會把原來很大的一塊連續內存逐漸分割成許多非常小而且彼此又不相鄰的內存塊,也就是內存碎片。由於這些內存碎片的大量存在,使得程序到後來連一段非常小的連續內存都分配不到。另外,由於內存管理算法上的原因,malloc()和free()函數的執行時間是不確定的。(申請內存時,查找合適的連續內存需要的時間不確定)

    在實際應用中,我們可以試着把連續的大塊內存按分區來管理。每個分區中包含整數個大小相同的內存塊。如圖所示:

    

利用這種機制,就可以得到和釋放固定大小的內存塊。這樣內存的申請和釋放函數的執行時間就是確定的了。

    在一個操作系統中可以有多個內存分區,這樣,應用程序就可以從不同的內存分區中得到不同大小的內存塊。但是特定的內存塊在釋放時,必須重新回到它原本屬於的內存分區。顯然,採用這樣的內存管理算法,內存碎片的問題也可以得以解決。(這種方法的內存管理可以理解爲一個二維數組,比如我們定義一個二維數組爲:u8 mpool[10][32]。對應的內存管理就是定義了10個內存塊,每塊大小是32字節。如需其他大小的內存塊,還可以多定義幾個其他大小。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章