时间:2021-05-22
1 引言
在python内存管理中,有一个block的概念。它比较类似于SGI次级空间配置器。
首先申请一块大的空间(4KB),然后把它切割成一小份(8, 16 一直到512)。
当有内存申请的请求时候,简单的流程是:根据大小找到对应的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。
但是为什么要这么做?
直到看到内存回收的代码:
回想一下SGI次级空间配置,它需要一个链表,指向block中可用的小块。因为这些快,是离散的,只有用指针才能索引它。
在SGI次级空间配置中,是用一个union,达到了节省空间的目的:有数据时,它存储着真正的数据;没有数据时,它就变成指向下一块可用内存的指针:
这样一想,问题就变得很明显了。freeblock指向一个链表,链表的next域就由它自己来索引。
在_PyObject_Free中,内存p是要被回收的,它应该插在freeblock的链表头,freeblock被更新指向它。同时,p指向原来freeblock指向的内容,这是一个很简单的链表插入操作。
这样在遍历的时候,我们就可以用freeblock = * freeblock的方式来工作了。
如下图所示:
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
问题描述环境:CentOS6.5想在此环境下使用python3进行开发,但CentOS6.5默认的python环境是2.6.6版本。之前的做法是直接从源码安装p
下载源码wgethttps://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz解压源码tar-xvzfPyth
该代码用的是paramiko模块,python版本是python2.7下面上源码#-*-coding:utf-8-*-importparamikoimportt
前言BeautifulSoup是python的一个HTML或XML的解析库,我们可以用它来方便的从网页中提取数据,它拥有强大的API和多样的解析方式。Beaut
这里我不想采用诸如ubuntu下的apt-getinstall方式进行python的安装,而是在linux下采用源码包的方式进行python的安装。一、下载py