欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1 引言

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

2 問題

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

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,達到了節(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)

相關(guān)文章

  • Python線程詳解

    Python線程詳解

    這篇文章主要介紹了Python線程詳解,本文詳細講解了線程方方面面的知識,如線程基礎(chǔ)知識線程狀態(tài)、線程同步(鎖)、線程通信(條件變量)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Python線程threading模塊用法詳解

    Python線程threading模塊用法詳解

    這篇文章主要介紹了Python線程threading模塊用法,結(jié)合實例形式總結(jié)分析了Python線程threading模塊基本功能、原理、相關(guān)函數(shù)使用方法與操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 提升Python編程效率的列表操作方法示例

    提升Python編程效率的列表操作方法示例

    這篇文章主要為大家介紹了提升Python編程效率的列表操作方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 解決pyecharts運行后產(chǎn)生的html文件用瀏覽器打開空白

    解決pyecharts運行后產(chǎn)生的html文件用瀏覽器打開空白

    這篇文章主要介紹了解決pyecharts運行后產(chǎn)生的html文件用瀏覽器打開空白,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 計算pytorch標準化(Normalize)所需要數(shù)據(jù)集的均值和方差實例

    計算pytorch標準化(Normalize)所需要數(shù)據(jù)集的均值和方差實例

    今天小編就為大家分享一篇計算pytorch標準化(Normalize)所需要數(shù)據(jù)集的均值和方差實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法

    Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法

    這篇文章主要介紹了Python實現(xiàn)給文件添加內(nèi)容及得到文件信息的方法,可實現(xiàn)從文件開頭添加內(nèi)容的功能,需要的朋友可以參考下
    2015-05-05
  • 基于Python的一個自動錄入表格的小程序

    基于Python的一個自動錄入表格的小程序

    這篇文章主要介紹了基于Python的一個自動錄入表格的小程序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python3.4編程實現(xiàn)簡單抓取爬蟲功能示例

    Python3.4編程實現(xiàn)簡單抓取爬蟲功能示例

    這篇文章主要介紹了Python3.4編程實現(xiàn)簡單抓取爬蟲功能,涉及Python3.4網(wǎng)頁抓取及正則解析相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • 基于python的opencv圖像處理實現(xiàn)對斑馬線的檢測示例

    基于python的opencv圖像處理實現(xiàn)對斑馬線的檢測示例

    這篇文章主要介紹了基于python的opencv圖像處理實現(xiàn)對斑馬線的檢測示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解查看Python解釋器路徑的兩種方式

    詳解查看Python解釋器路徑的兩種方式

    這篇文章主要介紹了詳解查看Python解釋器路徑的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論