物理内存管理:连续内存分配
地址空间定义
- 物理地址空间:硬件支持的地址空间
- 起始地址0,直到 MAXsys
- 逻辑地址空间:在 CPU 运行的进程看到的地址
- 起始地址0,直到 MAXprog
地址生成时机和限制
- 编译时
- 假设起始地址已知
- 如果起始地址改变,必须重新编译
- 加载时
- 如编译时起始位置未知,编译器需生成可重定位的代码(relocatable code)
- 加载时,生成绝对地址
- 执行时
- 执行时代码可移动
- 需地址转换(映射)硬件支持
地址生成过程
- CPU
- ALU:需要逻辑地址的内存内容
- MMU:进行逻辑地址和物理地址的转换
- CPU 控制逻辑:给总线发送物理地址请求
- 内存
- 发送物理地址的内容给 CPU
- 或接受 CPU 数据到物理地址
- 操作系统
- 建立逻辑地址 LA 和物理地址 PA 的映射
连续内存分配和内存碎片
- 连续内存分配
- 给进程分配一块不小于指定大小的连续的物理内存区域
- 内存碎片
- 空闲内存不能被利用
- 外部碎片
- 分配单元之间的未被使用内存
- 内部碎片
- 分配单元内部的未被使用内存
- 取决于分配单元大小是否要取整
连续内存分配:动态分区分配
- 动态分区分配
- 当程序被加载执行时,分配一个进程指定大小可变的分区(块、内存块)
- 分区的地址是连续的
- 操作系统需要维护的数据结构
- 所有进程的已分配分区
- 空闲分区(Empty-blocks)
- 动态分区分配策略
- 最先匹配(First-fit)
- 最佳匹配(Best-fit)
- 最差匹配(Worst-fit)
最先匹配(First Fit Allocation)策略
- 思路:分配 n 个字节,使用功能第一个可用的空间比 n 大的空闲块
- 原理 & 实现
- 空闲分区列表按地址顺序排序
- 分配过程中,搜索一个合适的分区
- 释放分区时,检查是都可与临近的空闲分区合并
- 优点
- 简单
- 在高地址空间有大块的空闲分区
- 缺点
- 外部碎片
- 分配大块时较慢