




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 运转时存储空间组织8.1 目的程序运转时的活动 以Pascal为例,假定程序由假设干个过程组成 过程procedure定义一个过程的活动指的是该过程的一次执行 过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序,包括执行P时调用其它过程破费的时间过程可以是递归的1 program sort(input, output)2 var a: array0.10 of integer;3 procedure readarray;4 var i: integer;5 begin6 for i:=1 to 9 do read(ai)7 end;8 function p
2、artition(y, z:integer):integer;9 var i:integer;10 begin .11 end;program sort procedure readarray function partition(y procedure quicksort12 procedure quicksort(m, n:integer);13 var i:integer;14 begin15 if (nm) then begin16 i:=partition(m, n );17 quicksort(m, i-1 );18 quicksort(i+1, n )19 end;20 end;
3、21 begin22 a0:=-9999; a10:=9999;23 readarray;24 quicksort(1, 9 )25 gram sort procedure readarray function partition(y procedure quicksort参数传送过程是模块程序设计的主要手段,同时也是节省程序代码和扩展言语的主要途径。过程定义:procedure add(x,y:integer; var z:integer) begin z:=x+y; end;过程调用 add(a,b,c); 参数传送方式一. 传地址把真实参数的地址传送给相应的方式参数方法:调
4、用段预先把真实参数的地址传送到被调用段可以拿到的地方;程序控制转入被调用段之后,被调用段首先把真实参数的地址抄进本人相应的方式单元中;过程体对方式参数的援用域赋值被处置成对方式单元的间接访问。PASCAL的变量参数方式procedure swap (var m:integer; var n: integer); var i:integer; begin i:=m; m:=n; n:=i; endswap(a,b)把a,b的地址送到知单元j1和j2中m:=j1;n:=j2;i:=m;m:= n;n:=i;参数传送方式二得结果传地址的一种变形方法:每个形参对应两个方式单元,第一个方式单元存放实参地
5、址,第二个单元存放实参的值。在过程体中对方式参数的任何援用或赋值都看作对它的第二个单元的直接访问。过程完成前往前把第二个单元的内容存放到第一个单元所指的实参单元中。有些Fortran采用这种方式;参数传送方式三传值把真实参数的值传送给相应的方式参数方法:调用段预先把真实参数的的值计算出来并放在被调用段可以拿到的地方;被调用段开场任务时,首先把实参的值抄入方式参数相应的单元;被调用段中,象援用部分数据一样援用方式单元。PASCAL的值参数参数传送方式四传名过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把其中任一出现的方式参数都交换成相应的实参。方法: 在进入被调用段的之前不对真实参
6、数预先进展计值,而是让过程体中每当运用到相应的方式参数时才逐次对它实行计值或计算地址。因此,通常把真实参数处置成一个子程序称为参数子程序,每当过程体中运用到相应的方式参数时就调用这个子程序。PROGRAM EX var A:integer;PROCEDURE P(B:integer)var A:integer;BEGIN A:=0; B:=B+1; A:=A+B;END;BEGIN A :=2; TA:=0; A:= A +1; TA:=TA+ A; write(A);ENDBEGIN A:=2; P(A); write(A);END例:procedure P(w,x,y,z);begin y
7、 := y*w; z := z+x;endbegin a := 5; b := 3; P(a+b,a-b,a,a); write(a);end传值:传地址:得结果:传名:542777编译程序为了组织存储空间,必需思索下面几个问题:过程能否允许递归?当控制从一个过程的活动前往时,对部分称号的值如何处置?过程能否允许援用非部分称号?过程调用时如何传送参数;过程能否可以做为参数被传送和做为结果被前往?存储空间可否在程序控制下进展动态分配?存储空间能否必需显式地释放? 8.2 运转时存储器的划分 一个目的程序运转所需的存储空间包括:存放目的代码的空间存放数据工程的空间存放程序运转的控制或衔接数据所需单
8、元(控制栈)一个程序在运转时辰的内存划分:代码(Code)静态数据(Static Data)栈(Stack)堆(Heap)8.2.2 活动记录假定言语的特点为:允许过程递归调用、允许过程含有可变数组,但过程定义不允许嵌套,如C言语。采用栈式存储分配机制活动记录:运转时,每当进入一个过程就有一个相应的活动记录累筑于栈顶。此记录含有衔接数据、方式单元、部分变量、部分数组的内情向量和暂时任务单元等。对任何部分变量X的援用可表示为变址访问: dxSP dx: 变量X相对于活动记录起点的地址,在编译时可确定。参数个数前往地址方式单元暂时单元内情向量部分变量SP 012老SPTOP 每个过程的活动记录内容
9、(非嵌套言语)衔接数据前往地址动态链:指向调用该过程前的最新活动记录地址的指针。静态链:指向静态直接外层最新活动记录地址的指针,用来访问非部分数据。静态链动态链方式单元暂时单元内情向量部分变量SP 012前往地址TOP 每个过程的活动记录内容(嵌套言语)方式单元:存放相应的真实参数的地址或值。部分数据区:部分变量、内情向量、暂时任务单元如存放对表达式求值的结果。静态链动态链方式单元暂时单元内情向量部分变量SP 012前往地址TOP 每个过程的活动记录内容 静态分配战略(FORTRAN) 假设在编译时能确定数据空间的大小,那么可采用静态分配方法:在编译时辰为每个数据工程确定出在运转时辰的存储空间
10、中的位置。动态分配战略(PASCAL) 假设在编译时不能确定运转时数据空间的大小,那么必需采用动态分配方法。允许递归过程和动态恳求释放内存。栈式动态分配堆式动态分配8.2.3 存储分配战略 PROGRAM MAIN integer X,YCOMMON /C/A,B ENDSUBROUTINE SUB1 real X,ZCOMMON /C/A1,B1 END8.3静态存储管理8.3静态存储管理FORTRAN程序的特点:整个程序所需数据空间的总量在编译时完全确定,每个数据名的地址可以静态地进展分配。由于每个FORTRAN 程序段可以独立编译,运转前由装入程序把各段连成可运转的整体。通常按数据区组织
11、存储:每个程序段定义一个部分数据区,用来存放程序段中未出如今COMMON里的部分名的值。每个公用块定义一个公用数据区,用来存放公用块里各个名字的值。每个数据区有一个编号,地址分配时,在符号表中,对每个数据名登记其所属数据区编号及在该区中的相对位置。每个部分数据区的内容及存放次序:存放器维护区前往地址方式单元暂时变量数组简单变量01A思索子程序段:SUBROUTINE SWAP(A,B)T=AA=BB=TRETURNEND存放器维护区前往地址ATB01a8.4 一个简单栈式存储分配假定言语的特点为:允许过程递归调用、允许过程含有可变数组,但过程定义不允许嵌套,如C言语。采用栈式存储分配机制活动记
12、录:运转时,每当进入一个过程就有一个相应的活动记录累筑于栈顶。此记录含有衔接数据、方式单元、部分变量、部分数组的内情向量和暂时任务单元等。 全局数听阐明Main( ) Main中的数听阐明 void R( ) R中的数听阐明void Q( ) Q中的数听阐明主程序过程Q 过程RQ的活动记录主程序活动记录TOPR的活动记录SP参数个数前往地址方式单元内情向量部分变量老SP暂时单元全局数据区每个过程的活动记录内容如图:对任何部分变量X的援用可表示为变址访问: dxSP dx: 变量X相对于活动记录起点的地址,在编译时可确定。参数个数前往地址方式单元暂时单元内情向量部分变量SP 012老SPTOP
13、8.4.1 C的活动记录 过程调用的四元式序列:par T1par T2 par Tncall P,n8.4.2 C的过程调用、过程进入、数组空间分配和过程前往 1) 每个par Ti(i=1,2,n)可直接翻译成如下指令:(i+3)TOP:= Ti (传值)(i+3)TOP:=addr(Ti) (传地址)2) call P,n 被翻译成:1TOP:=SP (维护现行SP)3TOP:=n (传送参数个数)JSR P (转子指令)参数个数前往地址方式单元内情向量部分变量老SP暂时单元对于par和call产生的目的代码如下:TOP SP 调用过程的活动记录方式单元老SP参数个数3) 转进过程P后,
14、首先应执行下述指令:SP:=TOP+1 (定义新的SP)1SP:=前往地址 (维护前往地址)TOP:=TOP+L (新TOP) L:过程P的活动记录所需单元数, 在编译时可确定。 参数个数前往地址方式单元内情向量部分变量老SP暂时单元TOP 调用过程的活动记录前往地址TOPSP4) 过程前往时,应执行以下指令:TOP:=SP-1 (恢复调用前TOP)SP:=0SP (恢复调用前SP)X:=2TOP (把前往地址取到X中)UJ 0X (按X前往)参数个数前往地址方式单元内情向量部分变量老SP暂时单元调用过程的活动记录TOPSPSPTOP8.5 嵌套过程言语的栈式实现PASCAL非部分名字的访问的
15、实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往8.5 嵌套过程言语的栈式实现假定言语不仅允许过程的递归调用(和可变数组),而且允许过程定义的嵌套,如PASCAL,PL言语。PASCALPASCAL程序本身可以看成是一个操作系统所调用的过程,过程可以嵌套和递归。一个PASCAL过程:过程头;阐明段由一系列的阐明语句组成;begin执行体由一系列的执行语句组成;end8.5 嵌套过程言语的栈式实现作用域:一个名字能被运用的区域范围称作这个名字
16、的作用域。允许同一个标识符在不同的过程中代表不同的名字。名字作用域规那么-最近嵌套原那么一个在子程序B1中阐明的名字X只在B1中有效部分于B1;假设B2是B1的一个内层子程序且B2中对标识符X没有新的阐明,那么原来的名字X在B2中依然有效。假设B2对X重新作了阐明,那么,B2对X的任何援用都是指重新阐明过的这个X。program main var A, B : real; procedure P1 var B:boolean; begin end procedure P2 var A:integer; begin endbegin endA(real)B(real)B(bool)A(integ
17、r)嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往8.5.1 非部分名字的访问的实现 主程序的层次为0;在i层中定义的过程,其层次为i+1;(层数, 偏移量)过程运转时,必需知道其一切外层过程的当前活动记录的起始地址。嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往图9.15 程序program P;var a, x : integer;procedure Q(b: integer);var i: integer;procedure
18、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 Rbegin.R(1,x);.end Qprocedure S;var c, i:integer;begina:=1;Q(c);.end Sbegina:=0;S;.end. P主程序P 过程 S 过程 Q 过程 R 过程 R一、静态链和活动记录 静态链:指向本过程的直接外层过程的活动记录的起始地址,也称存取链。动态链:指向本过程的调用过程的活动记录的起始地址,也称控制链。参数个数前往地址方式单元暂时单元
19、内情向量部分变量SP012动态链(老SP)TOP 静态链00前往地址102a3x4SP TOP主程序P00前往地址102a3x405前往地址6070(形参个数)8c9i10SP TOP动态链静态链主程序P过程 S?第N层过程调用第 N+1层过程,如何确定被调用过程(第 N+1层)过程的静态链?A:调用过程(第N层过程)的最新活动记录的起始地址.00前往地址102a3x405前往地址6070(形参个数)8c9i10SP TOP动态链静态链主程序P 过程 S 过程 Q511前往地址120131(形参个数)14b(形参)15i16?第N层过程调用第 N层过程,如何确定被调用过程(第 N层)过程的静态
20、链?A:调用过程(第N层过程)的静态链的值。00前往地址102a3x405前往地址6070(形参个数)8c9i10动态链静态链主程序P 过程 S 过程 Q 过程 R511前往地址120131(形参个数)14b(形参)15i161117前往地址1811192(形参个数)20u(形参)21v(形参)22c23d24SP TOP00前往地址102a3x405前往地址6070(形参个数)8c9i10动态链静态链主程序P 过程 S 过程 Q 过程 R 过程 R511前往地址120131(形参个数)14b(形参)15i161117前往地址1811192(形参个数)20u(形参)21v(形参)22c23d2
21、41725前往地址2611272(形参个数)28u(形参)29v(形参)30c31d32TOPSP 00前往地址102a3x405前往地址6070(形参个数)8c9i10动态链静态链主程序P 过程 S 过程 Q 过程 R 过程 Q511前往地址120131(形参个数)14b(形参)15i161117前往地址1811192(形参个数)20u(形参)21v(形参)22c23d24TOPSP 1725前往地址260271(形参个数)28b(形参)29i30?第N层过程调用第 N-x层过程,如何确定被调用过程(第 N-x层)过程的静态链?A:沿着调用过程(第N层过程)的静态链的向前走x步到达的活动记录
22、的静态链的值。嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往二、嵌套层次显示表display当进入一个过程后,在建立其活动记录区的同时建立一张嵌套层次显示表diaplay,把diaplay表作为活动记录的一部分。令过程R的外层为Q,Q的外层为主程序为P,那么过程R运转时的DISPLAY表内容为:问题:当过程P1调用过程P2而进入P2后,P2应如何建立起本人的display表?P0P1P2P0P2P1P0P1P2问题:当过程P1调用过程P2而进入P2后,P2应如何建立起本人的display表?P0P1P2l2: P
23、1的最新活动记录的起始地址P0的最新活动记录的起始地址P1的display表P0的最新活动记录的起始地址l2: P2的最新活动记录的起始地址P2的display表从P1的display表中自底而上地取过l2个单元l2为P2的层数再添上进入P2后新建立的SP值就构成了P2的display表。问题:当过程P1调用过程P2而进入P2后,P2应如何建立起本人的display表?P0P2P1l2-1: P1的最新活动记录的起始地址P0的最新活动记录的起始地址P1的display表P0的最新活动记录的起始地址P1的最新活动记录的起始地址P2的display表从P1的display表中自底而上地取过l2个单
24、元l2为P2的层数再添上进入P2后新建立的SP值就构成了P2的display表。l2: P2的最新活动记录的起始地址问题:当过程P1调用过程P2而进入P2后,P2应如何建立起本人的display表?P0P1P2P1的最新活动记录的起始地址P0的最新活动记录的起始地址P1的display表P0的最新活动记录的起始地址P2的display表从P1的display表中自底而上地取过l2个单元l2为P2的层数再添上进入P2后新建立的SP值就构成了P2的display表。l2: P2的最新活动记录的起始地址l2: P2的最新活动记录的起始地址问题:当过程P1调用过程P2而进入P2后,P2应如何建立起本人
25、的display表?答案:从P1的display表中自底而上地取过l2个单元l2为P2的层数再添上进入P2后新建立的SP值就构成了P2的display表。把P1的display表地址作为衔接数据之一传送给P2就可以建立P2的display表。P0P1P2P0P2P1P0P1P2diaplay表在活动记录中的相对地址d在编译时能完全确定。假定在现行过程中援用了某层过程(令其层次为k)的X变量,那么,可用下面两条指令获得X的地址: LD R1 (d+k)SP LD R2 dxR1嵌套过程言语活动记录参数个数前往地址方式单元暂时单元内情向量部分变量SP 012老SPTOP Display 表全局Di
26、aplay3d图9.15 程序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 Rbegin.R(1,x);.end Qprocedure S;var c, i:integer;begina:=1;Q(c);.end Sbegina:=0;S;.end. P主程序P 过程 S 过程 Q 过程 R 过程
27、 R00前往地址10(display)2a3x405前往地址62(全局display)70(形参个数)809510主程序过程 Sc11i12TOPSP 动态链00前往地址10(display)2a3x405前往地址62(全局display)70(形参个数)809510主程序P过程 S 过程 Qc11i12动态链513前往地址149(全局display)151(形参个数)16b(形参)170181319i20TOPSP 00前往地址10(display)2a3x405前往地址62(全局display)70(形参个数)809510主程序P过程 S 过程 Q 过程 Rc11i12动态链513前往地址
28、149(全局display)151(形参个数)16b(形参)170181319i201321前往地址2218(全局display)232(形参个数)24u(形参)25v(形参)2602713282129c30d31TOPSP 00前往地址10(display)2a3x405前往地址62(全局display)70(形参个数)809510主程序P 过程 S 过程 Q 过程 R 过程 Rc11i12动态链513前往地址149(全局display)151(形参个数)16b(形参)170181319i201321前往地址2218(全局display)232(形参个数)24u(形参)25v(形参)2602
29、713282129c30d31TOPSP 2132前往地址3327(全局display)342(形参个数)35u(形参)36v(形参)3703813393240c41d42嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往参数个数前往地址方式单元暂时单元内情向量部分变量老SPDisplay 表全局Diaplay1. 每个par Ti(i=1,2,n)可直接翻译成如下指令:(i+4)TOP:= Ti (传值) (i+4)TOP:=addr(Ti ) (传地址)过程调用、过程进入、过程前往TOPSP 调用过程的活动记录方
30、式单元参数个数前往地址方式单元暂时单元内情向量部分变量老SPDisplay 表全局Diaplay2. call P,n 被翻译成:1TOP:=SP (维护现行SP)3TOP:=SP+d (传送现行display地址)4TOP:=n (传送参数个数)JSR (转子指令)过程调用、过程进入、过程前往TOPSP 调用过程的活动记录老SP全局Diaplay参数个数3. 转进过程P后,首先定义新的SP和TOP,保管前往地址。4. 根据全局display建立现行过程的display:从全局display表中自底向上地取l个单元,在添上进入P后新建立的SP值就构成了P的display。参数个数前往地址方式单
31、元暂时单元内情向量部分变量老SPDisplay 表全局DiaplayTOPSP 调用过程的活动记录前往地址Display 表5. 过程前往时,执行下述指令: TOP:=SP-1SP:=0SPX:=2TOPUJ 0X参数个数前往地址方式单元暂时单元内情向量部分变量老SPDisplay 表全局DiaplayTOPSP 调用过程的活动记录TOPSP 嵌套过程言语的栈式实现PASCAL非部分名字的访问的实现静态链和活动记录嵌套层次显示表display过程调用、过程进入、过程前往三、上面两种方法的折中PL编译程序建立一个总的运转时的diaplay表(而不是每个过程的活动记录中都有一个),它记录正被调用执
32、行的过程及其一切外层过程的活动记录的起始地址。经过这个diaplay访问数据。在各过程活动记录之间保管一条静态链SL,它主要用于由层次大的过程调用层次小的过程后前往时,恢复调用前的display内容。(这时,调用前往后,执行一条UDIS指令)PL中每个过程的活动记录构造: 1) 简单部分变量 2) 衔接数据前往地址RA动态链DL,指向过程调用者的活动记录起始地址静态链SL, 指向过程的直接外层过程活动记录起始地址静态链指针SL方式单元部分变量数组SP 012前往地址RATOP 动态链指针DL3program P; var x,y: integer; . procedure P1; var i,j:integer; . procedure P11(a,b:integer); . begin . end; begin . call P11(i,j); . end; procedure P2; var s,t:int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业劳动合同范本2
- 社会政治面试题及答案
- 2024年纺织品检验员证书考试的思维导图 试题及答案
- 专科操作系统试题及答案
- 如何通过设计提升品牌竞争力与市场份额试题及答案
- 自贡药剂面试真题及答案
- 特岗护理的试题及答案
- 组织调研面试真题及答案
- 2024年纺织工程师考试成功应试的经验分享试题及答案
- 矿山安全员试题及答案
- 乳腺癌中医特色护理
- 沐足楼面服务员礼貌礼节培训
- 水肥一体化施工组织设
- 新疆特岗幼儿园学前教育模拟测试题
- 教育研究方法教育行动研究法
- 药浴婴幼儿计划书
- 医院检验科实验室生物安全管理手册
- 社区便民服务中心建设
- 高二学考动员主题班会课件
- 幼儿园《村居》教案
- 社会主义发展史智慧树知到课后章节答案2023年下齐鲁师范学院
评论
0/150
提交评论