内存管理之分段和分页
内存管理
最常用的内存管理方式是动态内存分配。而动态内存分配分三种:首次适应、最优适应和最差适应。
- 首次适应(时间效率高):找到第一个满足大小的孔时,将进程放进去。
- 最优适应(时间效率差):遍历所有的孔,将进程放进满足大小的最小的孔(亦即放入进城后新产生的孔是最小的)。
- 最差适应(时间效率差):遍历所有的孔,将进程放进满足大小的最大的孔(亦即放入进城后新产生的孔是最大的)。
在空间利用能力方面,首次适应和最优适应都要好于最差适应。
动态内存分配存在一个显著的缺陷:存在外部碎片,空间利用率低。外部碎片:针对于动态内存分配方法所产生的碎片。这里的碎片指的是随着进程的加载和退出,所产生的不连续的无法满足请求的小孔,而这些小孔的总内存可满足内存分配的请求。
除了动态内存分配,还有一种常用的内存管理方式是:按固定大小的块为单位(块是最小的内存单位)进行分配。
而该种内存管理方式存在着内部碎片的问题。
内部碎片:针对于按固定大小的块为单位(块是最小的内存单位)进行分配的方法所产生的碎片。这些碎片指的是每一个块中除去进程分配了的内存后剩下的区域。
针对这两种内存管理方式的碎片问题,分别提出了分段和分页的方式来对碎片问题进行缓解。
分段
将一个进程的内容分成不同的段,允许不同的段之间的内存是不连续的(但每一个段段内的空间是连续的)。
- 可以缓解外部碎片的问题,但仍存在外部碎片问题。
分段技术需要利用段表实现。段表(段表有两列)包括:每个段的段基地址(物理基地址)、每个段的段界限。
在分段技术下,逻辑地址由段号s(表示第几个段)和段偏移d组成。当要访问内存时:
- 1)首先根据逻辑地址读取段号s;
- 2)然后在段表中找到该段号对应的段界限limit,判断段偏移d是否满足小于段界限limit的条件。如果不满足,则表示寻址错误;否则往下继续操作;
- 3)在段表中读取该段号对应的段基地址base,计算base+d得到物理地址,进而访问物理内存。
优点
反映了程序的逻辑组织,段内地址空间是连续的,便于保护、共享、动态链接和增长。
缺点
分段容易产生外部碎片,且每个段的大小不一,不利于虚拟存储。
分页
将进程的内容划分为固定大小的一小片一小片,每一片称为一个页。允许内存不连续分配。
- 不存在外部碎片,但每一个进程对应的最后一页可能存在内部碎片。
在分页技术下,逻辑地址由页号p(表示第几页)和页偏移d组成。
当需要访问内存时:
- 1)首先根据逻辑地址读取页号p;
- 2)在页表中读取该页对应的页基地址base;
- 3)将base+d(注意,与分段技术不同的是,这里的+指的是位的拼接,即将base左移逻辑地址中页偏移区域对应的位数后,再加上偏移量d),得到物理地址。
优点
通过固定大小的块来存储,利于虚拟存储,支持不连续内存分配,不存在外部碎片,即使有内部碎片,内部碎片也较小。
缺点
由于分页技术的内存是不连续的,因此难以进行保护、共享、动态链接和增长。
对于分段和分页两种技术,总的来说:分段用于内存保护,分页用于虚拟存储。