8.1.1 Python 源码中的PyFrameObject
当然,对于Python 而言,PyFrameObject 对象不仅仅是一个我们在x86 机器上看到的那个简简单单的栈帧,它实际上包含了其他更多的信息。请看Python 源码中对PyFrame-Object 的定义:
[frameobject.h] |
从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 执行的某个时刻的运行时环境 |
| 回书目 上一节 下一节 |
|
||||
| · 无线路由器故障处理 · 解析35岁技术人的价值.. · 无线重中之重:安全问题 · 无线局域网基本知识 · 家庭无线局域网 · 华为七千人主动辞职规.. · 微软出价446亿美元收购.. · 虚拟化的“赤壁之战” |
· Windows Server 2008专.. · 802.11n:下一代的无线.. · 脉冲无线电uwb专题 · AIX操作系统管理应用 · 云计算时代来临 · 求职必杀技 决战面试官 · 龙芯要做中国的“奔腾” · 2008年上半年IT技术图.. |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · 无线网状网(MESH) · Windows远程桌面应用 · C#技术开发指南 |
· Apache技术专题 · Windows集群服务应用 · C#技术开发指南 · 文档格式标准开战 OOXM.. · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 解析35岁技术人的价值.. |
|||