编译原理7运行环境讲述.ppt

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 符号表 第6章 符号表 7.4.3、静态链和活动记录 静态链:指向本过程的直接外层过程的活动记录的起始地址,也称存取链。 动态链:指向本过程的调用过程的活动记录的起始地址,也称控制链。 program P; var a, x : integer; procedure Q(b: integer); var i: integer; procedure R(u: integer; var v: integer); var c, d: integer; begin if u=1 then R(u+1, v) ...... v:=(a+c)*(b-d); ...... end {R} begin ...... R(1,x); ...... end {Q} 主程序P 主程序P?过程 S 主程序P ?过程 S ?过程 Q 主程序P ?过程 S ?过程 Q ?过程 R 主程序P ?过程 S ?过程 Q ?过程 R ?过程 R 0 0 返回地址 1 0 2 a 3 x 4 0 5 返回地址 6 0 7 0(形参个数) 8 c 9 i 10 动态链 静态链 5 11 返回地址 12 0 13 1(形参个数) 14 b(形参) 15 i 16 11 17 返回地址 18 11 19 2(形参个数) 20 u(形参) 21 v(形参) 22 c 23 d 24 SP ? TOP? 0 0 返回地址 1 0 2 a 3 x 4 0 5 返回地址 6 0 7 0(形参个数) 8 c 9 i 10 动态链 静态链 5 11 返回地址 12 0 13 1(形参个数) 14 b(形参) 15 i 16 11 17 返回地址 18 11 19 2(形参个数) 20 u(形参) 21 v(形参) 22 c 23 d 24 17 25 返回地址 26 11 27 2(形参个数) 28 u(形参) 29 v(形参) 30 c 31 d 32 TOP? SP ? 7.5 堆式动态存储分配 如果一个程序语言提供用户自由地申请数据空间和退还数据空间的机制,或者不仅有过程而且有进程的程序结构,一般用堆式的动态存储分配方案。如C++中的new,delete,PASCAL的new,等机制 。 此时,空间的使用未必服从“先申请后释放,后申请先释放”的原则,那么栈式的动态分配方案就不适用了。通常使用一种称为堆式的动态存储分配方案。 这种分配方式的存储管理技术甚为复杂,我们这里举出这种分配方法必须考虑的几个问题。 堆式的动态存储分配策略: 当运行程序要求一块体积为N的空同时,我们应该分配哪一块给它呢? 理论上说,应从比N稍大一点的一个空闲块中取出N个单元,以便使大的空闲块派更大的用场。但这种做法较麻烦。 因此,常常仍采用“先碰上哪块比N大就从其中分出N个单元”的原则。但不论采用什么原则,整个大存区在一定时间之后必然会变成零碎不堪。 总有一个时候会出现异样的情形:运行程序要求一块体积为N的空间,但发现没有比N大的空闲块了,然而所有空闲块的总和却要比N大得多!出现这种情形时怎么办呢?这是一个比前面的问题难得多的问题。 解决办法似乎很简单,这就是,把所有空闲块连接在一起,形成一片可分配的连续空间。 这里主要问题是,我们必须调整运行程序对各占用块的全部引用点。 堆式的动态存储分配策略: 另外,如果运行程序要求一块体积为N的空间,但所有空闲块的总和也不够N,那又应怎么办呢? 有的管理系统采用一种叫做垃圾回收的办法来对付这种局面。即寻找那些运行程序业己无用但尚未释放在占用块,或者那些行程序目前很少使用的占用块,把这此占用块收回来,重新分配。 但是,我们如何知道哪些块运行时在使用或者目前很少使用呢?即便知道了,一经收回后运行程序在某个时候又要用它时又应该怎么办呢? 要使用垃圾回收技术,除了在语言上要有明确的具体限制外,还需要有特别的硬件措施,否则回收几乎不能实现。 堆式动态储分配的实现通常有如下两种途径: 1)定长块管理 堆式动态储分配最简单的实现是按定长块进行。初始化时,将堆存储空间分成长度相等的若干块,每块中指定一个链域,按照邻块的顺序把所有块链成一个链表,用指针available指向链表中的第一块。 分配时每次都分配指针available所指的块,然后available指向相邻的下一块。归还时,把所归还的块插入链表。考虑插入方便,可以把所归还的块插在available所指的块之前,然后available指向新归还的块。 占用 占用 占用 空闲 空闲 空闲 available (a) 占用 占用 空闲 空闲 空闲 (b) 空闲 available 图10.3 定长块管理 2)变长块管理 除了按定长块

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档