连续内存分配给内存分配带来了很多不便,可能所有空闲片区大小都无法满足需求大小,这个分配就会失败。基于这种现状,就有了非连续内存分配的需求。非连续分配成功的几率更高,但也面对更多的问题,比如分配时是不是1个字节的空间也可以进行分配?显然1个字节为单位分配太短了。因此我们需要选择不同尺度的基本块进行分配管理。实际操作系统中出现了两种基本块,一种是段式,一种是页式。段式分的块比较大,页式分配的块比较小。分配的块越小,逻辑地址与物理地址之间的映射关系就越复杂。根据这种映射关系形成了页表。还有一种结合的方式段页式管理。
连续分配的缺点:
- 分配给程序的物理内存必须连续
- 存在外碎片和内碎片
- 内存分配的动态修改困难
- 内存利用率较低
非连续分配的设计目标:
针对连续内存分配的这些缺点,非连续分配的设计目标就显而易见了:提高内存利用效率和管理灵活性。具体来说有以下几条:
- 允许一个程序使用非连续的物理地址空间;
- 允许共享代码与数据,因为各个进程可能有很多代码是相同的或者使用的数据是相同的,比如使用了同一个函数库;
- 支持动态加载和动态链接。
非连续分配需要解决的问题:
虚拟地址到物理地址的转换。当进程的内存地址连续时,只要知道进程内存起头的位置,就知道整个内存区域的位置了。而非连续分配则不然,逻辑地址中不同位置可能存储于物理内存中不同的区域,因此转换会比较复杂。具体的转换方式有两种:
- 软件实现,灵活但开销大,就比如数据的外排序时,需要分几部分将数据排序存到外存,最后再整体排序;
- 硬件实现,够用并且开销小。
非连续分配的硬件辅助机制:
非连续分配中如何选择非连续分配的内存分块大小是个很重要的问题。实际操作中主要有两种方式:
- 段式存储管理,内存基本块较大;
- 页式存储管理,内存基本块较小。