块内存的背后原理是什么,从操作系统android 内存管理理来说明

操作系统内存管理原理_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
操作系统内存管理原理
&&从最底层介绍操作系统内存管理原理
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢malloc申请一块内存的背后原理是什么,从操作系统内存管理来说明? - 知乎199被浏览9300分享邀请回答14添加评论分享收藏感谢收起温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
每个人都认为世界不公平 所以 世界公平了
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7078)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_094071',
blogTitle:'操作系统管理内存的机制——为什么要设置虚拟内存?',
blogAbstract:'在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。一 早期的内存分配机制&&&&&&& 在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:6,
mainCommentCount:3,
recommendCount:5,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'每个人都认为世界不公平 所以 世界公平了',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
操作系统内存管理讲解.ppt 68页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:300 &&
你可能关注的文档:
··········
··········
* 5.5.5请求段页式管理的实现原理 地址的构成 逻辑上分段:便于共享和保护 虚地址组成(二维):段号、段内位移(页号、页内位移)
内存分块:便于分配和内存的利用。
分解为 * 段表、段页表(页表) 段号 状态 页表大小 页表起址 给进程分配的段表 页号 状态 块号 给第X段分配的页表(段页表) * 地址变换过程 进程A对应的程序空间 分段 0 1 2 给进程A分配的段表 段页式内存管理的段表、页表和内存的关系 逻辑上分段 物理上分块 * 段页式管理地址映射 根据程序的逻辑地址得到段号和段内位移,并将段内位移根据页容量分解为页号和页内位移。 根据该进程的段表寄存器得到段表起始地址,在段表中查找该段号的表项,得到页表起始地址。 根据页号在页表中查找该页对应的内存块号。 根据块号计算得到该块的起始地址。 将块的起始地址加上页内位移,得到物理地址。 * 段页式存储管理中每次存取须经过三次主存访问 第一次:访问段表,得到页表起始地址; 第二次:访问页表,得到主存块号; 第三次:存取 。 * 作业 习题P135:5.19 * 请求页式管理的调入策略 预测调页:分析预测,运行前调入 系统根据作业运行的情况,预测哪些页将要运行,在其运行之前先行调入内存,这样在程序运行的过程中就不会出现缺页中断。 缺点:系统无法预计系统中作业的运行情况,难以实现。 请求调页(请求分页):缺页请求,运行时调入 进程在执行的过程中,发现要执行的程序或处理的数据不在内存,向系统提出调入相应程序的请求,系统响应用户的请求将它所请求的页调入内存。
* 请求页式管理的页表结构 页表:反映该页是否在内存,在外存的位置,在内存的时间的长短,是否需要回写等。 页号: 块号: 中断位:0 表示该页在内存,1示该页不在内存(需要缺页中断) 辅存地址:该页在辅存的位置 修改位:0 表示该页调入内存后没有修改,1表示页调入内存后修改过 引用位:0 表示最近没有被访问,1表示最近被访问过
引用位 请求分页的页表结构 …… * 补充:多级页表 二级页表 问题:页表占用存储空间太大 解决:将页表也分页后,对页表占用的存储空间的分配也采用动态方式分配(部分分配),提高内存利用率。 页表页:将页表分页,称为页表页,大小与页面长度相同。 页目录表:为页表页建立的地址索引表称为页目录表。 二级页表机制:页目录表是一级页表、页表页是二级页表,共同构成二级页表机制。 * 二级页表结构 * 具有二级页表的地址结构 * 二级页表机制的地址变换 * 5.4.4 请求页式管理的页面置换算法 当要将辅存中的一页面并送入到全满的内存中时,必须把已在内存中的某一页淘汰掉。用来选择淘汰哪一页的规则叫做置换算法,也称为淘汰算法。 常用算法: 先进先出算法FIFO:淘汰先调入内存的页 最久未使用淘汰算法LRU:淘汰未被访问的页中时间最长的页 最近未使用淘汰算法NUR:淘汰第1个最近未被访问的页(淘汰页表中第一个访问位为0的页) 最不经常使用页面淘汰算法(LFU):淘汰那些到当前时间为止访问次数最少的页。页表中增加一个访问记数器。
最佳算法:当要调入一新页而必须淘汰一旧页时,所淘汰的页是以后不再使用的,或者是以后相当长的时间内不会使用的。这种算法是不可能的。 页面淘汰算法优劣的衡量标准:缺页中断率f’ f’=f/a (a是总的页面访问次数,f是缺页中断次数) * 【例】一个进程已分到4个页帧(块)(M=4),其页表如下表所示,当进程访问第4页时产生缺页中断,请分别用FIFO、LRU、NRU算法决定将哪一页淘汰?是否需要回写?
最近访问时间
1 FIFO:淘汰最先调入的页面(页帧为3的
正在加载中,请稍后...操作系统内存管理
我的图书馆
操作系统内存管理
1. 内存管理方法
&&&&&&&&内存管理主要包括虚地址、地址变换、内存分配和回收、内存扩充、内存共享和保护等功能。&
2. 连续分配存储管理方式
&&&&&&连续分配是指为一个用户程序分配连续的内存空间。连续分配有单一连续存储管理和分区式储管理两种方式。
2.1 单一连续存储管理
&&&&&在这种管理方式中,内存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。/和.以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求内存空间少的程序,造成内存浪费;程序全部装入,使得很少使用的程序部分也占用定数量的内存。
2.2 分区式存储管理
&&&&&& 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。
&&&&&& 分区式存储管理引人了两个新的问题:内碎片和外碎片。
&&&&&&内碎片是占用分区内未被利用的空间,外碎片是占用分区之间难以利用的空闲分区通常是小空闲分区。
&&&&&& 为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态是否已分配。
&&&&& 分区式存储管理常采用的一项技术就是内存紧缩
2.2.1 固定分区(nxedpartitioning)。
&&&&&&& 固定式分区的特点是把内存划分为若干个固定大小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行处理多个类型相同的对象。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
&&&&&&优点:易于实现,开销小。
&&&&&&缺点主要有两个:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。
2.2.2动态分区(dynamic partitioning)。
&&&&&&&&动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎片。但它却引入了另一种碎片外碎片。动态分区的分区分配就是寻找某个空闲分区,其大小需大于或等于程序的要求。若是大于要求,则将该分区分割成两个分区,其中一个分区为要求的大小并标记为占用,而另一个分区为余下部分并标记为空闲。分区分配的先后次序通常是从内存低端到高端。动态分区的分区释放过程中有一个要注意的问题是,将相邻的空闲分区合并成一个大的空闲分区。
下面列出了几种常用的分区分配算法:
&&&&&&&&最先适配法:按分区在内存的先后次序从头查找,找到符合要求的第一个分区进行分配。该算法的分配和释放的时间性能较好,较大的空闲分区可以被保留在内存高端。但随着低端分区不断划分会产生较多小分区,每次分配时查找时间开销便会增大。
&&&&&&&下次适配法:按分区在内存的先后次序,从上次分配的分区起查找到最后区时再从头开始,找到符合要求的第一个分区进行分配。该算法的分配和释放的时间性能较好,使空闲分区分布得更均匀,但较大空闲分区不易保留。
&&&&&&&最佳适配法:按分区在内存的先后次序从头查找,找到其大小与要求相差最小的空闲分区进行分配。从个别来看,外碎片较小;但从整体来看,会形成较多外碎片优点是较大的空闲分区可以被保留。
&&&&&&&最坏适配法:按分区在内存的先后次序从头查找,找到最大的空闲分区进行分配。基本不留下小空闲分区,不易形成外碎片。但由于较大的空闲分区不被保留,当对内存需求较大的进程需要运行时,其要求不易被满足。
&2.3 伙伴系统
&&&&&&&&固定分区和动态分区方式都有不足之处。固定分区方式限制了活动进程的数目,当进程大小与空闲分区大小不匹配时,内存空间利用率很低。动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。伙伴系统方式是对以上两种内存方式的一种折衷方案。
&&&&&&& 伙伴系统规定,无论已分配分区或空闲分区,其大小均为 2 的 k 次幂,k 为整数, l≤k≤m,其中:
&&&&&&& 2^1 表示分配的最小分区的大小,
&&&&&&& 2^m 表示分配的最大分区的大小,
&&&&&&& 通常 2^m是整个可分配内存的大小。&
&&&&&&& 假设系统的可利用空间容量为2^m个字, 则系统开始运行时, 整个内存区是一个大小为2^m的空闲分区。在系统运行过中,&由于不断的划分,可能会形成若干个不连续的空闲分区,将这些空闲分区根据分区的大小进行分类,对于每一类具有相同大小的所有空闲分区,单独设立一个空闲分区双向链表。这样,不同大小的空闲分区形成了k(0≤k≤m)个空闲分区链表。&
&&&&&&&分配步骤:
&&&&&&&当需要为进程分配一个长度为n 的存储空间时:
&&&&&& 首先计算一个i 值,使 2^(i-1) &n ≤ 2^i,
&&&&&& 然后在空闲分区大小为2^i的空闲分区链表中查找。
&&&&&& 若找到,即把该空闲分区分配给进程。
&&&&&& 否则,表明长度为2^i的空闲分区已经耗尽,则在分区大小为2^(i+1)的空闲分区链表中寻找。
&&&&& &若存在&2^(i+1)的一个空闲分区,则把该空闲分区分为相等的两个分区,这两个分区称为一对伙伴,其中的一个分区用于配,&& 而把另一个加入分区大小为2^i的空闲分区链表中。
&&&&&& 若大小为2^(i+1)的空闲分区也不存在,则需要查找大小为2^(i+2)的空闲分区, 若找到则对其进行两次分割:
&&&&&&&&&&&&& 第一次,将其分割为大小为&2^(i+1)的两个分区,一个用于分配,一个加入到大小为&2^(i+1)的空闲分区链表中;
&&&&&&&&&&&&& 第二次,将第一次用于分配的空闲区分割为&2^i的两个分区,一个用于分配,一个加入到大小为&2^i的空闲分区链表中。
&&&&& 若仍然找不到,则继续查找大小为&2^(i+3)的空闲分区,以此类推。
&&&&&&由此可见,在最坏的情况下,可能需要对 2^k的空闲分区进行 k 次分割才能得到所需分区。
&&&&& 与一次分配可能要进行多次分割一样,一次回收也可能要进行多次合并,如回收大小为2^i的空闲分区时,若事先已存在2^i的空闲分区时,则应将其与伙伴分区合并为大小为2^i+1的空闲分区,若事先已存在2^i+1的空闲分区时,又应继续与其伙伴分区合并为大小为2^i+2的空闲分区,依此类推。
&&&&&&& 在伙伴系统中,其分配和回收的时间性能取决于查找空闲分区的位置和分割、合并空闲分区所花费的时间。与前面所述的多种方法相比较,由于该算法在回收空闲分区时,需要对空闲分区进行合并,所以其时间性能比前面所述的分类搜索算法差,但比顺序搜索算法好,而其空间性能则远优于前面所述的分类搜索法,比顺序搜索法略差。 需要指出的是,在当前的操作系统中,普遍采用的是下面将要讲述的基于分页和分段机制的虚拟内存机制,该机制较伙伴算法更为合理和高效,但在多处理机系统中,伙伴系统仍不失为一种有效的内存分配和释放的方法,得到了大量的应用。
&2.4 内存紧缩
&&&&&&&&&&内存紧缩:将各个占用分区向内存一端移动,然后将各个空闲分区合并成为一个空闲分区。
&&&&&&& 这种技术在提供了某种程度上的灵活性的同时,也存在着一些弊端,例如:对占用分区进行内存数据搬移占用间;如果对占用分区中的程序进行浮动,则其重定位需要硬件支持。
&&&&&&&&&&紧缩时机:每个分区释放后,或内存分配找不到满足条件的空闲分区时。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图8.12
&&&&&&堆结构的存储管理的分配算法:
&&&&& 在动态存储过程中,不管哪个时刻,可利用空间都是-一个地址连续的存储区,在编译程序中称之为"堆",每次分配都是从这个可利用空间中划出一块。其实现办法是:设立一个指針,称之为堆指针,始终指向堆的最低(或锻联)地址。当用户申请N个单位的存储块时,堆指针向高地址(或 低地址)称动N个存储单位,而移动之前的堆指针的值就是分配给用户的占用块的初始地址。例如,某个串处理系统中有A、B、C、D这4个串,其串值长度分别為12,6,10和8. 假设堆指针free的初值为零,则分配给这4个串值的存储空间的初始地址分别为0.12.18和
28,如图8.12(a)和(b)所示,分配后的堆指针的值为36。 因此,这种堆结构的存储管理的分配算法非常简单,
&&&&&释放内存空间执行内存紧缩:
&&&& 回收用户释放的空闲块就比较麻烦.由于系统的可利用空间始终是一个绝址连续的存储块,因此回收时必须将所释放的空间块合并到整个堆上去才 能重新使用,这就是"存储策缩"的任务.通常,有两种做法:
&&&&& 一种是一旦有用户释放存储块即进行回收紧缩,例始,图8.12 (a)的堆,在c串释放存储块时即回收紧缩,例如图8.12 (c)的堆,同时修改串的存储映像成图8.12(d)的状态;
&&&& 另一种是在程序执行过程中不回收用户随时释放的存储块,直到可利用空同不够分配或堆指针指向最高地址时才进行存储紧缩。此时紧缩的目的是将堆中所有的空间块连成一块,即将所有的占用块部集中到 可利用空间的低地地区,而剩余的高地址区成为一整个地继连续的空闲块,如图8.13所示,其中(a)为紧缩前的状态,(b)为紧缩后的状态·
&&&&&&&&&&&&&&&&&&&&&图8.13& a 紧缩前 b紧缩后
&&&&&&&和无用单元收集类似,为实现存储紫编,首先要对占用块进行“标志”,标志算法和无用单元收集类同(存储块的结构可能不同),其次需进行下列4步雄作:
&&&&&&(1)计算占用块的新地址。从最低地址开始巡査整个存储空间,对每一个占用块找到它在紧缩后的新地址。 为此,需设立两个指针随巡查向前移动,这两个指针分别指示占用 块在紧缩之前和之后的原地址和新地址。因此,在每个占用块的第-·个存储单位中,除了 设立长度域(存储该占用换的大小)和标志域(存储区别该存储块是占用块或空闲块的标 志)之外,还需设立一个新地址城,以存储占用块在紧缩后应有的新地址,即建立一张新, 旧地址的对照表m
&&&&& &(2)修改用户触初始变量表,以便在存储紧缩后用户程序能继续正常运行*。
&&&&& &(3)检查每个占用块中存储的数据, 若有指向其他存储换的指针,则需作相应修改.
&&&&& &(4)将所有占用块迁移到新地址走,这实质上是作传送数据的工作。
&&&&& &至此,完成了存储紧缩的操作,最后,将堆指针赋以新值(即紧缩后的空闲存储区的最低地址)。
&&&&&& 可见,存储紧缩法比无用单元收集法更为复杂,前者不仅要传送数据(进行占用块迁移),而且还有需要修改所有占用块中的指针值。因此,存储紧缩也是个系统操作,且非不得已就不用。
3. 覆盖和交换技术
&3.1 覆盖技术
&&&&&&& 引入覆盖技术的目标是在较小的可用内存中运行较大的程序。这种技术常用于多道程序系统之中,与分区式存储管理配合使用。
&&&&&&&覆盖技术的原理:一个程序的几个代码段或数据段,按照时间先后来占用公共的内存空间。将程序必要部分常用功能的代码和数据常驻内存;可选部分不常用功能平时存放在外存覆盖文件中,在需要时才装入内存。不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖。
&&&&& &在任何时候只在内存中保留所需的指令和数据;当需要其它指令时,它们会装入到刚刚不再需要的指令所占用的内存空间;
&&&&&&&如在同一时刻,CPU只能执行B,C中某一条。B,C之间就可以做覆盖。
&&&&&&&覆盖技术的缺点是编程时必须划分程序模块和确定程序模块之间的覆盖关系,增加编程复杂度;从外存装入覆盖文件,以时间延长换取空间节省。
&&&&& 覆盖的实现方式有两种:以函数库方式实现或操作系统支持。
3.2 交换技术
&&&&&&交换技术在多个程序并发执行时,可以将暂时不能执行的程序(进程)送到外存中,从而获得空闲内存空间来装入新程序(进程),或读人保存在外存中而处于就绪状态的程序。交换单位为整个进程的地址空间。交换技术常用于多道程序系统或小型分时系统中,因为这些系统大多采用分区存储管理方式。与分区式存储管理配合使用又称作对换或滚进/滚出/。
&&&&&&原理:暂停执行内存中的进程,将整个进程的地址空间保存到外存的交换区中(换出swap out),而将外存中由阻塞变为就绪的进程的地址空间读入到内存中,并将该进程送到就绪队列(换入swap in)。
&&&&&交换技术优点之一是增加并发运行的程序数目,并给用户提供适当的响应时间;与覆盖技术相比交换技术另一个显著的优点是不影响程序结构。交换技术本身也存在着不足,例如:对换人和换出的控制增加处理器开销;程序整个地址空间都进行对换,没有考虑执行过程中地址访问的统计特性。
3.3 覆盖与交换比较
&&&&&& 1)与覆盖技术相比,交换不要求程序员给出程序段之间的覆盖结构。
&&&&&&&2)交换主要是在进程与作业之间进行,而覆盖则主要在同一作业或进程内进行。 另外覆盖只能覆盖那些与覆盖程序段无关的程序段。
4. 页式和段式存储管理
&&&&&&&&&在前面的几种存储管理方法中,为进程分配的空间是连续的,使用的地址都是物理地址。如果允许将一个进程分散到许多不连续的空间,就可以避免内存紧缩,减少碎片。基于这一思想,通过引入进程的逻辑地址,把进程地址空间与实际存储空间分离,增加存储管理的灵活性。地址空间和存储空间两个基本概念的定义如下:
地址空间:将源程序经过编译后得到的目标程序,存在于它所限定的地址范围内,这个范围称为地址空间。地址空间是逻辑地址的集合。
存储空间:指主存中一系列存储信息的物理单元的集合,这些单元的编号称为物理地址存储空间是物理地址的集合。
根据分配时所采用的基本单位不同,可将离散分配的管理方式分为以下三种:
页式存储管理、段式存储管理和段页式存储管理。其中段页式存储管理是前两种结合的产物。
5. 页式存储管理
4.1 基本原理
&&&&&&&&将程序的逻辑地址空间划分为固定大小的页,而物理内存划分为同样大小的页框。程序加载时,可将任意一页放人内存中任意一个页框,这些页框不必连续,从而实现了离散分配。该方法需要的硬件支持,来实现逻辑地址和物理地址之间的映射。在页式存储管理方式中地址结构由两部构成,前一部分是页号,后一部分为页内地址w(位移量),如图所示:
&&&&& 页式管理方式的优点是:
&&&&&& 1)没有外碎片,每个内碎片不超过页大比前面所讨论的几种管理方式的最大进步是,
&&&&&&&2)一个程序不必连续存放。
&&&&&&&3)便于改变程序占用空间的大小主要指随着程序运行,动态生成的数据增多,所要求的地址空间相应增长。
&&&&& 缺点是:要求程序全部装入内存,没有足够的内存,程序就不能执行。
4.2 页式管理的数据结构
&&&&&&&&&在页式系统中进程建立时,操作系统为进程中所有的页分配页框。当进程撤销时收回所有分配给它的页框。在程序的运行期间,如果允许进程动态地申请空间,操作系统还要为进程申请的空间分配物理页框。操作系统为了完成这些功能,必须记录系统内存中实际的页框使用情况。操作系统还要在进程切换时,正确地切换两个不同的进程地址空间到物理内存空间的映射。这就要求操作系统要记录每个进程页表的相关信息。为了完成上述的功能,个页式系统中,一般要采用如下的数据结构。
&&&&&&&&进程页表:完成逻辑页号本进程的地址空间到物理页面号实际内存空间,也叫块号的映射。
&&&&&&&&每个进程有一个页表,描述该进程占用的物理页面及逻辑排列顺序,如图:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 图4-1 页表
&&&&&&&&物理页面表:整个系统有一个物理页面表,描述物理内存空间的分配使用状况,其数据结构可采用位示图和空闲页链表。
&&&&&&& 对于位示图法,即如果该页面已被分配,则对应比特位置1,否置0.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图4-2 页面表
&&&&&&&&请求表:整个系统有一个请求表,描述系统内各个进程页表的位置和大小,用于地址转换也可以结合到各进程的进程控制块里。如图:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图4-3 请求表
4.3 页式管理地址变换
&&&&&&&在页式系统中,指令所给出的地址分为两部分:逻辑页号和页内地址。
&&&&&&&原理:CPU中的内存管理单元(MMU)按逻辑页号通过查进程页表得到物理页框号,将物理页框号与页内地址相加形成物理地址(见图4-4)。
&&&&&&& 逻辑页号,页内偏移地址-&查进程页表,得物理页号-&物理地址:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图4-4 页式管理的地址变换
&&&&&& 上述过程通常由处理器的硬件直接完成,不需要软件参与。通常,操作系统只需在进程切换时,把进程页表的首地址装入处理器特定的寄存器中即可。一般来说,页表存储在主存之中。这样处理器每访问一个在内存中的操作数,就要访问两次内存:
&&&&&& 第一次用来查找页表将操作数的 逻辑地址变换为物理地址;
&&&&&&&第二次完成真正的读写操作。&&&&&&&
&&&&&&这样做时间上耗费严重。为缩短查找时间,可以将页表从内存装入CPU内部的关联存储器(例如,快表) 中,实现按内容查找。此时的地址变换过程是:在CPU给出有效地址后,由地址变换机构自动将页号送人快表,并将此页号与快表中的所有页号进行比较,而且这 种比较是同时进行的。若其中有与此相匹配的页号,表示要访问的页的页表项在快表中。于是可直接读出该页所对应的物理页号,这样就无需访问内存中的页表。由于关联存储器的访问速度比内存的访问速度快得多。
5. 段式存储管理
5.1 基本原理
&&&&&&&&在段式存储管理中,将程序的地址空间划分为若干个段,这样每个进程有一个二维的地址空间。在前面所介绍的动态分区分配方式中,系统为整个进程分配一个连续的内存空间。而在段式存储管理系统中,则为每个段分配一个连续的分区,而进程中的各个段可以不连续地存放在内存的不同分区中。程序加载时,操作系统为所有段分配其所需内存,这些段不必连续,物理内存的管理采用动态分区的管理方法。
&&&&&&在为某个段分配物理内存时,可以采用首先适配法、下次适配法、最佳适配法等方法。
&&&&&&在回收某个段所占用的空间时,要注意将收回的空间与其相邻的空间合并。
&&&&& 段式存储管理也需要硬件支持,实现逻辑地址到物理地址的映射。
&&&&& 程序通过分段划分为多个模块,如代码段、数据段、共享段:
&&&&& –可以分别编写和编译
&&&&& –可以针对不同类型的段采取不同的保护
&&&&& –可以按段为单位来进行共享,包括通过动态链接进行代码共享
&&&&& 这样做的优点是:可以分别编写和编译源程序的一个文件,并且可以针对不同类型的段采取不同的保护,也可以按段为单位来进行共享。
&&&&&& 总的来说,段式存储管理的优点是:没有内碎片,外碎片可以通过内存紧缩来消除;便于实现内存共享。缺点与页式存储管理的缺点相同,进程必须全部装入内存。
5.2 段式管理的数据结构
&&&&&&&&&为了实现段式管理,操作系统需要如下的数据结构来实现进程的地址空间到物理内存空间的映射,并跟踪物理内存的使用情况,以便在装入新的段的时候,合理地分配内存空间。
进程段表:描述组成进程地址空间的各段,可以是指向系统段表中表项的索引。每段有段基址。
&&&&&&& 在系统中为每个进程建立一张段映射表,如图:
系统段表:系统所有占用段(已经分配的段)。
空闲段表:内存中所有空闲段,可以结合到系统段表中。
5.3 段式管理的地址变换
&&&&&&&&&&&&&&&&&&&&&&&&&&& &&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&图4—5&段式管理的地址变换
&&&&&&&&在段式&管理系统中,整个进程的地址空间是二维的,即其逻辑地址由段号和段内地址两部分组成。为了完成进程逻辑地址到物理地址的映射,处理器会查找内存中的段表,由段号得到段的首地址,加上段内地址,得到实际的物理地址(见图4—5)。这个过程也是由处理器的硬件直接完成的,操作系统只需在进程切换时,将进程段表的首地址装入处理器的特定寄存器当中。这个寄存器一般被称作段表地址寄存器。
6. 页式和段式管理的区别
&&&&&页式和段式系统有许多相似之处。比如,两者都采用离散分配方式,且都通过地址映射机构来实现地址变换。但概念上两者也有很多区别,主要表现在:
是信息的物理单位,分页是为了实现离散分配方式,以减少内存的碎片,提高内存的利用率。或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。
&&& 一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
大小固定且由系统决定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的。段的长度不固定,且决定于用户所编写的程序,通常由编译系统在对源程序进行编译时根据信息的性质来划分。
页式系统地址空间是一维的,即单一的线性地址空间,程序员只需利用一个标识符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
&&&& 4)、比页大,因而段表比页表短,可以缩短查找时间,提高访问速度。
TA的最新馆藏
喜欢该文的人也喜欢}

我要回帖

更多关于 java内存管理原理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信