昨天看完了
cache_flush,有關(guān)
gc_malloc的內(nèi)容,就到此為止了。接下來,就是補(bǔ)看這一路上暫時(shí)略過的一些函數(shù),順便引出對malloc出來但是沒有建立依賴關(guān)系的內(nèi)存是如何管理的。
其實(shí)這一路過來,就忽略了兩個(gè)函數(shù):
map_id和
stack_push。有關(guān)map_id的作用已經(jīng)說過,仍打算繼續(xù)忽略下去。至于stack_push分別出現(xiàn)在了
gc_malloc和
gc_link中,在gc_link中作為解除內(nèi)存依賴關(guān)系的一個(gè)步驟,可以以后再看,而在gc_malloc中,是在沒有提供parent參數(shù)的時(shí)候的一個(gè)執(zhí)行分支,也就是新分配的內(nèi)存沒有建立依賴關(guān)系而進(jìn)行的另外一種管理,這種管理使得內(nèi)存可以被
gc_collect回收。
如果要看stack_push,就必須先看
gc_enter和
gc_leave,根據(jù)提供的說明,這兩個(gè)函數(shù)對必須在應(yīng)用程序的每個(gè)函數(shù)的開始和結(jié)束調(diào)用,也可以只是簡單的放置在main loop中,而不必填充到每一個(gè)函數(shù)里。光介紹概念還是太抽象,直接看代碼來得實(shí)惠。
1
void
2
gc_enter()
3

{
4
stack_expand();
5
E.stack.data[E.stack.top].number=E.stack.top-E.stack.current;
6
E.stack.current=E.stack.top++;
7
}
忘了說,這一塊內(nèi)容,其本質(zhì)都是對stack進(jìn)行操作,所以第4行,首先拓展stack的尺寸。stack_expand里面包含一個(gè)拓展策略,因?yàn)槲铱床欢筒唤榻B了,總之,其結(jié)果就是保證了stack總是有足夠的空間而很少越界。
第5、6行,看起來還是要配上云風(fēng)畫的圖可能更容易理解
/* stack data
+----------+
0 | level 0 | ----> level 0 / root ( node pack )
1 | level 1 | --+-> level 1 ( 1 node ref + node pack )
2 | node ref | <-bottom --+
3 | 2 (lv.2) |
4 | node ref | --+-> level 2 ( 3 node ref )
5 | node ref | |
6 | node ref | --+
7 | 4 (lv.3) | <-current
8 | node ref | --+-> level 3 ( 2 node ref )
9 | node ref | --+
10| nil | <-top
11| nil |
+----------+
*/
在top和current之間,保存的是在父函數(shù)中分配而沒有建立依賴關(guān)系的內(nèi)存的id。所以第5行,就是把父函數(shù)中分配的自由內(nèi)存的數(shù)量壓入堆棧。第6行則讓current指向這個(gè)位置。
結(jié)論也就是,相對當(dāng)前的函數(shù)而言:
1.current指向的數(shù)據(jù)是爺爺函數(shù)中分配的自由內(nèi)存的數(shù)量
2.top和current之間保存的是父函數(shù)中分配的自由內(nèi)存的id
通過調(diào)用gc_enter,堆棧調(diào)整為:current指向的數(shù)據(jù)保存著父函數(shù)中分配的自由內(nèi)存的數(shù)量,而現(xiàn)在top和current之間空無一物,用于存儲當(dāng)前函數(shù)將要分配的自由內(nèi)存id。
下面看看stack_push的代碼
1
static void
2
stack_push(int handle)
3

{
4
stack_expand();
5
E.stack.data[E.stack.top++].handle=handle;
6
}
參數(shù)handle就是新分配的內(nèi)存的id。代碼就2行,首先是拓展stack,然后就是把內(nèi)存id壓入堆棧,放在top和current之間。這也就解釋了上面的那個(gè)堆棧的布局結(jié)構(gòu)如何而來。
最后,貼一下stack的定義。因?yàn)榍皟蓚€(gè)函數(shù)都有些簡單,以至于忘記看數(shù)據(jù)結(jié)構(gòu)的定義了

union stack_node
{
int stack;
int number;
int handle;
};


struct stack
{
union stack_node *data;
int top;
int bottom;
int current;
};
stack即堆棧,內(nèi)部用一個(gè)數(shù)組實(shí)現(xiàn),即成員變量data。數(shù)組元素為stack_node。
由stack_node的定義可知,堆棧的一個(gè)元素可能表示3種用途:
1.stack,不知道
2.number,存儲父函數(shù),爺爺函數(shù)等等的函數(shù)中分配自由內(nèi)存的數(shù)量
3.handle,存儲某個(gè)函數(shù)分配出來的自由內(nèi)存的id
that is today
posted on 2008-09-17 21:02
LOGOS 閱讀(1551)
評論(0) 編輯 收藏 引用