第六章 运行时存储空间的组织和管理.ppt
《第六章 运行时存储空间的组织和管理.ppt》由会员分享,可在线阅读,更多相关《第六章 运行时存储空间的组织和管理.ppt(150页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章运行时存储空间的组织和管理,术语过程的活动过程的一次执行称为过程的一次活动活动记录过程的活动需要可执行代码和存放所需信息的存储空间,后者称为活动记录本章内容讨论一个活动记录中的数据布局程序执行过程中,所有活动记录的组织方式,第六章运行时存储空间的组织和管理,影响存储分配策略的语言特征过程能否递归当控制从过程的活动返回时,局部变量的值是否要保留过程能否访问非局部变量过程调用的参数传递方式过程能否作为参数被传递过程能否作为结果值传递存储块能否在程序控制下动态地分配存储块是否必须显式地释放,6.1局部存储分配,6.1.1过程语言概念:过程定义、过程调用、形式参数、实在参数、活动的生存期,6.1
2、局部存储分配,6.1.2名字的作用域和绑定1、名字的作用域一个声明起作用的程序部分称为该声明的作用域即使一个名字在程序中只声明一次,该名字在程序运行时也可能表示不同的数据对象,6.1局部存储分配,2、环境和状态环境把名字映射到左值,而状态把左值映射到右值(即名字到值有两步映射)赋值改变状态,但不改变环境过程调用改变环境如果环境将名字x映射到存储单元s,则说x被绑定到s,6.1局部存储分配,3、静态概念和动态概念的对应,6.1局部存储分配,3、静态概念和动态概念的对应,6.1局部存储分配,3、静态概念和动态概念的对应,6.1局部存储分配,6.1.3活动记录活动记录的常见布局,6.1局部存储分配,
3、6.1.4局部数据的布局字节是可编址内存的最小单位变量所需的存储空间可以根据其类型而静态确定一个过程所声明的局部变量,按这些变量声明时出现的次序,在局部数据域中依次分配空间局部数据的地址可以用相对于活动记录中某个位置的地址来表示数据对象的存储布局还有一个对齐问题,6.1局部存储分配,例在SPARC/Solaris工作站上下面两个结构体的size分别是24和16,为什么不一样?typedefstruct_atypedefstruct_bcharc1;charc1;longi;charc2;charc2;longi;doublef;doublef;a;b;对齐:char:1,long:4,doub
4、le:8,6.1局部存储分配,例在SPARC/Solaris工作站上下面两个结构体的size分别是24和16,为什么不一样?typedefstruct_atypedefstruct_bcharc1;0charc1;0longi;4charc2;1charc2;8longi;4doublef;16doublef;8a;b;对齐:char:1,long:4,double:8,6.1局部存储分配,例在X86/Linux机器的结果和SPARC/Solaris工作站不一样,是20和16。typedefstruct_atypedefstruct_bcharc1;0charc1;0longi;4charc2
5、;1charc2;8longi;4doublef;12doublef;8a;b;对齐:char:1,long:4,double:4,6.1局部存储分配,6.1.5程序块本身含有局部变量声明的语句可以嵌套最接近的嵌套作用域规则并列程序块不会同时活跃并列程序块的变量可以重叠分配,6.1局部存储分配,main()/例/beginofB0/inta=0;intb=0;/beginofB1/intb=1;/beginofB2/inta=2;/endofB2/beginofB3/intb=3;/endofB3/endofB1/endofB0/,6.1局部存储分配,main()/例/beginofB0/in
6、ta=0;intb=0;/beginofB1/intb=1;/beginofB2/inta=2;/endofB2/beginofB3/intb=3;/endofB3/endofB1/endofB0/,6.2全局栈式存储分配,本节介绍介绍程序运行时所需的各个活动记录在存储空间的分配策略描述过程的目标代码怎样访问绑定到局部名字的存储单元介绍三种分配策略静态分配策略栈式分配策略堆式分配策略,6.2全局栈式存储分配,6.2.1运行时内存的划分,6.2全局栈式存储分配,1、静态分配名字在程序被编译时绑定到存储单元,不需要运行时的任何支持绑定的生存期是程序的整个运行期间,6.2全局栈式存储分配,2、静态分
7、配给语言带来限制递归过程不被允许数据对象的长度和它在内存中位置的限制,必须是在编译时可以知道的数据结构不能动态建立,6.2全局栈式存储分配,例C程序的外部变量、静态局部变量以及程序中出现的常量都可以静态分配声明在函数外面外部变量-静态分配静态外部变量-静态分配声明在函数里面静态局部变量-也是静态分配自动变量-不能静态分配,6.2全局栈式存储分配,6.2.2活动树和运行栈1、活动树用树来描绘控制进入和离开活动的方式,6.2全局栈式存储分配,活动树的特点每个结点代表某过程的一个活动根结点代表主程序的活动结点a是结点b的父结点,当且仅当控制流从a的活动进入b的活动结点a处于结点b的左边,当且仅当a的
8、生存期先于b的生存期,6.2全局栈式存储分配,当前活跃着的过程活动可以保存在一个栈中例控制栈的内容:m,q(1,9),q(1,3),q(2,3),6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),main,函数调用关系树,6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),函数调用关系树,6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录
9、),函数调用关系树,6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),函数调用关系树,6.2全局栈式存储分配,2、运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),函数调用关系树,6.2全局栈式存储分配,6.2.3调用序列过程调用和过程返回都需要执行一些代码来管理活动记录栈,保存或恢复机器状态等过程调用序列过程调用时执行的分配活动记录,把信息填入它的域中,使被调用过程可以开始执行的代码过程返回序列被调用过程返回时执行的恢复机器状态,释放被调用过程活动记录,使调用过程能够继续执行的代码调用序列和返回序列常常都分成两部
10、分,分处于调用过程和被调用过程中,6.2全局栈式存储分配,即使是同一种语言,过程调用序列、返回序列和活动记录中各域的排放次序,也会因实现而异设计这些序列和活动记录的一些原则以活动记录中间的某个位置作为基地址长度能较早确定的域放在活动记录的中间,6.2全局栈式存储分配,即使是同一种语言,过程调用序列、返回序列和活动记录中各域的排放次序,也会因实现而异设计这些序列和活动记录的一些原则一般把临时数据域放在局部数据域的后面把参数域和可能有的返回值域放在紧靠调用者活动记录的地方,6.2全局栈式存储分配,即使是同一种语言,过程调用序列、返回序列和活动记录中各域的排放次序,也会因实现而异设计这些序列和活动记
11、录的一些原则用同样的代码来执行各个活动的保存和恢复,6.2全局栈式存储分配,1、过程p调用过程q的调用序列,6.2全局栈式存储分配,1、过程p调用过程q的调用序列,(1)p计算实参,依次放入栈顶,并在栈顶留出放返回值的空间。top_sp的值在此过程中被改变,6.2全局栈式存储分配,1、过程p调用过程q的调用序列,(2)p把返回地址和当前base_sp的值存入q的活动记录中,建立q的访问链,增加base_sp的值,6.2全局栈式存储分配,1、过程p调用过程q的调用序列,(3)q保存寄存器的值和其它机器状态信息,6.2全局栈式存储分配,1、过程p调用过程q的调用序列,(4)q根据局部数据域和临时数
12、据域的大小增加top_sp的值,初始化它的局部数据,并开始执行过程体,6.2全局栈式存储分配,调用者p和被调用者q之间的任务划分,6.2全局栈式存储分配,2、过程p调用过程q的返回序列,6.2全局栈式存储分配,2、过程p调用过程q的返回序列,(1)q把返回值置入邻近p的活动记录的地方参数个数可变场合难以确定存放返回值的位置,因此通常用寄存器传递返回值,6.2全局栈式存储分配,2、过程p调用过程q的返回序列,(2)q对应调用序列的步骤(4),减小top_sp的值,6.2全局栈式存储分配,2、过程p调用过程q的返回序列,(3)q恢复寄存器(包括base_sp)和机器状态,返回p,6.2全局栈式存储
13、分配,2、过程p调用过程q的返回序列,(4)p根据参数个数与类型和返回值类型调整top_sp,然后取出返回值,6.2全局栈式存储分配,3、过程的参数个数可变的情况,(1)函数返回值改成用寄存器传递,6.2全局栈式存储分配,3、过程的参数个数可变的情况,(2)编译器产生将实参表达式逆序计算并将结果进栈的代码自上而下依次是参数1,参数n,6.2全局栈式存储分配,3、过程的参数个数可变的情况,(3)被调用函数能准确地知道第一个参数的位置,6.2全局栈式存储分配,3、过程的参数个数可变的情况,(4)被调用函数根据第一个参数到栈中取第二、第三个参数等等,6.2全局栈式存储分配,3、过程的参数个数可变的情
14、况,C语言的printf函数就是按此方式,用C语言编写的,下面语句的输出?printf(“%d,%d,%dn”);,6.2全局栈式存储分配,6.2.4栈上可变长数据活动记录的长度在编译时不能确定的情况例:局部数组的大小要等到过程激活时才能确定备注:Java语言的实现是将它们分配在堆上,6.2全局栈式存储分配,访问动态分配的数组,(1)编译时,在活动记录中为这样的数组分配存放数组指针的单元,6.2全局栈式存储分配,访问动态分配的数组,(2)运行时,这些指针指向分配在栈顶的数组存储空间,6.2全局栈式存储分配,访问动态分配的数组,(3)运行时,对数组A和B的访问都要通过相应指针来间接访问,6.2全
15、局栈式存储分配,访问动态分配的数组,6.2全局栈式存储分配,6.2.5悬空引用悬空引用:引用某个已被释放的存储单元,6.2全局栈式存储分配,6.2.5悬空引用悬空引用:引用某个已被释放的存储单元例:main中引用p指向的对象main()|intdangle()intq;|intj=20;q=dangle();|return|,6.3非局部名字的访问,本节介绍无过程嵌套的静态作用域(C语言)有过程嵌套的静态作用域(Pascal语言)动态作用域(Lisp语言),6.3非局部名字的访问,6.3.1无过程嵌套的静态作用域过程体中的非局部引用可以直接使用静态确定的地址(非局部数据此时就是全局数据)局部变
16、量在栈顶的活动记录中,可以通过base_sp指针来访问无须深入栈中取数据,无须访问链过程可以作为参数来传递,也可以作为结果来返回,6.3非局部名字的访问,6.3.2有过程嵌套的静态作用域sortreadarrayexchangequicksortpartition,6.3非局部名字的访问,6.3.2有过程嵌套的静态作用域过程嵌套深度sort1readarray2exchange2quicksort2partition3变量的嵌套深度:它的声明所在过程的嵌套深度作为该名字的嵌套深度,访问链用来寻找非局部名字的存储单元,6.3非局部名字的访问,6.3非局部名字的访问,访问非局部名字的存储单元假定过
17、程p的嵌套深度为np,它引用嵌套深度为na的变量a,nanp,如何访问a的存储单元sort1readarray2exchange2quicksort2partition3,6.3非局部名字的访问,访问非局部名字的存储单元假定过程p的嵌套深度为np,它引用嵌套深度为na的变量a,nanp,如何访问a的存储单元从栈顶的活动记录开始,追踪访问链npna次到达a的声明所在过程的活动记录访问链的追踪用间接操作就可完成sort1readarray2exchange2quicksort2partition3,访问非局部名字的存储单元,sortreadarrayexchangequicksortpartiti
18、on,6.3非局部名字的访问,6.3非局部名字的访问,过程p对变量a访问时,a的地址由下面的二元组表示:(npna,a在活动记录中的偏移),6.3非局部名字的访问,建立访问链假定嵌套深度为np的过程p调用嵌套深度为nx的过程x(1)npnx的情况sort1readarray2exchange2quicksort2partition3,这时x肯定就声明在p中,6.3非局部名字的访问,建立访问链假定嵌套深度为np的过程p调用嵌套深度为nx的过程x(1)npnx的情况被调用过程的访问链必须指向调用过程的活动记录的访问链,访问非局部名字的存储单元,sortreadarrayexchangequicks
19、ortpartition,6.3非局部名字的访问,6.3非局部名字的访问,建立访问链假定嵌套深度为np的过程p调用嵌套深度为nx的过程x(2)npnx的情况sort1readarray2exchange2quicksort2partition3,这时p和x的嵌套深度分别为1,2,nx1的外围过程肯定相同,6.3非局部名字的访问,建立访问链假定嵌套深度为np的过程p调用嵌套深度为nx的过程x(2)npnx的情况追踪访问链npnx+1次,到达了静态包围x和p的且离它们最近的那个过程的最新活动记录所到达的活动记录就是x的活动记录中的访问链应该指向的那个活动记录,访问非局部名字的存储单元,sortre
20、adarrayexchangequicksortpartition,6.3非局部名字的访问,6.3非局部名字的访问,programparam(input,output);(过程作为参数)procedureb(functionh(n:integer):integer);beginwriteln(h(2)endb;procedurec;varm:integer;functionf(n:integer):integer;beginf:=m+nendf;beginm:=0;b(f)endc;begincend.,函数f作为参数传递时,怎样在f被激活时建立它的访问链,6.3非局部名字的访问,progra
21、mparam(input,output);(过程作为参数)procedureb(functionh(beginwriteln(h(2)end;procedurec;varm:integer;functionf(n:integer)beginf:=m+nendf;beginm:=0;b(f)endc;begincend.,从b的访问链难以建立f的访问链,6.3非局部名字的访问,programparam(input,output);(过程作为参数)procedureb(functionh(beginwriteln(h(2)end;procedurec;varm:integer;functionf(
22、n:integer)beginf:=m+nendf;beginm:=0;b(f)endc;begincend.,f作为参数传递时,它的起始地址连同它的访问链一起传递,6.3非局部名字的访问,programparam(input,output);(过程作为参数)procedureb(functionh(beginwriteln(h(2)end;procedurec;varm:integer;functionf(n:integer)beginf:=m+nendf;beginm:=0;b(f)endc;begincend.,b调用f时,用传递过来的访问链来建立f的访问链,6.3非局部名字的访问,pr
23、ogramret(input,output);(过程作为返回值)varf:function(integer):integer;functiona:function(integer):integer;varm:integer;functionaddm(n:integer):integer;beginreturnm+nend;beginm:=0;returnaddmend;procedureb(g:function(integer):integer);beginwriteln(g(2)end;beginf:=a;b(f)end.,6.3非局部名字的访问,programret(input,outpu
24、t);(过程作为返回值)varf:function(integer):integer;functiona:function(integer):integer;varm:integer;functionaddm(n:integer):integer;beginreturnm+nend;beginm:=0;returnaddmend;procedureb(g:function(integer):integer);beginwriteln(g(2)end;beginf:=a;b(f)end.,执行addm时,a的活动记录已不存在,取不到m的值,6.3非局部名字的访问,C语言的函数声明不能嵌套,函数不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 运行时存储空间的组织和管理 第六 运行 存储空间 组织 以及 管理
限制150内