亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python 源碼筆記 ---- freeblock

xuxueli / 2294人閱讀

摘要:首先申請(qǐng)一塊大的空間,然后把它切割成一小份,一直到。問(wèn)題整個(gè)過(guò)程是一種比較自然的分配方式。但當(dāng)我讀到這段代碼時(shí),卻感到疑惑指向空閑的鏈表,為它賦值很好理解。同時(shí),指向原來(lái)指向的內(nèi)容,這是一個(gè)很簡(jiǎn)單的鏈表插入操作。

1 引言

在python內(nèi)存管理中,有一個(gè)block的概念。它比較類似于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)工作了。
如下圖所示:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/37526.html

相關(guān)文章

  • 回歸本質(zhì)-Python源碼剖析學(xué)習(xí)筆記(0)

    1. python整體架構(gòu) showImg(https://segmentfault.com/img/bVbkSUT?w=857&h=481); 2. 源代碼文件組織 showImg(https://segmentfault.com/img/bVbkSYB?w=347&h=532); 3. 源碼編譯

    Code4App 評(píng)論0 收藏0
  • gevent 學(xué)習(xí)筆記 —— greenlet源碼剖析1

    摘要:不過(guò)不管怎樣,就當(dāng)多學(xué)習(xí)了一些其他知識(shí),況且分析源碼肯定少不了對(duì)這些知識(shí)的了解。官方文檔描述里面提到了,在這個(gè)模塊中指的就是,一般稱它為方法列表。返回一個(gè)指向它創(chuàng)建的模塊對(duì)象的指針。 showImg(http://young-py.github.io/imgs/yyzt3.jpg); 在greenlet篇中只是簡(jiǎn)單講述了一下greenlet原理,不知道有沒(méi)有人對(duì)源碼感興趣的,不過(guò)我還...

    lookSomeone 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<