




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章程序运行期间的存储空间组织.本节内容与要点运行时存储空间的划分活动记录概念存储空间分配策略
1、静态存储分配
2、动态存储分配
简单栈式存储分配
嵌套过程语言的栈式分配典型范例解析.运行时存储空间的划分编译程序为了使它编译后得到的目标程序能够运行,要从操作系统中获得一块存储空间。对这块提供运行的空间应该进行划分以便存放:生成的目标代码、数据对象和跟踪过程活动的控制栈。目标代码的大小在编译时可以确定,所以编译程序可以把它放在一个静态确定的区域。有一些数据对象的大小在编译时也能确定,因此它们也可以放在静态确定的区域。.运行时存储空间的划分(续)目标代码静态数据栈↓↑堆返回.活动记录为了管理过程在一次执行中所需要的信息,使用一个连续的存储块,这样的一个连续存储块称为活动记录(ActivationRecord)。当过程调用时,产生一个过程的新的活动,用一个活动记录表示该活动的相关信息,并将其压入栈。.当过程返回(活动结束)时,当前活动记录一般包含如下内容:连接数据返回地址动态链:指向调用该过程前的最新活动记录地址的指针。运行时,使运行栈上各数据区按动态建立的次序结成链。链头为栈顶起始位置。静态链:指向静态直接外层最新活动记录地址的指针,用来访问非局部数据。.形式单元:存放相应的实在参数的地址或值。局部数据区:局部变量、内情向量、临时工作单元(如存放对表达式求值的结果)。指针SP指向现行过程(即最新进入工作的那个过程)的活动记录在栈里的起始位置。.活动记录结构图临时单元内情向量局部变量形式单元静态链动态连返回地址TOPSP连接数据返回.存储分配策略静态分配策略在编译时对所有数据对象分配固定的存储单元,且在运行时始终保持不变。栈式动态分配策略在运行时把存储器作为一个栈进行管理,运行时,每当调用一个过程,它所需要的存储空间就动态地分配于栈顶,一旦退出,它所占空间就予以释放。堆式动态分配策略在运行时把存储器组织成堆结构,以便用户关于存储空间的申请与归还(回收),凡申请者从堆中分给一块,凡释放者退回给堆。返回.一、静态分配策略适用范围和特点:
1、程序语言不允许递归过程;2、不许含可变体积的数据项目或待定性质的名字;3、在编译时就能够确定一个程序在运行时所需的存贮空间大小,能够安排好目标程序运行的全部数据空间,并能确定每个数据项的单元地址。.适于静态存贮分配的语言必须满足以下条件:(1)数组的上下界必须是常数;(2)过程调用不允许递归;(3)不允许采用动态的数据结构(即在程序运行过程中申请和释放的数据结构)。.由于过程调用不允许递归,数据项的存贮地址就与过程相联系。过程调用所使用的局部数据区可以直接安排在过程的目标代码之后,并把各数据项的存贮地址填入相关的目标代码中,以便在过程运行时访问这个局部数据区。这里,不存在对存贮区的再利用问题。在执行目标程序时不必进行运行时的存贮空间管理,过程的进入和退出变得极为简单。.例:一个程序段的局部数据区返回返回.二、动态分配策略适用:程序语言允许递归过程和可变(体积的)数组,其程序数据空间的分配需采用某种动态策略(在程序运行时动态地进行分配)。栈式动态分配策略:目标程序可用一个栈作为动态的数据空间。运行时,每当进入一个过程或分程序,它所需的数据空间就动态地分配于栈顶,一旦退出,它所占用的空间就予以释放。堆式动态分配策略:如果程序语言允许用户动态地申请和释放存贮空间,而且申请和释放之间不一定遵守先请后放和后请先放的原则,此时就必须让运行程序持有一个大存贮区(称为堆),凡申请者从堆中分给一块,凡释放者退还给堆。返回.简单的栈式存贮分配适用于简单程序语言的实现:语言没有分程序结构,过程定义不允许嵌套,但允许过程的递归调用,允许过程含有可变数组。C语言就是这样一种语言。其局部名称的存储分配,可以直接采用栈式存储分配策略。
.1、栈式存储分配使用栈式存储分配法意味着把存储组成一个栈。运行时,每当进入一个过程(一个新的活动开始)时,就把它的活动记录压入栈,从而形成过程工作时的数据区,一个过程的活动记录的体积在编译时是可静态确定的。当该活动结束(过程退出)时,再把它的活动记录弹出栈,这样,它在栈顶上的数据区也随即不复存在。.C语言的程序结构
全局数据说明
Main(){Main中的数据说明
}voidR(){R中的数据说明
}voidR(){R中的数据说明
}.C语言程序的存储组织R的活动记录Q的活动记录Main的活动记录主程序全局数据区
TOPSPSP:总指向现行过程活动记录的起点,用于访问局部数据。TOP:始终指向(已占用)栈顶单元。.2、C的活动记录C的活动记录有以下四个项目。1、连接数据(两项):(1)老SP值,即前一活动记录的起始地址;(2)返回地址。2、参数个数。3、形式单元(存放实在参数的值或地址)。
4、过程的局部变量、数组内情向量和临时工作单元。.C过程的活动记录临时单元内情向量简单变量形式单元参数个数返回地址老SP012SPTOP.3.、过程的执行分为三步:
(1)过程调用(2)过程进入(3)过程返回.(1)过程调用---par相应的目标代码过程调用的四元式序列为:parT1parT2
…parTncallp,n每个parTi(i=1,2,…,n)可直接翻译成如下指令:(i+3)[TOP]:=Ti/*传递参数值*/或(i+3)[TOP]:=addr[Ti]/*传递参数地址*/.(1)过程调用---call相应的目标代码四元式callp,n翻译成:1[TOP]:=SP/*保护现行SP*/3[TOP]:=n/*传递参数个数*/JSRP/*转子指令,转向P过程的第一条指令*/…T2T1参数个数n现行SP值…调用过程P的活动记录01234TOP+3TOPSP.(2)过程进入转入过程P后,首先要做的工作是定义新活动记录的SP,保护返回地址和定义新活动记录的TOP值,即执行下述指令:SP:=TOP+1/*定义新SP*/1[SP]:=返回地址/*保护返回地*/TOP:=TOP+L;/*定义新TOP*/L是过程P的活动记录所需的单元数,这个数在编译时可静态地计算出来(活动记录的体积在编译时可静态地确定)。.对每个数组说明,相应的目标指令组将做以下几件工作:①计算各维的上、下限;②调用数组空间分配子程序,其参数是各维的上、下限和内情向量单元首地址。数组空间分配子程序计算并填好内情向量的所有信息,然后在TOP所指的位置之上留出数组所需的空间,并将TOP调整为指向数组区的顶端。此后,在过程段执行语句的工作过程中,凡引用形式参数、局部变量或数组元素都是以SP为基址进行相对访问的。.进入过程P后所做工作示意P的数组区返回地址SPTOP调用过程P的活动记录(长度为L)01.(3)过程返回C语言以及其它一些相似的语言含有return(E)的返回语句,E为表达式。假定E值已计算出来并已存放在某临时单元T中,可将T只传送到某个特定寄存器(调用过程将从这个特定的寄存器中获得P的结果)。剩下的工作就是恢复SP和TOP为进入过程P之前的原值(即指向工作空间),并按返回地址实行无条件转移。.过程P返回示意即执行下述指令序列:TOP:=SP-1/*恢复调用过程的TOP值*/SP:=0[SP]/*恢复调用过程的SP值*/X:=2[TOP]/*将返回地址送X*/UJ0[X]/*无条件转移,按X地址返回*/…返回地址老SP调用过程空间P空间SPTOP返回.嵌套过程语言的栈式分配由于过程定义是嵌套的,一个过程可以引用包围它的任一外层过程所定义的变量或数组,运行时,一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据(这些数据视为过程Q的非局部量)。.非局部名字的访问的实现为了在活动记录中查找非局部名字所对应的存储空间,过程Q运行时必须知道它的所有外层过程的最新活动记录的地址。由于允许递归性,过程的活动记录的位置(即使是相对位置)也往往是变迁的。因此,必须设法跟踪每个外层过程的最新活动记录的位置。跟踪的办法很多,本节讨论两种方法:一种是通过静态链;另一种是通过显示表(display,)。.一、静态链和活动记录引入一个称为静态链的指针,该指针为活动记录的一个域,指向直接外层的最新活动记录的地址。这就意味着在运行时栈上的数据区(活动记录)之间又拉出一条链,这个链称为静态链,静态链是从一个过程的当前活动记录指向其直接外层的最新活动记录。.具有静态链的活动记录结构临时单元内情向量简单变量形式参数形参个数存取链(静态链)返回地址控制链(动态链):老SPSPTOP.假定过程的嵌套关系如下:
P;vara;Q(b);vari;R;varc,d;…callR;…S;varc,I;…callQ;……callS;….过程调用试运行栈的变化.i形式参数:c形参个数:1静态链:0返回地址老SPic形参个数:0静态链:0返回地址老SP:0a形参个数:0静态链:0返回地址0SPTOPS过程P过程Q过程.例:请见书上P258页嵌套程序。写出递归调用时活动记录的变化。(程序见下页)..返回.二、嵌套层次显示表(display)和活动记录为了提高访问非局部量的速度,还可以引用一个指针数组,称为嵌套层次显示表。每进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次表display.假定现进入的过程的层数为i,则它的display表含有i+1个单元。此表本身是一个小找,自顶向下每个单元依次存放着现行层,直接外层,…,直至最外层(0层,主程序层)等每一层过程的最新活动记录的基地址。.例如,令过程R的外层为Q,Q的外层为P,则过程R运行时display表的内容应为:R的现行活动记录始址(SP的现行值)Q的最新活动记录地址P的活动记录地址012.由于过程的层数可以静态确定,因此每个过程的display表的体积在编译时即可知道。由一个非局部量说明所在的静态层数和相对活动记录的相对地址,就可得到绝对地址:绝对地址=display[静态层数」+相对地址.活动记录结构临时变量内情变量简单变量display形式单元参数个数全局display地址返回地址老SP0123dSPTOPd个单元第k层sp…最外层过程sp主程序spd+01k.由于每个过程的形式单元的数目在编译时是知道的,因此DISPLAY的相对地址d(相对于活动记录起点)在编译时也是完全确定的。被调用过程为了建立自己的DISPLAY,则必须知道它的直接外层过程的DISPLAY,这意味着必须把直接外层的DISPLAY地址作为连接数据之一(称为“全局DISPLAY地址”)传送给被调用过程。于是连接数据变为包含三项:①老SP值,②返回地址,③全局DISPLAY地址。注意:0层过程(主程序)的DISPLAY只含一项,这一项就是在主程序开始工作时建立的第一个SP值。.2.过程调用、进入和返回(1)过程调用。过程调用所做工作与简单栈式存贮分配大体相同,只是现在增加了一个连接数据,所以每个parTi相应的指令应改为:(i+4)[TOP]:=Ti;或者(i+4)[TOP]:=addr[T;]
callp,n所对应的指令应为:1[TOP]:=SP;/*保护现行SP*/3[TOP]:=SP+d;/*将直接外层的DISPLAY始址作为P的全局DISPLAY地址*/4[TOP]:=n:/*传递参数个数*lJSRP/*转向P的第一条指令*/.(2)过程进入。在转入过程P后,首先执行和简单栈式存贮分配相同的指令:SP:=TOP+1/*定义新的SP*/1[SP]:=返回地址/*保护返回地址*/TOP:=TOP+L;/*定义新的TOP*/其次,应按第三项连接数据所提供的全局DISPLAY地址,自底而上地抄录i个单元内容(i为P的层次),然后再添上新的SP值而形成现行过程P的DISPLAY(共i+1个单元)。.(3)过程返回。当过程P工作完毕要返回到调用段时,若return语句含有返回值或P是个函数过程,则把己算好的值传送到某个特定的寄存器,然后执行:TOP:=SP-1/*恢复调用过程的TOP值*/SP:=O[SP]/*恢复调用过程的SP值*/X:=2[TOP]/*将返回地址送X*/UJ0[X]/*无条件转移,返回*/过程返回执行的指令与简单栈式存贮分配的过程返回完全一样。.参数个数:n全局display地址调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 13《花钟》第二课时(教学设计)-2023-2024学年统编版语文三年级下册
- 企业物业管家半年工作总结
- 第1课《计算机网络》教学设计 2023-2024学年浙教版(2023)初中信息技术七年级上册
- 2025年多方合作合同协议
- 23《月迹》教学设计2024-2025学年统编版语文五年级上册
- 2025年上海市家庭居室装饰装修施工合同
- 《2025居间合同签订注意事项》
- 2025上海本地房屋租赁合同
- 2025个体劳动力的承包合同
- 22《读不完的大书》第二课时教学设计-2024-2025学年三年级上册语文统编版
- 电力项目劳务施工安全方案
- 2024年中职高考数学计算训练 专题10 解三角形的相关计算
- 跨学科主题学习的设计
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 幼儿园大班社会公开课《生活中的标志》课件
- 电石(碳化钙)安全技术说明书
- 四川省会计师事务所服务收费标准
- 中国品牌授权行业发展环境、市场运行态势及投资前景分析预测报告
- 第6课《北宋的政治》省公开课一等奖全国示范课微课金奖课件
- (正式版)FZ∕T 63001-2024 缝纫线用涤纶本色纱线
- 【人教版】《劳动教育》六下 劳动项目九《捐赠旧衣服》教学设计
评论
0/150
提交评论