频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

8.1.1 Python 源码中的PyFrameObject

作者: 陈儒著 出处:电子工业出版社  2008-07-23 15:46    砖    好    评论   进入论坛
阅读提示:《Python源码剖析--深度探索动态语言核心技术》第8章Python 虚拟机框架,从这一章开始,我们将切入Python 字节码虚拟机,深入剖析Python 字节码虚拟机的运行机理,本小节为大家介绍的是Python 源码中的PyFrameObject。

8.1.1 Python 源码中的PyFrameObject

当然,对于Python 而言,PyFrameObject 对象不仅仅是一个我们在x86 机器上看到的那个简简单单的栈帧,它实际上包含了其他更多的信息。请看Python 源码中对PyFrame-Object 的定义:

 [frameobject.h]
typedef struct _frame {
PyObject_VAR_HEAD
struct _frame *f_back; //执行环境链上的前一个frame
PyCodeObject *f_code; //PyCodeObject 对象
PyObject *f_builtins; //builtin 名字空间
PyObject *f_globals; //global 名字空间
PyObject *f_locals; //local 名字空间
PyObject **f_valuestack; //运行时栈的栈底位置
PyObject **f_stacktop; //运行时栈的栈顶位置
……
int f_lasti; //上一条字节码指令在f_code 中的偏移位置
int f_lineno; //当前字节码对应的源代码行
……
//动态内存,维护(局部变量+cell 对象集合+free
对象集合+运行时栈)所需要的空间
PyObject *f_localsplus[1];
} PyFrameObject;

从f_back 我们可以看出一点,在Python 实际的执行中,会产生很多PyFrameObject对象,而这些对象会被链接起来,形成一条执行环境链表。这正是对x86 机器上栈帧间关系的模拟。在x86 上,栈帧间通过esp 指针和ebp 指针建立了关系,使新的栈帧在结束之后能顺利回到旧的栈帧中,而Python 正是利用f_back 来完成这个动作。那真实的情况是不是这样呢,我们暂且按下不表。

在f_code 中存放的是一个待执行的PyCodeObject 对象,而接下来的f_builtins、f_globals、f_locals 是3 个独立的名字空间,在这里我们看到了名字空间和执行环境之间的关系。前面我们说名字空间实际上是维护着变量名和变量值之间关系的PyDictObject对象,所以,在这3 个PyDictObject 中,分别维护了builtin 的name、global 的name,以及local 的name 与对应值之间的映射关系。在下一节,我们将给出关于名字空间的详细解析,因为它对于理解Python 虚拟机的行为相当关键。想想前面的那段environment.py,在执行print i 时,首先会到f_locals 中去寻找PyStringObject 对象‘i’,找到了之后,将其对应的值取出,并打印出来。

在PyFrameObject 的开头,有一个PyObject_VAR_HEAD,这表明PyFrameObject 是一个变长的对象,即每次创建的PyFrameObject 对象的大小可能是不一样的。这些变动的内存是用来做什么的呢?实际上,每一个PyFrameObject 对象都维护了一个PyCode-Object 对象。这表明每一个PyFrameObject 对象和Python 源代码中的一段Code 都是对应的,更准确地说,是和我们在研究PyCodeObject 时提到的那个Code Block 对应的。而在编译一段Code Block 时,会计算出这段Code Block 执行过程中所需要的栈空间的大小(注意,这个栈空间才是和x86 机器上那个用于函数执行的栈空间相对应的概念)。这个栈空间的大小存储在f_stacksize 中,而栈本身正是那段变动的内存。因为不同的CodeBlock 在执行时所需的栈空间的大小是不同的,所以决定了PyFrameObject 的开头一定有一个PyObject_VAR_HEAD。

前面我们说PyFrameObject 对象是对x86 机器上单个栈帧的模拟。既然在x86 的单个栈帧中,包含了执行计算所必需的内存空间,为什么执行计算还需要内存空间呢?举个例子:在计算c=a+b 时,我们需要将a 和b 的值分别读入内存,然后计算的结果也需要存放在内存中,这些内存就是执行计算所必需的内存。当然,在x86 上,完成一条加法操作只需要CPU 中的寄存器即可,这里仅仅展示了在计算的过程中是需要消耗一定的内存的。所以作为对x86 栈帧的模拟,在PyFrameObject 中,也提供了对这些内存空间的模拟。在今后的描述中,我们将其称为运行时栈。注意,一定要将这里的“运行时栈”的概念和x86 平台上的“运行时栈”区分开来。我们这里所谓的“运行时栈”单指运算时所需要的内存空间。

与图8-1 所示的x86 平台上的运行时栈对应,图8-2 展示了Python 虚拟机在运行时某个时刻的完整运行时环境。

 
(点击查看大图)图8-2 Python 执行的某个时刻的运行时环境
虽然在图8-1 中连续的内存空间到图8-2 已经变成了分离的内存空间,但是对比图8-1和图8-2,我们仍然能够看出它们之间的相似之处。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
虚拟机软件入门
Python实用指南
Head First EJB(中文版)
Python源码剖析--深度探索动态语言核心技术
ActionScript 3.0权威指南
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
CCNA认证考试Pass必备
CCNA认证考试Pass必备
无线网络环境
无线网络环境
无线路由器故障处理
无线路由器故障处理
· 无线路由器故障处理
· 解析35岁技术人的价值..
· 无线重中之重:安全问题
· 无线局域网基本知识
· 家庭无线局域网
· 华为七千人主动辞职规..
· 微软出价446亿美元收购..
· 虚拟化的“赤壁之战”
· Windows Server 2008专..
· 802.11n:下一代的无线..
· 脉冲无线电uwb专题
· AIX操作系统管理应用
· 云计算时代来临
· 求职必杀技 决战面试官
· 龙芯要做中国的“奔腾”
· 2008年上半年IT技术图..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· 无线网状网(MESH)
· Windows远程桌面应用
· C#技术开发指南
· Apache技术专题
· Windows集群服务应用
· C#技术开发指南
· 文档格式标准开战 OOXM..
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· C#技术开发指南
· 三层交换技术专题
· Apache技术专题
· C#技术开发指南
· Windows远程桌面应用
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 解析35岁技术人的价值..