分区内存管理
单一区存储管理
定义:用户区不分区,完全被一个程序占用。
优点:简单,不需要复杂的硬件支持
缺点:内存浪费,利用率低
分区存储管理
定义:把用户区划分为若干大小不等的分区,共不同程序使用。适用单用户单任务系统。
①固定分区
把内存固定地划分为若干个大小不等的分区供各个程序使用,每个分区的大小和位置都固定,系统运行期间不再重新划分。
分区表:为了方便内存分配,通常将分区按大小排好序,并建议一张对应的分区表,该表包括每个分区的起始地址,大小及状态。当用户程序装入内存的时候,依据用户程序大小检索分区表,从中找出一个满足要求的、尚未分配的分区,将之分配给该程序,并将表中该分区的状态改为已分配,若未找到大小满足的分区,则拒绝分配。
使用特点:在程序装入前,内存已被分区,不再改变。每个分区大小不同,适应大小不同的程序,系统要维护分区表,适应具有固定任务数的多道程序系统。
缺点:浪费内存,程序比所在分区小;另外大程序可能无法运行。
建议:根据分区表安排程序装入顺序,使每个程序都能找到合适的分区运行。
在通用 *** 作系统中,程序的数量大小都是不确定的,显然固定分区不太适合
②动态分区
定义:在程序装入的时候创建分区,使分区大小与程序的大小相等。
特点:分区动态建立。会产生内存碎片。
需要解决的问题:分区的分配?分区的选择?分区的回收?解决内存碎片问题?
分区的分配
空闲区表:描述内存空闲区的位置和大小的数据结构
分配过程(假定用户要求的空间是s)
(1)从空闲区表的第一个区开始,寻找大于等于s的空闲区
(2)找到后从分区分割出大小为s的部分给用户使用
(2)分割后的剩余部分作为空闲区仍登记在空闲区表中
注意:分割空闲区时一般从底部分割,这样基址不变,容易更新
空闲区表如何排序——放置策略(空闲区表排序原则)
(1)按空闲区位置(首址)递增排序:首次适应算法
(2)按空闲区位置(首址)递减排序:没有用
(3)按分区大小递增排序:最佳适应算法
(4)按分区大小递减排序:最坏适应算法
分区的回收
功能:回收程序释放分区(释放区),登记到空闲区表中,以便再分配。
回收算法:要考虑释放区与现有空闲区是否相邻?若相邻,则合并后更新表,若不相邻,直接插入表中。
内存覆盖技术 (覆盖overlay)(物理内存管理范畴)
目的:在较小的内存空间中运行较大的程序。
内存分区:
①常驻区:被某段单独且固定地占用,可划分多个
②覆盖区:能被多段共用(覆盖),可划分多个
缺点:编程复杂,程序员划分程序模块并确定覆盖关系;程序执行时间长,从外存装入到内存很耗时。
内存交换技术(Swapping)(物理内存管理范畴)
原理:内存不够时把进程写道磁盘(换出/Swap out),当进程要运行时重新写回内存(换入/Swap 呕吐)
优点:增加进程并发数,不考虑程序结构
缺点:换入和换出增加CPU开销,交换单元太大(整个进程)
需要考虑的问题:减少交换传送的信息量(模块/段);
①外存交换空间的管理方法;
②程序换入时的地址重定位。
③换出换入的地址重定位:
放到什么位置?
①原来位置(容易引起地址冲突)
②任一空的位置(地址要重定位)
内存碎片
动态分区的缺点:容易产生内碎片。
碎片问题的解决方法:
①规定门限值
分割空闲区时,若剩余部分小于门限值,则此空闲区不进行分割,而是全部分配给用户。
②内存拼接技术
将所有空闲区集中构成一个大的空闲区。
拼接的时机:
释放区回收的时候(拼接频率过大,系统开销大);
系统找不到足够大的空闲区的时候(空闲区管理复杂);
定期(空闲区管理复杂)
缺点:消耗系统资源;离线拼接(系统需要暂停下来进行整理);重新定义作业。
③解除程序占用连续内存才能运行的限制(分页和分段就是借鉴了这种思想)
把程序分拆为多个部分装入到不同分区,充分利用碎片
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)