目标程序运行时的存储组织课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《目标程序运行时的存储组织课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 目标 程序 运行 存储 组织 课件
- 资源描述:
-
1、1第十章目标程序运行时的存储组织v第一节第一节 数据空间的三种不同使用方法和管理方法数据空间的三种不同使用方法和管理方法v第二节第二节 栈式存储分配的实现栈式存储分配的实现v第三节第三节 参数传递参数传递v第四节第四节 过程调用、过程进入和过程返回过程调用、过程进入和过程返回2知识结构知识结构310.1数据空间的三种不同使用方法和管理方法v从逻辑上看,代码生成前,编译程序必须进行目标程序从逻辑上看,代码生成前,编译程序必须进行目标程序运行环境的设计运行环境的设计和和数据空间的分配数据空间的分配v数据空间包括:用户定义的各种类型的数据对象(变量数据空间包括:用户定义的各种类型的数据对象(变量和常
2、量)所需的和常量)所需的存储空间存储空间,作为保留中间结果和传递参,作为保留中间结果和传递参数的数的临时工作单元临时工作单元,调用过程时所需的,调用过程时所需的连接单元连接单元,组织,组织输入输出所需的输入输出所需的缓冲区缓冲区第十章目标程序运行时的存储组织4v存储区划分成:目标区、静态数据区、栈区、堆区:5代码区代码区:用以存放目标代码,这是固定长度的,即编译时用以存放目标代码,这是固定长度的,即编译时能确定的能确定的静态数据区静态数据区:用以存放编译时能确定所占用空间的数据用以存放编译时能确定所占用空间的数据堆栈区堆栈区:用于可变数据以及管理过程活动的控制信息用于可变数据以及管理过程活动的
3、控制信息6v编译程序分配目标程序运行时的数据空间的编译程序分配目标程序运行时的数据空间的基本依据基本依据是是程序语言设计时对程序运行中存储空间的使用和管理办程序语言设计时对程序运行中存储空间的使用和管理办法的规定法的规定v在程序设计语言语义学中,使用在程序设计语言语义学中,使用environment表示将一个表示将一个名字映射到一个存储位置的函数,名字映射到一个存储位置的函数,state表示存储位置到表示存储位置到值的映射,如图值的映射,如图10.2所示:所示:7v数据空间的使用和管理方法分成三种:数据空间的使用和管理方法分成三种:静态存储分配静态存储分配栈式动态存储分配栈式动态存储分配堆式动
4、态存储分配堆式动态存储分配8一.静态存储分配v静态存储分配:在编译时能确定目标程序运行中所需的静态存储分配:在编译时能确定目标程序运行中所需的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置全部数据空间,确定每个数据对象的存储位置v如像如像FORTRAN程序是段结构的,如图程序是段结构的,如图10.3所示:所示:9v 图10.4给出一个FORTRAN77的程序例子:(1)PROGRAM CNSUME(2)CHARACTER*50 BUF/程序体所拥有的静态量程序体所拥有的静态量BUF(3)INTEGER N
5、EXT/程序体所拥有的静态量程序体所拥有的静态量NEXT(4)CHARACTER C,PRDUCE/程序体所拥有的静态量程序体所拥有的静态量C(5)DATA NEXT/1/,BUF/(6)C=PRDUCE()(7)(7)BUF(NEXT:NEXT)=C(8)NEXT=NEXT+1(9)(9)IF(C.EN.)GOTO 6(10)WRITE(*,(A)BUF(11)END10(12)CHARACTER FUNCTION PRDUCE()(13)CHARACTER*80 BUFFER(14)INTEGER NEXT(15)SAVE BUFFER,NEXT /PRDUCE函数体所拥有的静态量函数体所
6、拥有的静态量BUFFER,NEXT(16)DATA NEXT/81/(17)IF(NEXT.GT.80)THEN(18)READ(*,(A)BUFFER(19)NEXT=1(20)END IF(21)(21)PRDUCE=BUFFER(NEXT:NEXT)(22)(22)NEXT=NEXT+1(23)(23)END 11v图10.5中描述了该程序中局部变量的静态存储位置:12二.动态存储分配v如果一个程序设计语言允许递归过程、可变数组或允许如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储用户自由申请和释放空间,那么,就需要采用动态存储管理技术管理
7、技术13三.栈式动态存储分配v这种分配策略是将整个程序的数据空间设计为一个栈这种分配策略是将整个程序的数据空间设计为一个栈14四.堆式动态存储分配v假设程序运行时有一个大的存储空间,每当需要时就从假设程序运行时有一个大的存储空间,每当需要时就从这片空间中借用一块,不用时再退还,由于借还的时间这片空间中借用一块,不用时再退还,由于借还的时间先后不一,经一段运行之后,程序运行空间将被划分成先后不一,经一段运行之后,程序运行空间将被划分成许多块,有些占用,有些空闲。那么当运行程序要求一许多块,有些占用,有些空闲。那么当运行程序要求一块体积为块体积为N的空间时,需要决定应该从哪个空闲块得到这的空间时,
8、需要决定应该从哪个空闲块得到这个空间个空间v理论上讲理论上讲,应该从比应该从比N稍大一些的空闲块中取出稍大一些的空闲块中取出N个单元,个单元,以便使大的空闲块派更大的用场,但实现难度很大以便使大的空闲块派更大的用场,但实现难度很大15v实际中常常采用的办法:实际中常常采用的办法:先遇到哪块比先遇到哪块比N大就从其中取出大就从其中取出N个单元个单元v即使这样,也会发生找不到一块比即使这样,也会发生找不到一块比N大的空闲块,但所有大的空闲块,但所有空闲块总和比空闲块总和比N大得多,这时,有的分配管理系统采用废大得多,这时,有的分配管理系统采用废品回收的办法来应付品回收的办法来应付1610.2栈式存
9、储分配的实现v过程的活动记录过程的活动记录AR(Activation Record):是一段连续的存:是一段连续的存储区,用以存放过程的一次执行所需要的信息,这些信储区,用以存放过程的一次执行所需要的信息,这些信息如图息如图10.6所示:所示:17临时工作单元:临时工作单元:如计算表达式过程存放的中间结果如计算表达式过程存放的中间结果局部变量:局部变量:一个过程的局部变量一个过程的局部变量机器状态信息:机器状态信息:如程序计数器、寄存器的值如程序计数器、寄存器的值存取链:存取链:用以存取非局部变量用以存取非局部变量控制链:控制链:指向调用该过程的那个过程的活动记录指向调用该过程的那个过程的活动
10、记录实参:实参:由调用过程向该被调过程提供实参的值由调用过程向该被调过程提供实参的值(或地址或地址)返回地址:返回地址:保存该被调过程返回后的地址保存该被调过程返回后的地址18一.简单的栈式存储分配的实现v最简单的程序设计语言结构如图最简单的程序设计语言结构如图10.7所示:所示:program main;program main;/主程序头主程序头全局变量或数组的说明;全局变量或数组的说明;proc R;proc R;/过程过程R R的头的头 /过程过程R R的体的体end(R);end(R);/过程过程R R的尾的尾proc Q;proc Q;/过程过程Q Q的头的头 /过程过程Q Q的体
11、的体end(Q);end(Q);/过程过程Q Q的尾的尾主程序执行语句主程序执行语句 /主程序体主程序体end.(mainend.(main)/主程序尾主程序尾19v例如,图例如,图10.7的程序结构中,若主程序调用了过程的程序结构中,若主程序调用了过程Q,Q又调用了又调用了R,在在R进入运行后的存储结构如图进入运行后的存储结构如图10.8(a)所示:所示:v若主程序调用了过程若主程序调用了过程Q,Q递归调用自己,在递归调用自己,在Q过程第过程第2次次进入运行后的存储结构如图进入运行后的存储结构如图10.8(b)所示:所示:v若主程序先调用过程若主程序先调用过程Q,然后主程序接着调用,然后主程
12、序接着调用R,且,且Q过过程没有调用程没有调用Q和和R,这时,这时Q和和R进入运行后的存储结构分进入运行后的存储结构分别如图别如图10.8(c)和和10.8(d)所示:所示:2021v常常使用两个指针指示栈最顶端的数据区:常常使用两个指针指示栈最顶端的数据区:SP:总是指向现行过程活动记录的起点:总是指向现行过程活动记录的起点TOP:始终指向已占用的栈顶单元:始终指向已占用的栈顶单元22v这种语言若含有可变数组,则其过程活动记录的内容如这种语言若含有可变数组,则其过程活动记录的内容如图图10.9所示:所示:23v图图10.10表明分配数组区之后的运行栈情况,可以与图表明分配数组区之后的运行栈情
13、况,可以与图10.8(a)对照:)对照:24二.嵌套过程语言的栈式实现vPascal语言程序结构的特点是允许过程嵌套定义,如图语言程序结构的特点是允许过程嵌套定义,如图10.11所示:所示:2526v图图10.11的的Pascal程序中过程定义的嵌套情况如下:程序中过程定义的嵌套情况如下:sort readarray exchange quicksort partition27v假如过程假如过程sort激活(调用)了过程激活(调用)了过程quicksort,这时存储栈,这时存储栈中的情形如图中的情形如图10.12所示,其中在所示,其中在quicksort过程活动记录过程活动记录中有一存储单元(
14、用斜线描绘)用以记录过程中有一存储单元(用斜线描绘)用以记录过程quicksort可以引用可以引用sort中定义的变量中定义的变量a和和x。也就是说,为了解决对。也就是说,为了解决对非局部变量的存取问题,必须设法跟踪每个外层过程的非局部变量的存取问题,必须设法跟踪每个外层过程的最新活动记录的位置最新活动记录的位置2829v一种跟踪方法是:在过程活动记录中增设存取链一种跟踪方法是:在过程活动记录中增设存取链,指向包指向包含该过程的直接外层过程的最新活动记录的起始位置。含该过程的直接外层过程的最新活动记录的起始位置。过程活动记录的内容如图过程活动记录的内容如图10.13(a)所示。图)所示。图10
15、.12所提所提到的情况可用图到的情况可用图10.13(b)所示:)所示:30v因为因为PL/O的过程是无参过程,的过程是无参过程,PL/O也无动态数组,所以也无动态数组,所以它的过程活动记录的内容如图它的过程活动记录的内容如图10.14所示:所示:31v再回到图再回到图10.11例子,如果该程序的某次执行顺序为:例子,如果该程序的某次执行顺序为:sortquicksortquicksortpartitionexchangev图图10.1510.15给出了进入过程给出了进入过程exchangeexchange之后运行栈的示意,仅之后运行栈的示意,仅标明存取链和控制链的值标明存取链和控制链的值32
16、33v另一种跟踪方法是:每进入一个过程后,在建立它的活另一种跟踪方法是:每进入一个过程后,在建立它的活动记录的同时建立一张嵌套层次显示表动记录的同时建立一张嵌套层次显示表displayv嵌套层次:指过程定义的层数,始终假定主程序的层数嵌套层次:指过程定义的层数,始终假定主程序的层数为为0,因此主程序称为,因此主程序称为0层过程层过程34v计数过程的层数用一个计数器计数过程的层数用一个计数器Level,初值为,初值为0,每遇到过,每遇到过程说明则增程说明则增1,过程说明结束则减,过程说明结束则减1vdisplay是一个指针数组是一个指针数组d,也可看做是一个小栈,自顶向,也可看做是一个小栈,自顶
17、向下每个单元依次存放着现行层,直接外层,下每个单元依次存放着现行层,直接外层,直至最直至最外层(外层(0 0层,主程序层)等每一层过程的最新活动记录的层,主程序层)等每一层过程的最新活动记录的地址地址35v图图10.11的程序,假定有如下四种调用情况:的程序,假定有如下四种调用情况:(a)sortquicksort(b)sortquicksort quicksort(c)sortquicksort quicksortpartition(d)sort quicksortquicksortpartition exchange图图10.16(a)-(d)10.16(a)-(d)分别说明上述四种情形的
18、运行栈和分别说明上述四种情形的运行栈和displaydisplay3637vdisplay本身的体积在编译时可确定,它作为单独的表分配本身的体积在编译时可确定,它作为单独的表分配存储还是作为活动记录的一部分,比如置于实参的上端(存储还是作为活动记录的一部分,比如置于实参的上端(如图如图10.17所示),则取决于编译程序的设计者所示),则取决于编译程序的设计者38v当过程当过程P1调用过程调用过程P2而进入而进入P2后,后,P2应如何建立起自己的应如何建立起自己的display?当当P1P1调用调用P2P2时必须把时必须把P0P0的的displaydisplay地址作为连接数据之一传地址作为连接
19、数据之一传给给P2P239如果如果P2P2是一个真实过程,那么是一个真实过程,那么P0P0或者就是或者就是P1P1自身或者既是自身或者既是P1P1又是又是P2P2的直接外层(图的直接外层(图10.1810.18的的(a)(b(a)(b)两种情形),不两种情形),不论哪一种情形,只要在进入论哪一种情形,只要在进入P2P2后能够知道后能够知道P1P1的的displaydisplay就就能知道能知道P0P0的的displaydisplay,从而可直接构造出,从而可直接构造出P2P2的的displaydisplay。也。也就是说,在这种情况下,只需所就是说,在这种情况下,只需所P1P1的的displa
20、ydisplay地址作为连地址作为连接数据之一传送给接数据之一传送给P2P2就能够建立就能够建立P2P2的的displaydisplay4041如果如果P2P2是形式参数,那么调用是形式参数,那么调用P2P2意味着调用意味着调用P2P2当前相应的当前相应的实在过程实在过程此时的此时的P0P0应是这个实在过程的直接外层过程应是这个实在过程的直接外层过程假定假定P0P0的的displaydisplay地址可从形式单元地址可从形式单元P2P2所指示的地方获得所指示的地方获得为了能在为了能在P2P2中获得中获得P0P0的的displaydisplay地址,必须在地址,必须在P1P1调用调用P2P2时设
21、时设法把法把P1P1的的displaydisplay地址作为连接数据之一传送给地址作为连接数据之一传送给P2P242于是连接数据变为三项:于是连接数据变为三项:(1 1)老)老SPSP值;值;(2 2)返回地址;)返回地址;(3 3)全局)全局displaydisplay地址地址这样,整个活动记录的组织就如图这样,整个活动记录的组织就如图10.1710.17所示所示43三.分程序结构的存储管理v一个分程序是一个含有它自己的局部数据(变量)声明一个分程序是一个含有它自己的局部数据(变量)声明的语句的语句v在在C语言中,一个分程序的语法形式是:语言中,一个分程序的语法形式是:声明语句声明语句v例如
展开阅读全文