• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 从Python的源码来解析Python下的freeblock

从Python的源码来解析Python下的freeblock

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了python爬虫源码,python3 源码,python源码剖析,python项目源码,python源码剖析pdf等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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]
    ...
}

</div>

freeblock指向空闲的链表,为它赋值很好理解。但是为什么要加上代码1处那一句!
对C比较熟悉的童鞋很容易能看出它的作用,它在为*freeblock赋值为NULL。

但是为什么要这么做?
直到看到内存回收的代码:

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

</div>

回想一下SGI次级空间配置,它需要一个链表,指向block中可用的小块。因为这些快,是离散的,只有用指针才能索引它。
在SGI次级空间配置中,是用一个union,达到了节省空间的目的:有数据时,它存储着真正的数据;没有数据时,它就变成指向下一块可用内存的指针:

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

</div>

这样一想,问题就变得很明显了。freeblock指向一个链表,链表的next域就由它自己来索引。
在_PyObject_Free中,内存p是要被回收的,它应该插在freeblock的链表头,freeblock被更新指向它。同时,p指向原来freeblock指向的内容,这是一个很简单的链表插入操作。
这样在遍历的时候,我们就可以用freeblock = * freeblock的方式来工作了。
如下图所示:

2015511115319124.png (473×154)

</div>

您可能想查找下面的文章:

  • python 3.5下xadmin的使用及修复源码bug
  • 通过源码分析Python中的切片赋值
  • Python实现的异步代理爬虫及代理池
  • python制作爬虫爬取京东商品评论教程
  • python解决网站的反爬虫策略总结
  • python实现简单爬虫功能的示例
  • 总结python爬虫抓站的实用技巧
  • Python常用的爬虫技巧总结
  • python编写简单爬虫资料汇总
  • Python使用爬虫猜密码

相关文章

  • python 打印对象的所有属性值的方法
  • 复习Python中的字符串知识点
  • python三元运算符实现方法
  • python 数据加密代码
  • 详解Python中的循环语句的用法
  • Python中functools模块函数解析
  • python解析xml文件操作实例
  • Python中最常用的操作列表的几种方法归纳
  • Python设计模式中单例模式的实现及在Tornado中的应用
  • python通过apply使用元祖和列表调用函数实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Python的Asyncore异步Socket模块及实现端口转发的例子
    • Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
    • Python+Opencv识别两张相似图片
    • Python2.x版本中基本的中文编码问题解决
    • Python编程判断这天是这一年第几天的方法示例
    • python实现博客文章爬虫示例
    • python使用socket向客户端发送数据的方法
    • Python编程中的异常处理教程
    • 微信 用脚本查看是否被微信好友删除
    • 优化Python代码使其加快作用域内的查找

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有