- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
存储组织 运行时刻的存储空间会划分成多个区:代码区、静态数据区、栈区和堆区. 代码区存储产生的目标代码 一些数据对象所需的存储空间大小在编译时可以确定,它们可以放在静态数据区 栈中存储活动记录,活动记录是由过程调用产生 栈和堆, 放在剩余地址空间的相对两端,这些区域是动态的,且向对方增长 在实践中,栈向低址增长,而堆向高址增长.为了在例子中使用正偏移量,我们假定栈向高址方向增长 存储分配策略 两种运行时刻存储分配策略: 静态分配 在程序开始时,分配所有需要的空间 在程序结束执行时,释放所有空间 动态分配(栈和堆) 需要时,分配空间 不再需要时,释放空间 过程 过程是一组动作或者计算的抽象 过程体作为一个整体由其名字表示,通过提供一个说明以及一个实体来定义 一个过程通过它的名字和实参被调用 intswap(a,b) 过程调用 调用过程时,控制转移到被调过程的过程体开端 当执行到达过程体的末端时,控制返回给主调过程 有些语言可以使用return语句提前返回 控制进入过程时,由主调过程的活跃状态转移到被调过程的活跃状态。 从被调过程返回时,控制返回主调过程,转移到主调过程的活跃状态 过程调用引发局部变量的内存分配 分配给过程体内局部对象的存储空间称为过程的活动记录,它在控制返回主调过程时释放 活动树 过程体的一次执行称为该过程的一个活动 过程的生存期:执行过程的第一条指令和最后一条指令之间的时间 活动树描述了控制进入和离开各个活动的过程 每个结点描述了某个过程的一个活动。 根描述了主程序的活动。 若控制从活动a转向b,则活动树上a至b存在一条边。 结点a在结点b的左边当且仅当a的生存期在b的生存期之前。 两个过程的生命期可能互不相交或嵌套 活动树(例) 可以使用控制栈(运行栈、活动记录栈)来保存当前时刻活动记录的情况 活动树(例) 对于每次执行,均可得到一个活动树 活动记录的内容 访问链:当前过程需要位于其它地方(如另一个活动记录)的某个数据时,通过访问链来定位 控制链:源自被调过程的活动记录,指向主调过程的活动记录 活动记录(例) 过程f的活动记录顺序包含以下元素:(返回值, 参数n, 局部变量s, 局部变量 t ); 以下问题假设最初调用为 f(5). a)给出完整的活动树. b)请给出f (1)(第1次)即将返回时的栈和活动记录情况。 c)请给出f (1)(第5次)即将返回时的栈和活动记录情况 活动记录(例) 活动树 活动记录(例) f(1)第一次返回时 活动记录(例) f(1)第五次返回时 调用序列和返回序列 调用序列(调用代码序列)calling sequence 为新活动记录在栈中分配空间,并在活动记录的各个字段中填写必需的信息。 返回序列(返回代码序列)return sequence 恢复机器状态,使得主调过程能够在被调过程结束时,返回并继续正常执行。 调用序列(II) 设计原则 调用者和被调用者之间传递的值(实参和返回值)放在被调过程活动记录的开始位置 主调过程不需要知道被调过程活动记录的布局 定长项目(控制链、访问链、机器状态)放在中间 早期不知大小的项目(动态数组、临时变量)置于活动记录的底部。 确定栈顶指针top_sp所指位置 指向活动记录固定长度字段的末端 调用序列(III) 栈顶指针top-sp指向栈顶活动记录中机器状态字段的末端 调用序列(IV) 调用序列职责分配: 主调者计算实在参数的值 主调者将返回地址和原来的top_sp值存放到被调者活动记录中,然后,主调者增加top_sp值,指向被调者机器状态字段末端 被调者保存寄存器值和其它状态信息 被调者初始化其局部数据并开始执行 返回序列(V) 返回代码序列职责分配: 被调者将返回值放到与实在参数相邻的位置。 使用机器状态字段中的信息,被调者恢复top_sp和其它寄存器,然后跳转到主调者放在机器状态字段中的返回地址 尽管top_sp已经减小,但主调者知道返回值相对于当前top_sp的位置,可以使用返回值 栈中的变长数据 调用序列(例) 下面是两个C语言函数f和g的概述 int f(int x) { int i; … return i+1;…} int g(int y){int j; … f(j+1)…} 画出g调用f ,而f即将返回时,运行时刻栈中从g的活动记录开始的顶端部分。 要求: (1)只考虑返回值、参数、控制链以及存放局部数据的空间 (2)指出哪个函数在栈中为哪个元素创建了所使用的空间,哪个函数写入了各个元素的值,这些元素属于哪个活动记录 调用序列(例) 环境与状态 程序运行时发生的两种改变 状态改变:影响数据的值 环境改变:影响对数据名字的解释。 环境environment是从名字到存储空间的映射。 状态state是从存储位置到它们的值的映射。
文档评论(0)