( thanks to Fancycrave.com )
這裡小弟要分享的是比較古老的知識, 各位看官有興趣就慢慢看吧
話說我的那些超強的同學們都升級去開發高階的手機作業系統, 例如Android, iOS 和 Windows Phone
用高階的語言來開發 , 例如 Java, Objective-C
用超好用的 IDE 系統, 例如 Eclipse,
小弟這裡還在開發嵌入式系統也就是Embedded System
用低階的語言來開發, 就是 C 語言啦
用陽春的 IDE 系統, 也就是 vi 和 UltraEdit (這根本就是文件編輯器, 怎麼能算 IDE 呢?)
相對於高階的作業系統開發者, 有著動輒上百M bytes 雄厚的的memory(記憶體)
我們這些Embedded System開發者 , 通常只有寥寥幾十 K bytes 可以用, 有時能夠破百開始偷笑了
所以要進來本單位的人猿員, 都要先有一個震撼教育, 這個教育的課程名稱叫做
"我們開發的是embedded system”
基本上就是灌輸本單位的人猿員, 一個觀念, 就是
"你很窮 (在記體體使用上面)"
在使用memory(記憶體)上面, 就是要 省! 省! 省!
根據本單位過去的統計, 嚴重的錯誤發生都是在memory(記憶體)使用不良
很少是在演算法上面出錯 (反正我們也寫不出甚麼了不起的演算法)
正確的使用memory(記憶體)
在消極的方面,可以讓錯誤變少容易維護,
在積極的方面, 可以更省電, 效能更好, 以提升軟體的價值.
接下來 (和之後幾篇) 就是在分享使用memory(記憶體)的相關觀念
Memory(記憶體)的種類
釋義&正名
有些人在提到memory(記憶體) 這個term 時, 會把 volatile 和 non-volatile memory 混在一起, non-volatile 通常指的是 NOR或是 NAND Flash 等可以永久儲存資料的裝置. Volatile 指的是 DRAM 或是 SDRAM 這些電池拔掉資料就不見的裝置.
底下所提到的 memory(記憶體) 如果沒有特別說明, 指的就是 volatile memory.
通常使用的Memory 分成三大類: Static, Stack and Heap
下面這段程式有一些典型的memory 使用方法
int g_number; //1
void find_name(int id) { //2
int index; //3
char *p;
p = (char *) xpi_os_malloc_b(MAX_NAME_SIZE); //4
/* do something */
}
//1 是 static memory, 典型的使用方法是 global variable,
//2和 //3 使用的是stack memory, 典型的使用方法是 local variable 和 parameter (傳入的參數)
//4 使用的是 heap memory, 典型使用的方法是呼叫 memory allocate interface.
底下是 memory 使用的示意圖
Static memory 是一開始就配置好了, 不到系統關機, 資料都會持續存在, 任何的 task 都可以讀寫static memory (只要知道變數的名稱或實際的位置).
Heap 是一大塊 memory 給所有的task 使用, 講白一點就是一個很大的 global variable, 利用 memory management 的技術達到 reuse 的能力, 任何 task 都可自行向heap 挖 一塊需要的 memory, 使用完畢之後歸還, 別的 task 可以重複使用同一塊記憶體.
Stack 是配置給 task 專屬的 memory, 用來儲存 local variable, function parameters 和 task context switch 時的 context frame(基本上就是CPU暫存器的資訊).. 不同的 task 基本上是不能讀寫對方的 stack 內容的(否則就會有大災難)..
大部分的人比較會搞不清楚的是在 stack 和 heap這個部份.
宣告在 function 內的 local 變數 //3 或是傳入的 parameters //2 用的都是 stack memory.
Pointer p 本身的儲存位置是在 stack 裡面, 但是指到的 memory 卻是存在 heap 裡面.
有了這些知識, 接下去我們就可以談, 如何避免各種 memory 的問題發生
沒有留言:
張貼留言