国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

從Python的源碼來解析Python下的freeblock

2020-02-23 01:10:58
字體:
供稿:網(wǎng)友

1 引言

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

2 問題

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

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處那一句!
對C比較熟悉的童鞋很容易能看出它的作用,它在為*freeblock賦值為NULL。

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

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

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

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

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

2015511115319124.png (473×154)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 罗山县| 枣庄市| 巴南区| 离岛区| 句容市| 杭锦后旗| 泗阳县| 且末县| 铁岭市| 滕州市| 临邑县| 南平市| 老河口市| 石棉县| 改则县| 防城港市| 宝鸡市| 峨山| 隆子县| 宁城县| 莎车县| 新宁县| 石城县| 灵山县| 台安县| 金寨县| 澎湖县| 克东县| 平潭县| 韶山市| 大悟县| 新密市| 玉山县| 永泰县| 新闻| 吴忠市| 阿拉善左旗| 云安县| 吉木萨尔县| 盐津县| 布拖县|