最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從Python的源碼來(lái)解析Python下的freeblock

 更新時(shí)間:2015年05月11日 11:54:51   作者:oyjh1986  
這篇文章主要介紹了從Python的源碼來(lái)解析Python下的freeblock,包括內(nèi)存空間分配等知識(shí),需要的朋友可以參考下

1 引言

在python內(nèi)存管理中,有一個(gè)block的概念。它比較類(lèi)似于SGI次級(jí)空間配置器。
首先申請(qǐng)一塊大的空間(4KB),然后把它切割成一小份(8, 16 一直到512)。
當(dāng)有內(nèi)存申請(qǐng)的請(qǐng)求時(shí)候,簡(jiǎn)單的流程是:根據(jù)大小找到對(duì)應(yīng)的block,然后在freeblock 上給它一份。

2 問(wèn)題

整個(gè)過(guò)程是一種比較自然的slab分配方式。但當(dāng)我讀到這段代碼時(shí),卻感到疑惑:

static void* _PyObject_Malloc(void* ctx, size_t nbytes)
{
    ...
  pool->freeblock = (block*)pool + pool->nextoffset;

    pool->nextoffset += INDEX2SIZE(size);
    *(block **)(pool->freeblock) = NULL; // [1]
    ...
}

freeblock指向空閑的鏈表,為它賦值很好理解。但是為什么要加上代碼1處那一句!
對(duì)C比較熟悉的童鞋很容易能看出它的作用,它在為*freeblock賦值為NULL。

但是為什么要這么做?
直到看到內(nèi)存回收的代碼:

static void _PyObject_Free(void* ctx, void*p)
{
  ...
  *(block**)p = lastfree = pool->freeblock;
  pool->freeblock = (block*)p;
  ...
}

回想一下SGI次級(jí)空間配置,它需要一個(gè)鏈表,指向block中可用的小塊。因?yàn)檫@些快,是離散的,只有用指針才能索引它。
在SGI次級(jí)空間配置中,是用一個(gè)union,達(dá)到了節(jié)省空間的目的:有數(shù)據(jù)時(shí),它存儲(chǔ)著真正的數(shù)據(jù);沒(méi)有數(shù)據(jù)時(shí),它就變成指向下一塊可用內(nèi)存的指針:

union __Obj {
  union __Obj* free_list_link;
  char client_data[];
};

這樣一想,問(wèn)題就變得很明顯了。freeblock指向一個(gè)鏈表,鏈表的next域就由它自己來(lái)索引。
在_PyObject_Free中,內(nèi)存p是要被回收的,它應(yīng)該插在freeblock的鏈表頭,freeblock被更新指向它。同時(shí),p指向原來(lái)freeblock指向的內(nèi)容,這是一個(gè)很簡(jiǎn)單的鏈表插入操作。
這樣在遍歷的時(shí)候,我們就可以用freeblock = * freeblock的方式來(lái)工作了。
如下圖所示:

2015511115319124.png (473×154)

相關(guān)文章

最新評(píng)論

北海市| 巢湖市| 通州市| 荔波县| 天峨县| 平南县| 西华县| 白河县| 邻水| 凯里市| 保靖县| 天长市| 顺平县| 贡山| 富蕴县| 永州市| 白城市| 石家庄市| 辛集市| 自治县| 平湖市| 平凉市| 金乡县| 页游| 南江县| 五台县| 荆州市| 顺平县| 公安县| 皮山县| 广德县| 类乌齐县| 百色市| 延庆县| 九江市| 宕昌县| 西盟| 辽中县| 颍上县| 靖安县| 博白县|