运行时的存储组织
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译时能确定的 全程/静态数据区用以存放编译时能确定所占用空间
的数据 堆/栈区用于可变数据以及管理过程活动的控制信息
目标代码区
全程/静态数据 区
栈
↑ 自由空间
↓ 堆
8.1 运行时存储空间的划分
过程的活动记录
过程的活动记录是一段连续的存储区,用来 存放过程的一次执行所需要的信息。 自变量(参数空间) 返回地址 用作局部数据的空间 用作局部临时变量的空间
8.2 过程活动记录
v编译程序分配目标程序运行时的数据空间的基本依据是 程序语言设计时对程序运行中存储空间的使用和管理办 法的规定
v在程序设计语言语义学中,使用environment表示将一个 名字映射到一个存储位置的函数,state表示存储位置到 值的映射,如图所示:
数据空间的使用和管理方法分成三种: 静态存储分配 栈式动态存储分配 堆式动态存储分配
运行时的存储组织
知 识 结 构
8.1 概述
从逻辑上看,代码生成前,编译程序必须进行 目标程序运行环境的设计和数据空间的分配
所谓运行时的环境是指目标计算机的寄存器和 存储器的结构,以及用来管理存储器并保存执 行过程所需要的信息。
几乎所有的程序设计语言都使用3种类型的存 储环境:完全静态环境、基于栈的存储环境和 基于堆的存储环境中的一种或几种。
这种分配策略是将整个程序的数据空间 图给出了进入过程exchange之后运行栈的示意,仅
图中描述了该程序中局部变量的静态存储位置:
设计为一个栈 用作局部临时变量的空间
SP:总是指向现行过程活动记录的起点
(19) NEXT=1
Program TEST 那么当运行程序要求一块体积为N的空间时,需要决定应该从哪个空闲块得到这个空间。
TEMP=TEMP+A(K) 16(a)-(d)分别说明上述四种情形的运行栈和display
(19) NEXT=1 下每个单元依次存放着现行层,直接外层,……直至最 一种跟踪方法是:在过程活动记录中增设存取链,指向包 主程序执行语句 //主程序体 指在编译时对数据对象分配固定的存储位置,运行时始终不变。 即一旦存储空间的某个位置分配给了某个数据名,则在目标程序的整个运行过程中,此位置(地址)就属于该数据名。 可以引用sort中定义的变量a和x。
TEMP 0,0 DO 10K=1,SIZE TEMP=TEMP+A(K) 10 CONTINUE QMEAN=TEMP/SIZE RETURN END ……
MAXSIZE
TABLE(1)…(10) TEMP
3 A
SIZE QMEAN 返回地址 TEMP
K
代 码 区 静 态 数 据 区
8.2 静态存储分配
(12) CHARACTER FUNCTION PRDUCE() (13)CHARACTER * 80 BUFFER (14) INTEGER NEXT (15) SAVE BUFFER, NEXT
//PRDUCE函数体所拥有的静态量BUFFER, NEXT (16) DATA NEXT /81/ (17) IF (NEXT .GT.80)THEN (18) READ ( * ,' (A)' )BUFFER (19) NEXT=1 (20) END IF (21) PRDUCE=BUFFER(NEXT:NEXT) (22) NEXT=NEXT+1 (23) END
8.1 概述
从逻辑上看,代码生成前,编译程序必 须进行目标程序运行环境的设计和数据 空间的分配
数据空间包括:用户定义的各种类型的 数据对象(变量和常量)所需的存储空 间,作为保留中间结果和传递参数的临 时工作单元,调用过程时所需的连接单 元,组织输入/输出所需的缓冲区。
8.1 概述
存储管理复杂度取决于源语言本身,具体包 括:
静态存储分配
指在编译时对数据对象分配固定的存储位置, 运行时始终不变。即一旦存储空间的某个位置 分配给了某个数据名,则在目标程序的整个运 行过程中,此位置(地址)就属于该数据名。
由静态存储分配产生的数据区称为静态数据区 。
静态存储分配适用于不允许递归过程或递归调 用,不允许可变体积的数据结构的语言
1. 允许的数据类型的多少 2. 语言中允许的数据项是 静态确定
动态确定 3. 程序决定名字的作用域的规则和结构
① 段结构 ② 过程定义不嵌套,只允许过程递归调用 ③ 分程序结构 分程序嵌套
过程定义嵌套
存储区划分成:目标区、静态数据区、栈区、堆区: 目标代码区用以存放目标代码,这是固定长度的,即
静态存储分配的特点:简单、易于实现 例:FORTRAN语言,它所有的数据都属于这一
类。
静态存储பைடு நூலகம்配
例:FORTRAN程序
主程序段
主过程
Program TEST
……
END
附加过程
SUBROUTINE LADD(A,SIZE,QMEAN) COMMON MAXSIZE INTEGER MAXSIZE,SIZE REAL A(SIZE),QMEAN,TEMP INTEGER K
v静态存储分配:在编译时能确定目标程序运行中所需的 全部数据空间的大小,编译时安排好目标程序运行时的 全部数据空间,确定每个数据对象的存储位置
v 图给出一个FORTRAN77的程序例子: (1) PROGRAM CNSUME (2) CHARACTER * 50 BUF //程序体所拥有的静态量BUF (3) INTEGER NEXT //程序体所拥有的静态量NEXT (4) CHARACTER C, PRDUCE //程序体所拥有的静态量C (5) DATA NEXT /1/, BUF / ' ' / (6) C=PRDUCE() (7) BUF(NEXT:NEXT)=C (8) NEXT=NEXT+1 (9) IF(C .EN. ' ' )GOTO 6 (10) WRITE ( * ,' (A)' )BUF (11) END
v图中描述了该程序中局部变量的静态存储位置:
动态存储分配
如果一个程序设计语言允许递归过程、 可变数组或允许用户自由申请和释放空 间,那么,就需要采用动态存储管理技 术
栈式动态存储分配
11的程序,假定有如下四种调用情况: 这种分配策略是将整个程序的数据空间设计为一个栈 从逻辑上看,代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配
的数据 堆/栈区用于可变数据以及管理过程活动的控制信息
目标代码区
全程/静态数据 区
栈
↑ 自由空间
↓ 堆
8.1 运行时存储空间的划分
过程的活动记录
过程的活动记录是一段连续的存储区,用来 存放过程的一次执行所需要的信息。 自变量(参数空间) 返回地址 用作局部数据的空间 用作局部临时变量的空间
8.2 过程活动记录
v编译程序分配目标程序运行时的数据空间的基本依据是 程序语言设计时对程序运行中存储空间的使用和管理办 法的规定
v在程序设计语言语义学中,使用environment表示将一个 名字映射到一个存储位置的函数,state表示存储位置到 值的映射,如图所示:
数据空间的使用和管理方法分成三种: 静态存储分配 栈式动态存储分配 堆式动态存储分配
运行时的存储组织
知 识 结 构
8.1 概述
从逻辑上看,代码生成前,编译程序必须进行 目标程序运行环境的设计和数据空间的分配
所谓运行时的环境是指目标计算机的寄存器和 存储器的结构,以及用来管理存储器并保存执 行过程所需要的信息。
几乎所有的程序设计语言都使用3种类型的存 储环境:完全静态环境、基于栈的存储环境和 基于堆的存储环境中的一种或几种。
这种分配策略是将整个程序的数据空间 图给出了进入过程exchange之后运行栈的示意,仅
图中描述了该程序中局部变量的静态存储位置:
设计为一个栈 用作局部临时变量的空间
SP:总是指向现行过程活动记录的起点
(19) NEXT=1
Program TEST 那么当运行程序要求一块体积为N的空间时,需要决定应该从哪个空闲块得到这个空间。
TEMP=TEMP+A(K) 16(a)-(d)分别说明上述四种情形的运行栈和display
(19) NEXT=1 下每个单元依次存放着现行层,直接外层,……直至最 一种跟踪方法是:在过程活动记录中增设存取链,指向包 主程序执行语句 //主程序体 指在编译时对数据对象分配固定的存储位置,运行时始终不变。 即一旦存储空间的某个位置分配给了某个数据名,则在目标程序的整个运行过程中,此位置(地址)就属于该数据名。 可以引用sort中定义的变量a和x。
TEMP 0,0 DO 10K=1,SIZE TEMP=TEMP+A(K) 10 CONTINUE QMEAN=TEMP/SIZE RETURN END ……
MAXSIZE
TABLE(1)…(10) TEMP
3 A
SIZE QMEAN 返回地址 TEMP
K
代 码 区 静 态 数 据 区
8.2 静态存储分配
(12) CHARACTER FUNCTION PRDUCE() (13)CHARACTER * 80 BUFFER (14) INTEGER NEXT (15) SAVE BUFFER, NEXT
//PRDUCE函数体所拥有的静态量BUFFER, NEXT (16) DATA NEXT /81/ (17) IF (NEXT .GT.80)THEN (18) READ ( * ,' (A)' )BUFFER (19) NEXT=1 (20) END IF (21) PRDUCE=BUFFER(NEXT:NEXT) (22) NEXT=NEXT+1 (23) END
8.1 概述
从逻辑上看,代码生成前,编译程序必 须进行目标程序运行环境的设计和数据 空间的分配
数据空间包括:用户定义的各种类型的 数据对象(变量和常量)所需的存储空 间,作为保留中间结果和传递参数的临 时工作单元,调用过程时所需的连接单 元,组织输入/输出所需的缓冲区。
8.1 概述
存储管理复杂度取决于源语言本身,具体包 括:
静态存储分配
指在编译时对数据对象分配固定的存储位置, 运行时始终不变。即一旦存储空间的某个位置 分配给了某个数据名,则在目标程序的整个运 行过程中,此位置(地址)就属于该数据名。
由静态存储分配产生的数据区称为静态数据区 。
静态存储分配适用于不允许递归过程或递归调 用,不允许可变体积的数据结构的语言
1. 允许的数据类型的多少 2. 语言中允许的数据项是 静态确定
动态确定 3. 程序决定名字的作用域的规则和结构
① 段结构 ② 过程定义不嵌套,只允许过程递归调用 ③ 分程序结构 分程序嵌套
过程定义嵌套
存储区划分成:目标区、静态数据区、栈区、堆区: 目标代码区用以存放目标代码,这是固定长度的,即
静态存储分配的特点:简单、易于实现 例:FORTRAN语言,它所有的数据都属于这一
类。
静态存储பைடு நூலகம்配
例:FORTRAN程序
主程序段
主过程
Program TEST
……
END
附加过程
SUBROUTINE LADD(A,SIZE,QMEAN) COMMON MAXSIZE INTEGER MAXSIZE,SIZE REAL A(SIZE),QMEAN,TEMP INTEGER K
v静态存储分配:在编译时能确定目标程序运行中所需的 全部数据空间的大小,编译时安排好目标程序运行时的 全部数据空间,确定每个数据对象的存储位置
v 图给出一个FORTRAN77的程序例子: (1) PROGRAM CNSUME (2) CHARACTER * 50 BUF //程序体所拥有的静态量BUF (3) INTEGER NEXT //程序体所拥有的静态量NEXT (4) CHARACTER C, PRDUCE //程序体所拥有的静态量C (5) DATA NEXT /1/, BUF / ' ' / (6) C=PRDUCE() (7) BUF(NEXT:NEXT)=C (8) NEXT=NEXT+1 (9) IF(C .EN. ' ' )GOTO 6 (10) WRITE ( * ,' (A)' )BUF (11) END
v图中描述了该程序中局部变量的静态存储位置:
动态存储分配
如果一个程序设计语言允许递归过程、 可变数组或允许用户自由申请和释放空 间,那么,就需要采用动态存储管理技 术
栈式动态存储分配
11的程序,假定有如下四种调用情况: 这种分配策略是将整个程序的数据空间设计为一个栈 从逻辑上看,代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配