第九章运行时空间组织_第1页
第九章运行时空间组织_第2页
第九章运行时空间组织_第3页
第九章运行时空间组织_第4页
第九章运行时空间组织_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章运行时空间组织第1页,共31页,2023年,2月20日,星期三程序单元 FORTRAN的子例程(subroutine) PASCAL的过程/函数(procedure/function) C的函数程序单元的激活(调用)与终止(返回)第2页,共31页,2023年,2月20日,星期三过程与活动过程的每一次运行(或执行)被称为一次活动(activation)。活动是一个动态的概念,除了设计为永不停机的过程(如操作系统等),或者是因设计错误而出现死循环的过程之外,任何过程的活动均有有限的生存期(lifetime)。程序单元的执行需要: 代码段+活动记录(程序单元运行所需的额外信息,如参数,局部数据,返回地址等)第3页,共31页,2023年,2月20日,星期三运行时内存划分代码段静态数据区栈(stack)

堆(heap)

大小可以静态确定全局/局部静态变量活动记录栈动态分配的数据第4页,共31页,2023年,2月20日,星期三活动记录

为了管理过程在一次执行中所需要的信息,使用一个连续的存储块,这个连续的存储块称为活动记录(Activationrecord)第5页,共31页,2023年,2月20日,星期三活动记录的结构及内容指针SP指向现行过程的活动记录在栈里的起始位置。TOP:活动记录的栈顶临时单元内情向量局部变量形式单元静态链动态链返回地址TOPSP编译将数组的有关信息记录在一些单元中,称为数组的“内情向量”。形式单元:存放相应的实在参数的地址或值。动态链:指向调用该过程前的最新活动记录地址的指针。运行时,使运行栈上各数据区按动态建立的次序结成链。链头为栈顶起始位置。静态链:指向静态直接外层最新活动记录地址的指针,用来访问非局部变量。第6页,共31页,2023年,2月20日,星期三常见的存储分配策略静态分配策略动态分配策略栈式动态分配策略堆式动态分配策略第7页,共31页,2023年,2月20日,星期三存储分配策略静态分配策略:如FORTRAN不允许过程递归不含可变体积的数据对象,或待定性质的名称因此编译时能完全确定每个数据项存储空间的位置情况动态分配策略:如PASCAL,C允许过程递归允许动态申请和释放存储空间因此,编译时不能完全确定数据项的性质,大小等,如,允许递归过程和可变数组,名字作用域和生存期满足分程序结构所限定的作用范围.第8页,共31页,2023年,2月20日,星期三动态分配策略栈式动态分配策略内存先申请先释放堆式动态分配策略内存申请和释放不遵循先请后放时,一般的处理方法是:让运行程序持有一个大存区(称为堆),凡申请者从堆中分给一块,凡释放者归还给堆第9页,共31页,2023年,2月20日,星期三动态存储分配---简单栈式要求:1,没有分程序结构;2,过程定义不允许嵌套;3,允许过程递规调用;第10页,共31页,2023年,2月20日,星期三C程序结构全局数据说明main( ){main中的数据说明}voidR( ){R中的数据说明}voidQ(){Q中的数据说明}第11页,共31页,2023年,2月20日,星期三C语言程序的存储组织第12页,共31页,2023年,2月20日,星期三C的活动记录连接数据(两项):老SP值(即前一活动记录的起始地址)返回地址;(2)参数个数;(3)形式单元(存放实在参数的值或地址);(4)过程的局部变量(简单变量)、数组的内情向量和临临时工作单元。第13页,共31页,2023年,2月20日,星期三C的活动记录临时工作单元内情向量简单变量形式单元参数个数返回地址老SP210TOPSP第14页,共31页,2023年,2月20日,星期三堆式动态存储分配堆变量堆空间的管理策略减少碎片的技术空间的释放第15页,共31页,2023年,2月20日,星期三需求:

一个程序语言允许用户自由地申请数据空间和退还数据空间,或者不仅有过程而且有进程(process)的程序结构。操作:堆提供两个操作,分配操作和释放操作情况:

经一段运行时间之后,这个大空间就必定被分划成许多块块,有些占用,有些无用(空闲)--碎片问题第16页,共31页,2023年,2月20日,星期三堆式动态储分配

当运行程序要求一块体积为N的空间时,我们应该分配哪一块给它呢?运行程序要求一块体积为N的空间,但发现没有比N大的空闲块了,然而所有空闲块的总和却要比N大得多。如果运行程序要求一块积为N的空间,但所有空闲块的总和也不够N,那又应怎么办呢?

