您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Ch8运行时存储空间组织
第八章运行时存储空间组织8.1目标程序运行时的活动以Pascal为例,假定程序由若干个过程组成过程(procedure)定义一个过程的活动指的是该过程的一次执行过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序,包括执行P时调用其它过程花费的时间过程可以是递归的(1)programsort(input,output)(2)vara:array[0..10]ofinteger;(3)procedurereadarray;(4)vari:integer;(5)begin(6)fori:=1to9doread(a[i])(7)end;(8)functionpartition(y,z:integer):integer;(9)vari:integer;(10)begin......(11)end;programsortprocedurereadarrayfunctionpartition(yprocedurequicksort(12)procedurequicksort(m,n:integer);(13)vari:integer;(14)begin(15)if(nm)thenbegin(16)i:=partition(m,n);(17)quicksort(m,i-1);(18)quicksort(i+1,n)(19)end;(20)end;(21)begin(22)a[0]:=-9999;a[10]:=9999;(23)readarray;(24)quicksort(1,9)(25)end.programsortprocedurereadarrayfunctionpartition(yprocedurequicksort参数传递过程是模块程序设计的主要手段,同时也是节省程序代码和扩充语言的主要途径。过程定义:procedureadd(x,y:integer;varz:integer)beginz:=x+y;end;过程调用add(a,b,c);参数传递方式一.传地址把实在参数的地址传递给相应的形式参数方法:调用段预先把实在参数的地址传递到被调用段可以拿到的地方;程序控制转入被调用段之后,被调用段首先把实在参数的地址抄进自己相应的形式单元中;过程体对形式参数的引用域赋值被处理成对形式单元的间接访问。PASCAL的变量参数方式procedureswap(varm:integer;varn:integer);vari:integer;begini:=m;m:=n;n:=i;endswap(a,b)把a,b的地址送到已知单元j1和j2中m:=j1;n:=j2;i:=m↑;m↑:=n↑;n↑:=i;参数传递方式二.得结果传地址的一种变形方法:每个形参对应两个形式单元,第一个形式单元存放实参地址,第二个单元存放实参的值。在过程体中对形式参数的任何引用或赋值都看作对它的第二个单元的直接访问。过程完成返回前把第二个单元的内容存放到第一个单元所指的实参单元中。有些Fortran采用这种方式;参数传递方式三.传值把实在参数的值传递给相应的形式参数方法:调用段预先把实在参数的的值计算出来并放在被调用段可以拿到的地方;被调用段开始工作时,首先把实参的值抄入形式参数相应的单元;被调用段中,象引用局部数据一样引用形式单元。PASCAL的值参数参数传递方式四.传名过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把其中任一出现的形式参数都替换成相应的实参。方法:在进入被调用段的之前不对实在参数预先进行计值,而是让过程体中每当使用到相应的形式参数时才逐次对它实行计值(或计算地址)。因此,通常把实在参数处理成一个子程序(称为参数子程序),每当过程体中使用到相应的形式参数时就调用这个子程序。PROGRAMEX…varA:integer;PROCEDUREP(B:integer)…varA:integer;BEGINA:=0;B:=B+1;A:=A+B;END;BEGINA:=2;TA:=0;A:=A+1;TA:=TA+A;write(A);ENDBEGINA:=2;P(A);write(A);END例:…procedureP(w,x,y,z);beginy:=y*w;z:=z+x;endbegina:=5;b:=3;P(a+b,a-b,a,a);write(a);end传值:传地址:得结果:传名:542777编译程序为了组织存储空间,必须考虑下面几个问题:过程是否允许递归?当控制从一个过程的活动返回时,对局部名称的值如何处理?过程是否允许引用非局部名称?过程调用时如何传递参数;过程是否可以做为参数被传递和做为结果被返回?存储空间可否在程序控制下进行动态分配?存储空间是否必须显式地释放?8.2运行时存储器的划分一个目标程序运行所需的存储空间包括:存放目标代码的空间存放数据项目的空间存放程序运行的控制或连接数据所需单元(控制栈)一个程序在运行时刻的内存划分:代码(Code)静态数据(StaticData)栈(Stack)堆(Heap)8.2.2活动记录假定语言的特点为:允许过程递归调用、允许过程含有可变数组,但过程定义不允许嵌套,如C语言。采用栈式存储分配机制活动记录:运行时,每当进入一个过程就有一个相应的活动记录累筑于栈顶。此记录含有连接数据、形式单元、局部变量、局部数组的内情向量和临时工作单元等。对任何局部变量X的引用可表示为变址访问:dx[SP]dx:变量X相对于活动记录起点的地址,在编译时可确定。参数个数返回地址形式单元临时单元内情向量局部变量SP012老SPTOP每个过程的活动记录内容(非嵌套语言)连接数据返回地址动态链:指向调用该过程前的最新活动记录地址的指针。静态链:指向静态直接外层最新活动记录地址的指针,用来访问非局部数据。静态链动态链形式单元临时单元内情向量局部变量SP012返回地址TOP每个过程的活动记录内容(嵌套语言)形式单元:存放相应的实在参数的地址或值。局部数据区:局部变量、内情向量、临时工作单元(如存放对表达式求值的结果)。静态链动态链形式单元临时单元内情向量局部变量SP012返回地址TOP每个过程的活动记录内容静态分配策略(FORTRAN)如果在编译时能确定数据空间的大小,则可采用静态分配方法:在编译时刻为每个数据项目确定出在运行时刻的存储空间中的位置。动态分配策略(PASCAL)如果在编译时不能确定运行时数据空间的大小,则必须采用动态分配方法。允许递归过程和动态申请释放内存。栈式动态分配堆式动态分配8.2.3存储分配策略PROGRAMMAIN…integerX,YCOMMON/C/A,B…ENDSUBROUTINESUB1…realX,ZCOMMON/C/A1,B1…END8.3静态存储管理8.3静态存储管理FORTRAN程序的特点:整个程序所需数据空间的总量在编译时完全确定,每个数据名的地址可以静态地进行分配。由于每个FORTRAN程序段可以独立编译,运行前由装入程序把各段连成可运行的整体。通常按数据区组织存储:每个程序段定义一个局部数据区,用来存放程序段中未出现在COMMON里的局部名的值。每个公用块定义一个公用数据区,用来存放公用块里各个名字的值。每个数据区有一个编号,地址分配时,在符号表中,对每个数据名登记其所属数据区编号及在该区中的相对位置。每个局部数据区的内容及存放次序:寄存器保护区返回地址形式单元临时变量数组简单变量01A考虑子程序段:SUBROUTINESWAP(A,B)T=AA=BB=TRETURNEND地址名字NAME性质ATTRIBUTEDAADDRSWAP子程序,二目A哑,实变量kaB哑,实变量ka+2T实变量ka+4寄存器保护区返回地址ATB01a8.4一个简单栈式存储分配假定语言的特点为:允许过程递归调用、允许过程含有可变数组,但过程定义不允许嵌套,如C语言。采用栈式存储分配机制活动记录:运行时,每当进入一个过程就有一个相应的活动记录累筑于栈顶。此记录含有连接数据、形式单元、局部变量、局部数组的内情向量和临时工作单元等。全局数据说明Main(){Main中的数据说明}voidR(){R中的数据说明}…voidQ(){Q中的数据说明}主程序→过程Q→过程RQ的活动记录主程序活动记录TOPR的活动记录SP参数个数返回地址形式单元内情向量局部变量老SP临时单元全局数据区每个过程的活动记录内容如图:对任何局部变量X的引用可表示为变址访问:dx[SP]dx:变量X相对于活动记录起点的地址,在编译时可确定。参数个数返回地址形式单元临时单元内情向量局部变量SP012老SPTOP8.4.1C的活动记录过程调用的四元式序列:parT1parT2…parTncallP,n8.4.2C的过程调用、过程进入、数组空间分配和过程返回1)每个parTi(i=1,2,…n)可直接翻译成如下指令:(i+3)[TOP]:=Ti(传值)(i+3)[TOP]:=addr(Ti)(传地址)2)callP,n被翻译成:1[TOP]:=SP(保护现行SP)3[TOP]:=n(传递参数个数)JSRP(转子指令)参数个数返回地址形式单元内情向量局部变量老SP临时单元对于par和call产生的目标代码如下:TOPSP调用过程的活动记录形式单元老SP参数个数3)转进过程P后,首先应执行下述指令:SP:=TOP+1(定义新的SP)1[SP]:=返回地址(保护返回地址)TOP:=TOP+L(新TOP)L:过程P的活动记录所需单元数,在编译时可确定。参数个数返回地址形式单元内情向量局部变量老SP临时单元TOP调用过程的活动记录返回地址TOPSP4)过程返回时,应执行下列指令:TOP:=SP-1(恢复调用前TOP)SP:=0[SP](恢复调用前SP)X:=2[TOP](把返回地址取到X中)UJ0[X](按X返回)参数个数返回地址形式单元内情向量局部变量老SP临时单元调用过程的活动记录TOPSPSPTOP8.5嵌套过程语言的栈式实现PASCAL非局部名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程返回嵌套过程语言的栈式实现PASCAL非局部名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程返回8.5嵌套过程语言的栈式实现假定语言不仅允许过程的递归调用(和可变数组),而且允许过程定义的嵌套,如PASCAL,PL语言。PASCALPASCAL程序本身可以看成是一个操作系统所调用的过程,过程可以嵌套和递归。一个PASCAL过程:过程头;说明段(由一系列的说明语句组成);begin执行体(由一系列的执行语句组成);end8.5嵌套过程语言的栈式实现作用域:一个名字能被使用的区域范围称作这个名字的作用域。允许同一个标识符在不同的过程中代表不同的名字。名字作用域规则--最近嵌套原则一个在子程序B1中说明的名字X只在B1中有效(局部于B1);如果B2是B1的一个内层子程序且B2中对标识符X没有新的说明,则原来的名字X在B2中仍然有效。如果B2对X重新作了说明,那么,B2对X的任何引用都是指重新说明过的这个X。programmainvarA,B:real;…procedureP1varB:boolean;…begin…endprocedureP2varA:integer;…begin…endbegin…endA(real)B(real)B(bool)A(integr)嵌套过程语言的栈式实现PASCAL非局部名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程返回8.5.1非局部名字的访问的实现主程序的层次为0;在i层中定义的过程,其层次为i+1;(层数,偏移量)过程运行时,必须知道其所有外层过程的
本文标题:Ch8运行时存储空间组织
链接地址:https://www.777doc.com/doc-841149 .html