赞
踩
将内存分成两个连续的区域:系统区和用户区
系统区只能是留给系统程序执行,用户区每次只能分配给一道程序
主要分为分区大小相等和分区大小不等的情况
等区划分
缺乏灵活性,程序过大装不进去,程序过小又浪费空间
非等区划分
相对具有灵活性
内存的分配:建立一个分区说明表,每一个表标注状态已经分配的不能被重新分配,一直到分配的内存被释放才可以又被分配。数据结构上可以采用链表、数组或者B+应该都没有问题(个人看法)
系统存储器不预先划分分区,在每次作业装入时,根据作业大小要求,从可用存储空间中切一块大小与所要求相近的存储区分配给作业。
一、内存分配
1、最先匹配法(首次适配算法):空闲区不排序,在空闲表中找到一个符合要求的分区,就可以分配
好处:较大的空闲分区可以被保留在内存高端。
不足:但随着低端分区不断划分而产生较多小分区,每次分配时查找时间开销会增大。2、最佳匹配法:空闲区一开始从小到大开始排序,找到大小和要求的分区差最小的开始分配
好处:较大的空闲分区可以被保留
不足:但会形成较多无法利用的较小分区(外部碎片)
3、最差匹配法:空闲去按照大到小排序,找到最大的分区开始分配
这种方法基本不留下小空闲分区,但较大的空闲分区不被保留。
举例说明:先有作业序列:作业A要求18K;作业B要求25K,作业C要求30K。请给出采用最先、最佳、最差三种适配算法进行内存分配后的空闲区队列,哪些方法能将三个作业全部装入内存。
先分配作业A之后,内存情况:
作业B被分配:
作业C被分配
伙伴系统:
① 算法规定每个空闲分区的大小都是2的k次幂,对于每个大小相同(也就是k相同)的分区,都会设置一个双向链表,这样系统所有的空闲分区就会被分成k个不同的空闲分区链表
② 当需要分配内存时候,(假设需要2的j次方),找到一个空间是i>j的最小的那个,将这个i分区一分为二,一部分用来分配内存,一部分存再2的 i-1次方的那个链表中,作为下次可以被分配的对象
二、内存回收:
a、不用重新分配表项,直接用上空闲区的表项和首地址,地址长度是三个分区大小的和,取消下表项的内容
b、不用重新分配表项,直接使用上空闲区的表项和首地址,地址长度是两个分区的大小和 c、修改下空闲区的首地址和长度
d、增加一个新的表项,首地址和长度就是中间分区的长度
首先先明白内碎片和外碎片的概念:
1、 内碎片:对于固定分区来说的,一个固定的分区只能分配一道作业,当分区过大分配作业会有残余或者过小无法分配的时候,就会产生内碎片,这个内碎片是属于分区的。
2、外碎片:对于动态分区而言的,对于动态分区,就是有作业就割据一部分内存来存放,但是当割据后剩余的一部分过小,无法分配作业时候,就会产生一个外碎片,这个外碎片是一个独立分区,只是这个分区不能分配了而已。
以上我们知道,上面介绍的分区方式会产生一定的碎片,造成内存的浪费,所以才有动态可重定位分区的分配
一、紧凑(拼接)
二、动态重定位
总结:紧凑和多重分区存储管理还是会产生一些碎片,紧凑只是用一种成本比较大的方法移动程序(数据)来使得空闲分区较大,多重分区存储管理还是会产生一些更小的碎片。所以两种方法都没有从根本上解决碎片问题。
让一个程序中没有调用关系的模块共享内存,安排装载到同一个内存块中,以缓存系统内存不足的问题
一般来说,兄弟节点之间都是没有调用关系的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。