有的管理系统采用一种叫做垃圾回收的办法来对付这种局面。即寻找那些运行程序己无用但尚未释放的占用块。第17页,共31页,2023年,2月20日,星期三堆管理堆空间的管理策略减少碎片的技术空间的释放第18页,共31页,2023年,2月20日,星期三堆空间的管理策略1定长块管理2变长块管理第19页,共31页,2023年,2月20日,星期三1定长块管理堆式动态储分配最简单的实现是按定长块进行。初始化时,将堆存储空间分成长度相等的若干块,每块中指定一个链域,按照邻块的顺序把所有块链成一个链表,用指针available指向链表中的第一块。分配时每次都分配指针available所指的块,然后available指向相邻的下一块。归还时,把所归还的块插入链表。考虑插入方便,可以把所归还的块插在available所指的块之前,然后available指向新归还的块。第20页,共31页,2023年,2月20日,星期三2变长块管理除了按定长块进行分配之外,还可以根据需要分配长度不同的存储块,可以随要求而变。按这种方法,初始化时存储空间是一个整块。按照用户的需要,分配时先是从一个整块里分割出满足需要的一小块,以后,归还时,如果新归还的块和现有的空间能合并,则合并成一块;如果不能和任何空闲块合并,则可以把空闲块链成一个链表。再进行分配时,从空闲块链表中找出满足需要的一块,或者整块分配出去,或者从该块上分割一小块分配出去。若空闲块表中有若干个满足需要的空闲块时,该分配哪一块呢?通常有三种不同的分配策略

第21页,共31页,2023年,2月20日,星期三不同的情况应采用不同的方法。通常在选择时需考虑下列因素:用户的要求;请求分配量的大小分布;分配和释放的频率以及效率对系统的重要等等。(1)首次满足法:只要在空闲块链表中找到满足需要的一块,就进行分配。(2)最优满足法:将空闲块链表中一个不小于申请块且最接近于申请块的空闲块分配给用户,则系统在分配前首先要对空闲块链表从头至尾描一遍,然后从中找出一块,为避免每次分配都要扫描整个链表,通常将空闲块链表空间的大小从小到大排序。(3)最差满足法:将空闲块表中不小于申请块且是最大的空闲的一部全分配给用户。此时的空闲块链表按空闲的块的大小从大到小排序。只需从链表中删除第一个结点,并将其中一部分分配给用户,而其它部分作为一个新的结点插入到空闲块表的适当置上去。第22页,共31页,2023年,2月20日,星期三减少碎片的技术1分配时,找最小的足够大的块---需保持空闲块的大小排序2释放时,合并任何相邻的块---搜索全部空闲块表,或其它算法3将堆变量紧缩在一起第23页,共31页,2023年,2月20日,星期三空间的释放1显式释放2隐式(自动)释放第24页,共31页,2023年,2月20日,星期三显式释放程序设计语言提供机制如:pascal:disposeC:free程序员必须编写分配和释放存储的明确的调用。第25页,共31页,2023年,2月20日,星期三堆式分配和释放的C语言描述#defineNULL0#defineMEMSIZE8096/*changefordifferentsizes*/typedeffdoubleAlign;typedefunionheader{struct{unionheader*next;unsignedusedsize;unsignedfreesize;}s;Aligna;}Header;//数据类型Header保存每个存储块的簿记信息staticHeadermem[MEMSIZE];staticHeader*memptr=NULL;void*malloc(unsignednbytes){Header*p,*newp;unsignednunits;nunits=(nbytes+sizeof(Header)-1/sizeof(Header)+1;if(memptr==NULL)第26页,共31页,2023年,2月20日,星期三{memptr->s.next=memptr=mem;memptr->s.usedsize=1;memptr->s.freesize=MEMSIZE-1;}for(p=memptr;(p->s.next!=memptr)&&(p->s.freesize<nunits);p=p->s.next);if(p->s.freesize<>nunits)returnNULL;/*noblockbigenough*/newp=p+p->s.usedsize;newp->s.usedsize=nunits;newp->s.freesize=p->s.freesize-nunits;第27页,共31页,2023年,2月20日,星期三newp->s.next=p->s.next;p->s.freesize=0;p->s.next=newp;memptr=newp;return(void*)(newp+1);}voidfree(void*ap){Header*bp,*p,*prev;bp=(Header*)ap–1;for(prev=memptr,p=memptr->s.next;(p!=bp)&&(p!=memptr);prev=p,p=p->s.next);if(p!=bp)return;/*corruptedlist,donothing*/prev->s.freesize+=p->s.usedsize+p->s.freesize;prev->s.next=p->s.next;memptr=prev;}第28页,共31页,2023年,2月20日,星期三堆的自动管理-----隐式存储回收在一种需要完全动态的运行时环境的语言(OO语言,函数式语言Lisp,ML)中,堆也必须类似地自动管理。自动存储器管理涉及到了前面分配的但不再使用的存储器的回收,可能是在它被分配的很久以后,而没有明确的对free的调用。这个过程称作垃圾回收(grabagecollection)。第29页,共31页,2023年,2月20日,星期三垃圾回收

垃圾回收程序---寻找可被引用的所有存储器并释所有未引用的存储器。在存储块不再引用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论