從Python的源碼來(lái)解析Python下的freeblock
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)工作了。
如下圖所示:

相關(guān)文章
在pycharm中輸入import torch報(bào)錯(cuò)如何解決
這篇文章主要介紹了在pycharm中輸入import torch報(bào)錯(cuò)如何解決問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Python機(jī)器學(xué)習(xí)應(yīng)用之支持向量機(jī)的分類(lèi)預(yù)測(cè)篇
最近完成的一個(gè)項(xiàng)目用到了SVM,之前也一直有聽(tīng)說(shuō)支持向量機(jī),知道它是機(jī)器學(xué)習(xí)中一種非常厲害的算法。利用將近一個(gè)星期的時(shí)間學(xué)習(xí)了一下支持向量機(jī),把原理推了一遍,感覺(jué)支持向量機(jī)確實(shí)挺厲害的,這篇文章帶你了解它2022-01-01
詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型
這篇文章主要為大家介紹了詳解使用Pytorch Geometric實(shí)現(xiàn)GraphSAGE模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
python 實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)添加、查詢(xún)與更新的示例代碼
這篇文章主要介紹了python 實(shí)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)添加、查詢(xún)與更新的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
Django 自定義權(quán)限管理系統(tǒng)詳解(通過(guò)中間件認(rèn)證)
這篇文章主要介紹了Django 自定義權(quán)限管理系統(tǒng)詳解(通過(guò)中間件認(rèn)證),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

