《运行时的存储组织及管理课件.ppt》由会员分享,可在线阅读,更多相关《运行时的存储组织及管理课件.ppt(23页珍藏版)》请在三一办公上搜索。
1、运行时的存储组织及管理,2023/3/27,编译技术,2,运行时的存储组织及管理,概述存储组织运行时的存储分配策略静态存储分配动态存储分配对非局部名字的访问参数传递,2023/3/27,编译技术,3,有关源程序中的一些问题,问题的提出:如何构造运行程序的策略和方法过程活动树控制栈说明的作用域名字的绑定,2023/3/27,编译技术,4,名字与存储的绑定,名字,存储单元,值,存储分配,程序运行,环境,状态,l-value,r-value,2023/3/27,编译技术,5,存储组织,运行时刻内存的划分:假定编译器从操作系统得到一块存储区,运行时的存储空间要划分成块:生成的目标代码;数据对象;记录过
2、程活动的控制栈对应的数据结构,2023/3/27,编译技术,6,运行时刻存储分配策略,分配策略是:静态分配;栈式分配,或称栈式动态分配;堆式分配,或称堆式动态分配。采用哪种分配策略是由源语言的语义决定的。,2023/3/27,编译技术,7,堆式存储分配,栈式存储分配策略在下列情况下不能使用:活动结束时必须保持局部名字的值被调用者的活动比调用者的活动的生存期长。堆式存储器的策略:(堆管理器管理堆空间)把连续存储区域分成块,当活动记录或其他对象需要时就分配。块的释放可以按任意次序进行,所以经过一段时间后,堆可能包含交错的正在使用的和已经释放的区域,2023/3/27,编译技术,8,堆管理器的效率问
3、题,堆管理的效率问题是数据结构理论中的特殊问题对每个感兴趣的活动记录的大小,保存一个相应大小的空闲块的链表可能的话,为大小为s的请求分配一个大小为s的块,其中s是大小等于s的最小块。当该块最终被释放后,将其链回原来的空闲块链表对于大块存储空间,使用堆管理器管理。其具体管理方法可以参考操作系统中堆内存的管理方法。,2023/3/27,编译技术,9,栈式存储分配,基于控制栈的原理:存储空间被组织成栈,活动记录的推入和弹出分别对应于活动的开始和结束。与静态分配不同的是,在每次活动中把局部名字和新的存储单元绑定,在活动结束时,活动记录从栈中弹出,因而局部名字的存储空间也随之消失。,当控制流通过图6.3
4、的活动树时活动记录被推人或弹出运行时刻的栈中的情况,设寄存器top标记栈顶。,s,Sa:array,top,r,ri:integer,top,top,q(1,9),q(1,9)i:integer,top,p(1,9),p(1,9)i:integer,top,top,q(1,3),q(1,3)i:integer,top,2023/3/27,编译技术,11,栈式存储分配,确定活动记录中局部数据的地址:假设top-sp标记一个活动记录的开始的位置,dx表示x的地址相对于top-sp的偏移量。那么,x在过程的目标代码中的地址可写成dx(top-sp)在运行时刻,当把x的活动记录筑于栈顶时,寄存器top
5、-sp被赋于实际的地址,top-sp可以是一个寄存器。,2023/3/27,编译技术,12,调用序列和返回序列,通过在目标代码中生成调用序列和返回序列实现过程的调用。激活一个过程的活动是执行过程语句的结果。过程语句p(e1,e2,en)的目标代码(调用序列)完成任务:调用者对实在参数求值,并把它们传送给被调用过程的活动记录的参数域。调用者在被调用者的活动记录中存放返回地址和老top-sp之值。之后调用者把top一sp之值增加到新的栈顶的活动记录的位置。被调用者存放寄存器值和其它状态信息。被调用者初始化其局部数据并开始执行。,参数和返回值,链和保存的状态,临时变量和局部数据,参数和返回值,临时变
6、量和局部数据,控制链,链和保存的状态,控制链,top_sp,调用者的活动记录,被调用者的活动记录,调用者的任务,被调用者的任务,2023/3/27,编译技术,13,调用序列和返回序列,返回序列,return目标代码完成的任务是:被调用者在自己的活动记录的返回值域中放一个返回值。利用状态域中的信息,被调用者恢复top-sp和其它寄存器,并且按返回地址转移到调用者的代码之中。调用者复制返回值到自己的活动记录中。,2023/3/27,编译技术,14,可变长度的数据,源程序的例子 PROCEDURE exam(l,m,n:integer);VAR a:array 1.l of real;b:array
7、 1.m of real;c:array 1.n of real;BEGIN END;编译时,不知 a,b,c的大小,仅对每个数组设置一个指针。,可变长度的数据,Control link,a,b,c,Top-sp,top,Array a,Array b,Array c,top,P的活动记录,P的动态数组,参数传递,2023/3/27,编译技术,17,参数传递,说明的作用域如果一个说明的作用域是在一个过程里,那么这个过程里出现的该说明中的名字都是局部于本过程的;除上述之外的名称是非局部的。参数传递方式:过程的形式参数和实在参数的对应方式。形式参数和实在参数的“左值”和“右值”之间的对应关系划分参
8、数传递方式:传值调用引用调用(传地址调用)复制-恢复调用传名调用,2023/3/27,编译技术,18,参数传递传值调用,传值调用:计算实参,并把它的右值传给被调用过程把形参当作局部名字看待,形参的存储单元在被调用过程的活动记录中调用者计算实参,并把其右值放入形参的存储单元中传值调用的显著特征是对形参的运算不影响调用者活动记录中的值打印结果a is 1,b is 2,swap(x,y)int x,y int temp;temp=x;x=y;y=temp;main()int a=1,b=2;swap(a,b);printf(“a is%d,b is%d”,a,b);,2023/3/27,编译技术,
9、19,参数传递引用调用,引用调用:传递时,调用过程把实参存储单元的地址传递给被调用过程如果实参是有左值的名字或表达式,则传递这个左值本身;如果实参是表达式,没有左值,则计算该表达式的值并存入新的存储单元,然后传递这个单元的地址打印结果a is 2,b is 1,swap(x,y)int x,y int temp;temp=x;x=y;y=temp;main()int a=1,b=2;swap(a,b);printf(“a is%d,b is%d”,a,b);,2023/3/27,编译技术,20,参数传递复制-恢复,传值调用和引用调用的混合在控制流进入被调用过程之前计算实参,实参的右值像传值调用
10、那样传递给被调用过程,此外如果实参有左值的话,在调用之前确定它的左值当控制返回时,将形参的当前右值复制回实参的左值,该左值是上述调用前计算的左值。打印结果a is 2,b is 1,swap(x,y)int x,y int temp;temp=x;x=y;y=temp;main()int a=1,b=2;swap(a,b);printf(“a is%d,b is%d”,a,b);,2023/3/27,编译技术,21,参数传递传名调用,传名调用的用法类似于宏过程被看做宏,也就是说,在调用过程中将调用替换为被调用过程的过程体,但要把任何一个出现的形式参数都文字的替换为相应的实参被调用过程中局部名字
11、要保持与调用过程中的名字不同打印结果a is 2,b is 1,swap(x,y)int x,y int temp;temp=x;x=y;y=temp;main()int a=1,b=2;swap(a,b);printf(“a is%d,b is%d”,a,b);,void Q(int x)int i=1;x=x+2;i=2;x=x+2;void main()int i;int B3;B1=1;B2=2;i=1;Q(Bi);,试问:若参数传递方式分别采取(1)传值调用,(2)引用调用,(3)复制-恢复调用,(4)传名调用时,程序执行后输出B1和B2的值分别是什么?请简要写出计算过程。,采用传值
12、调用时,将实在参数的值传递给形式参数,而后在函数调用过程中,操作的是形式参数,形式参数的值发生改变,而且这些改变不能重新传递给实在参数,所以得到的结果是B1=1;B2=2采用引用调用,将实在参数的地址传递给形式参数,此时对形式参数的操作就相当于对其指向的地址单元进行操作,其操作影响了实在参数,所以得到的结果是B1=5;B2=2采用复制-恢复调用,首先将实在参数的值传递给形式参数,此时,x=1,进行函数调用后,得到,x=5,调用返回时,将形式参数的值传递到相应的实在参数的地址中,即x的值传递到B1的地址中,所以得到的结果是B1=5;B2=2采用传名调用,将Bi当成整个的一个整体,替换函数调用中的x,得到:i=1;Bi=Bi+2;i=2;Bi=Bi+2;计算得到,B1=3,B2=4,2023/3/27,编译技术,23,Thanks for your time!Questions&Answers,