對malloc和free的思考
阿新 • • 發佈:2020-10-08
程序的記憶體佈局:
Heap的頂端的限制叫做program break,通過系統呼叫brk活著sbrk可以想核心申請記憶體從而改變break,也就是增加或收縮heap的大小。
程序的地址空間所面對的都是虛擬地址,kernel為每個程序維護一個page table,建立了虛擬地址空間的頁和實體記憶體頁或swap空間的對映(虛擬記憶體或實體記憶體都是以頁為單位)。
很重要的一個特點是,虛擬地址空間是連續的!
虛擬記憶體管理有很多好處:1、程序相互之間或程序與核心之間相互隔離,程序不能操作其他程序的記憶體空間,更不能操作核心的空間。2、多個程序可以共享記憶體。 (多個程序執行相同的程式,也就是多個程序的text segment所對應的實體記憶體是同一份),節約記憶體。3、程序維護的頁表可以更容易的實現記憶體保護。(標記page table的entry即可)
虛擬記憶體這塊讓我想到了,“軟體的很多問題都可以靠加一箇中間層解決”;o(∩_∩)o 哈哈
下面是一個簡單的malloc和free實現,通過系統呼叫sbrk來實現: 實現細節: 1、在需要的記憶體塊前面追加一小塊空間,來儲存當前塊的大小(貌似都這樣) 2、維護兩個全域性變數,managed_memory_start、所維護記憶體的起始地址 last_valid_address、所維護記憶體的最後有效地址,也就是program break 3、free的實現很簡單,標記此塊為未用
前面,後面最重要的文字總結,都是我自己寫的,哈哈~~~
Heap的頂端的限制叫做program break,通過系統呼叫brk活著sbrk可以想核心申請記憶體從而改變break,也就是增加或收縮heap的大小。
程序的地址空間所面對的都是虛擬地址,kernel為每個程序維護一個page table,建立了虛擬地址空間的頁和實體記憶體頁或swap空間的對映(虛擬記憶體或實體記憶體都是以頁為單位)。
很重要的一個特點是,虛擬地址空間是連續的!
虛擬記憶體管理有很多好處:1、程序相互之間或程序與核心之間相互隔離,程序不能操作其他程序的記憶體空間,更不能操作核心的空間。2、多個程序可以共享記憶體。 (多個程序執行相同的程式,也就是多個程序的text segment所對應的實體記憶體是同一份),節約記憶體。3、程序維護的頁表可以更容易的實現記憶體保護。(標記page table的entry即可)
下面是一個簡單的malloc和free實現,通過系統呼叫sbrk來實現: 實現細節: 1、在需要的記憶體塊前面追加一小塊空間,來儲存當前塊的大小(貌似都這樣) 2、維護兩個全域性變數,managed_memory_start、所維護記憶體的起始地址 last_valid_address、所維護記憶體的最後有效地址,也就是program break 3、free的實現很簡單,標記此塊為未用
4、malloc實現,遍歷所維護的記憶體塊,找到合適的就返回,找不到就要求系統分配所要求大小的記憶體。
參考這篇文章: http://www.ibm.com/developerworks/cn/linux/l-memory/index.html
轉載於:https://my.oschina.net/astute/blog/91983