1 / 27
文档名称:

第08章 程序运行时的存储组织及管理.ppt

格式:ppt   大小:1,416KB   页数:27页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第08章 程序运行时的存储组织及管理.ppt

上传人:放射辐射 2022/11/25 文件大小:1.38 MB

下载得到文件列表

第08章 程序运行时的存储组织及管理.ppt

相关文档

文档介绍

文档介绍:该【第08章 程序运行时的存储组织及管理 】是由【放射辐射】上传分享,文档一共【27】页,该文档可以免费在线阅读,需要了解更多关于【第08章 程序运行时的存储组织及管理 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。第08章程序运行时的存储组织及管理
【通用模板】【教育说课】【述职报告】【工作汇报】

若在编译阶段就能确定源程序中各个数据实体的存储空间大小,则可以采用较简单的静态存储管理。
采用静态存储分配的语言必须满足下列条件:
1) 不允许过程有递归调用。
2) 不允许有可变大小的数据项,如可变数组或可变字符串。
3) 不允许用户动态建立数据实体。
满足上述条件的语言有FORTRAN、BASIC等。
8

右下图是一个FORTRAN程序模块在采用静态存储分配策略时的典型数据区格局。
隐式参数
(返回地址、寄存器内容等)
形式参数
简单变量
数组
临时变量
1)隐式参数主要用于和主调模块的通讯,在一般情况下这个参数可以是主调过程的返回地址,或在不能利用寄存器返回函数值时传回函数返回值。这些信息不会在程序中明显地出现,所以称为隐式参数。
2)形式参数部分存放相应实在参数的地址或值。
3)程序变量部分将作为简单变量、数组、记录以及编译程序所产生的临时变量的存储空间。
9
静态存储分配←→动态存储分配
静态存储分配
在编译阶段由编译程序实现对存储空间的管理,为源程序中的变量分配存储单元。
在编译时能够确定变量在运行时的数据空间大小
运行时不改变
动态存储分配
在目标程序运行阶段由目标程序实现对存储空间的组织与管理,为源程序中的变量分配存储单元。
在目标程序运行时进行分配
编译时为运行阶段设计好存储组织形式,即为每个数据项安排好它在数据区中的相对位置
10

栈式分配适用于允许递归调用的程序设计语言;
引入一运行栈,每调用一次过程,就把该过程的相应调用记录压入栈,过程执行完毕后再将其弹出栈;
进入时:在栈顶为其分配一个数据区
退出时:撤消过程数据区
动作:
1)申请
2)释放
3)嵌套调用
11
下面我们通过一段C程序的运行来说明运行栈的变化情况。设有C程序如下:
realx;…………………块1
intm1(intind)……………块2
{intx;
x=m2(ind+1);
}
intm2(intj)………………块3
{
{intf[10];……………块4
booltest1;
}
}
main()………………………块5
{intx;
x=2;
printf("%d\n",m1(x/5));
}
块4数据区
块3数据区
块2数据区
块5数据区
块1数据区
块3数据区
块2数据区
块5数据区
块1数据区
块2数据区
块5数据区
块1数据区
块5数据区
块1数据区
块1数据区
(a)(b)(c)(d)(e)
12
1、参数区参数区保存的内容包括:
1) 隐式参数:隐式参数常包含下列几项:
返回地址:主调程序中调用语句的下一条可执行语句的地址。
指向前一个活动记录起始位置的指针:该基地址指针存放该模块的主调模块的活动记录的基地址,用于确保控制返回主调过程时,能使运行环境恢复到调用前的格局。
函数返回值:有的隐式参数区包含此项,有的不包括,还有更好的处理返回值的方法。
2)显式参数:显式参数区是形式参数的通讯区。
形式参数的传递有传值、传地址、传名等方法。有些语言如PASCAL语言即可传值、也可传地址。C语言采用的是传值的方式,这种参数传递方法,实在参数的值将赋给形式参数。
当程序运行进入一个程序块时,就要在运行栈中为此程序块添加一个活动记录。活动记录中除了存储局部变量外,还包括一个参数区和一个display区。。
参数区
局部数据
DISPLAY
13
2、Display(嵌套层次显示表)区
display区用于保存对当前正在执行的模块来说是全局的程序变量区的信息,它由一系列地址指针所组成,每一个指针指向一个程序块的活动记录的开始位置,而这个程序块对于当前正在执行的程序块来说是全局的。
参数区
局部数据
DISPLAY
P的活动纪录的地址
Q的最新活动纪录的地址
R的现行活动纪录地址
2
1
0
例如,令过程R的外层为Q,Q的外层为P,则过程R运行时display表的内容应为:
14
(e)的运行栈中各活动记录的内容。
块4的活动记录如下:
DISPLAY区:指针d1和d2,分别指向全局变量区的地址Abp0和Abp3。
隐式参数区:有两个参数,第一个是返回地址,因块4不是一个独立的函数,是一嵌套的块程序,所以,没有返回地址,同样也没有形参,第2个参数Abp3表示在运行栈中,前一个活动记录是开始地址为Abp3的m2活动记录。
局部数据区:f和test。
abp2
os
无前记录
x
d1
abp0
x
d1
return2
abp1
ind
x
d1
return3
j
d1
d2
abp3
f
test
块4活动记录abp4
m2活动记录abp3
m1活动记录abp2
main活动记录abp1
abp0
15
递归过程的处理
下面程序的运行结果是什么?如果把第6行的(i+1)*fact()改成fact()*(i+1)的话,则程序的运行结果是有什么变化?试分析为什么会有这两种不同的结果。
intfact()
{staticinti=5;
if(i==0)return1;
else
{i--;
return((i+1)*fact());//第6行
}}
main()
{printf("factorof5!=%d\n",fact());}
16