内存管理的要求:
抽象:逻辑(虚拟)地址空间;
保护:独立地址空间;
共享:访问相同内存;
虚拟化:更大的地址空间
内存管理方式:
重定位,relocation,段地址+偏移;
分段,segmentation,代码,数据,堆栈分成三块,每段连续;
分页,paging,内存分为最基本的单位,房子的砖块;
虚拟存储:virtual memory,Linux采用按需页式虚拟存储;
地址空间定义:物理地址空间——硬件支持的地址空间;
逻辑地址空间——在CPU运行的进程看到的地址;
逻辑地址生成:
编辑时:起始地址已知,如果起始地址改变,必须重新编译(功能手机,写死的);
加载时:起始位置未知,编译器可重定位relocatable code,在加载时,生成绝对地址(智能手机);
执行时:执行代码可移动,需地址转换(映射)硬件支持;
CPU:ALU(逻辑地址内存内容),MMU,依据页表(逻辑地址物理地址的转换),CPU控制逻辑(给总线发物理请求)
内存:发送物理地址给CPU,或接受CPU数据大物理地址
操作系统:建立逻辑地址LA和物理地址PA的映射
连续内存分配和内存碎片:
连续内存非配:给进程分配一块不小于指令大小的连续物理内存区域;
内部碎片:分配单元内部的未被使用的内存,取决于分配单元大小是否取整;
外部碎片:分配单元之间的未被使用的内存;
动态分区分配:被加载执行时,分配以及进程执行大小可变的分区,分区的地址是连续的;
动态分区分配策略:最佳匹配First-fit,最佳匹配Best-fit,最差匹配Worst-fit;
最先匹配First-Fit Allocation:分配n个字节,使用第一个可用的空间比n大的空闲块,空闲分区按地址排序,优点是简单、在高地址空间有大块的空间分区;缺点是外部碎片、分配大块时较慢(从前往后找)。
最佳匹配Best-Fit Allocation:分配n字节分区时,查找并使用不小于n的最小的空闲区;空闲分区列表按照大小排序,优点是分配储存在小时效果很好,减小外碎片;缺点是外部碎片,容易产生很多无用的小碎片;
最差匹配Worst-fit Allocation,使用不小于n的最大的空闲区;空闲区列表从大到小排序,中等大小分配效果最好,缺点是:容易破坏大的空闲区
碎片整理:调整进程占用分区的位置,来减少或避免分区碎片
碎片紧凑compaction,通过移动分配给进程的内存分区合并外部碎片,条件是可以动态重定位。分区对换Swapping in/out,通过抢占并回收处于等待状态进程的分区,以增大可用内存空间
伙伴系统Buddy System:整个可分配的分区大小2u,每次进行切半处理