1. 程式人生 > >嵌入式作業系統使用malloc申請記憶體的危險

嵌入式作業系統使用malloc申請記憶體的危險

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

在實際應用中,我們可以試著把連續的大塊記憶體按分割槽來管理。每個分割槽中包含整數個大小相同的記憶體塊。如圖所示:

    

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

    在一個作業系統中可以有多個記憶體分割槽,這樣,應用程式就可以從不同的記憶體分割槽中得到不同大小的記憶體塊。但是特定的記憶體塊在釋放時,必須重新回到它原本屬於的記憶體分割槽。顯然,採用這樣的記憶體管理演算法,記憶體碎片的問題也可以得以解決。(這種方法的記憶體管理可以理解為一個二維陣列,比如我們定義一個二維陣列為:u8 mpool[10][32]。對應的記憶體管理就是定義了10個記憶體塊,每塊大小是32位元組。如需其他大小的記憶體塊,還可以多定義幾個其他大小。)