存储器(内存)管理之分区式分配

来源:互联网 发布:java从大到小排序方法 编辑:程序博客网 时间:2024/05/16 11:03

一.单一连续区分配

1.这是早期的面向单用户,单任务OS的存储分配策略,如DOS,其把整个物理空间分为两个部分:

*1.系统区:存放OS的驻留部分和其所需的内部数据结构,(如中断向量表)一般置于内存的低址部分;
*2.用户区:系统区以外的所有内存都可供用户使用。

2.早期的单用户,单任务OS有些配置了存储器保护机制,但常见的如CP/M,DOS都无保护机制,因为用户独占内存,不存在其他用户干扰问题,出问题是自己的责任,而OS被破坏则可重新启动来恢复。

3.分区式分配是早期的多用户OS的存储分配技术,包括:固定式分配可变分区分配可重定位分区分配多重分区分配四种。

二.固定式分配

1.把内存划分为若干个固定大小的区域,每区的边界固定不变。有两种形式:

*1.分区大小相同:对不同大小程序适应性差;
*2.分区大小不同。

2.为实现分区,要建立一张分区说明表。包括分区号,大小,起址,状态。
3.由于分区是固定不变的,因此不能保证程序所需的内存恰好等于某一分区而必然有一部分的内存浪费——“内零头”。典型的OS是IBM/360机的MFT系统。
4.固定式分区不灵活,但是简单,因此在一台主机控制多台同种设备的控制领域仍然有一定的使用。

三.可变式分区

1.指根据作用的实际需要,动态为之分配所需的内存空间,即分区边界可移动。

有两种:*1.分区数固定,分区大小可变。*2.分区数和分区大小都可变。
显然,方案一的分区说明表可用数组表示,简单;方案二灵活,但是分区数不定,需要链表组织分区说明表,下面以方案二为例说明数据结构,算法和操作。

2.数据结构
两个链表:已分配分区表和未分配分区表:每记录包括起址,大小,状态和指针四项;
其链接的顺序与算法有关,可按大小有序/按始址有序/任意。

struct area{    int number;    long StartAddr size;    int status;    struct area *next;    }AREA;AREA *AllocTable,*FreeTable;

设立两个表:已分配分区表AllocTable和空闲分区表FreeTable。

3.算法
设S是空闲分区的大小,R是要求分配的分区大小。

*1.最佳适应算法
A>从空闲分区链表(最好能按分区大小有序)选择((S>=R)&&(S-R最小))的分区。分配R内存给作业,剩余的S-R仍留在空闲链中以供下次分配;若无满足条件的空闲分区,则不分配。
B>显然经多次S-R划分后,空闲链表中的分区会越来越小而无法再用,形成分区碎片叫“外零头”。
解决方法有:

  • 拼接边界邻接的碎片;
  • 修正条件,设置一个阈值G,若S-R小于G,则分配整个分区S给作业而不在切分以减少碎片。

*2.最坏适应算法
与最佳适应算法相反,是选择((S>=R)&&(S-R最大))的分区划分。显然其划分后的剩余部分被再次切分的可能性更大,这是其优点,但缺点是大作业招不到能满足的分区。

*3.首次适应算法
A.这是对最佳和最坏适应算法的折中,空闲分区链接按起始地址有序,每次分配时,从链表查找,第一个满足的分区则分配之,且用碎片替换原位置。
B.本法的最大优点是简单,速度快。(如碎片不插入而是替换)而且链尾(即内存高端)有大的空闲分区。
C.缺点是经多次使用,碎片集中在链首,平均查找次数增大。

*4.下次适应算法(循环适应算法)
为解决平均查找次数增大的缺点,下次查找从上次成功的下一结点始,空闲链为循环型,这样内存的利用率更为均衡,但大空闲区随之减少。

总之:每种算法都有其优缺点。

4.操作
1.分配:查找匹配分区,按算法分配内存,若有剩余则加到空闲链。
2.回收:运行完后,回收内存,加到空闲链。

  • a.查找插入位置,插入本空闲块;
  • b.若同某一空闲区与前邻接,则拼接。(修改大小,删除结点)

四.可重定位分区分配

1.固定式分区形成“内零头”,可变式分区形成“外临头”。零头只要拼接起来就可再用,
条件是:前一分区始址+前一分区大小==后一分区的始址
2.为满足这个条件,只要把已分配分区按始址序向前移动即可,这种移动技术称为存储器紧凑
3.紧凑完成两个任务:*1).把作业区内的数据搬家;*2)设置重定位寄存器的值。
4.紧凑技术的好处是以增加相同延迟和其他开销为代价的,只能隔一定时间做一次;或当内存紧张,碎片太多时才做。
5.所以可重定位分区,是指可借助紧凑技术对可变分区进行重新定位的分区分配方法

五.多重分区分配

1.以上所述的作业所需内存都是指连续的区域,若一个作业所需的内存能按其所起的作用分成几段,则“零头”可能还有用。即一个作业的运行内存由几个分区组合,这种分配策略称为多重分区策略
2.显然这样分配后,作业的地址生成更复杂,要多个重定位寄存器,编译器也要能区分目前要使用哪个分区,哪个始址。
3.这种分配的另一种好处是可以多作业的数据共享,某一分区作公用。

六.分区的存储保护
防止一作业有意/无意破坏另一作业的运行,一般需硬件机制支持。
1.界限寄存器
设置上,下界寄存器,若分配ADDR1到ADDR2之间的存储空间给作业X,则把ADDR1和ADDR2放入上下界寄存器,作业X运行时的取地址值若在界限器内,则有效,否则发生中断。类似于xBASE语言中的GET x RANGE y1,y2。
2.基址+限长寄存器
基址寄存器起到重定位寄存器RR的作用,而限长寄存器限制取址的最大偏移量,相当于界限寄存器的ADDR1=[基址],ADDR2=[基址]+[限长】。
3.保护键方法
每个方法有一把锁,要使用这个分区必须要有相应的钥匙,否则拒绝访问。

0 0