2009年6月12日 星期五

OS心得系列 Memory Management

在ANSIC 中可以用 malloc() 和 free() 兩個函式動態地分配記憶體和釋放記憶體是大部分學習資工的人都知道的事情。但是,在嵌入式即時操作系統中,多次這樣做會把原來很大的一塊連續記憶體區域,逐漸地分割成許多非常小而且彼此又不相鄰的記憶體區域,也就是記憶體破碎(fragment)。由於這些碎片的大量存在,使得程式到後來連非常小的記憶體也分配不到。我們曾在前面的 Task Stack 提過,用 malloc() 函式來分配堆疊時,曾經討論過記憶體破碎的問題。另外,由於記憶體管理演算法的原因,malloc() 和 free() 函式執行時間是不確定的。

而在uC/OS-II 中,kernel 把連續的大塊記憶體按分區來管理。每個分區中包含有整數個大小相同的記憶體塊,如同圖 F7.1。利用這種機制,uC/OS-II 對 malloc() 和 free() 函式進行了改變,使得它們可以分配和釋放固定大小的記憶體塊。這樣一來,malloc() 和 free() 函式的執行時間也是固定的了。


如圖 F7.2,在一個系統中可以有多個記憶體分割區。這樣,使用者的應用程式就可以從不同的記憶體分割區中得到不同大小的記憶體塊。但是,特定的記憶體塊在釋放時必須重新放回它以前所屬於的記憶體分割區。顯然,採用這樣的記憶體管理演算法,上面的記憶體破碎問題就得到了解決。


沒有留言:

張貼留言