计算机体系结构与内存层次
- 内存最小的访问单位是1B=8bit,每个字节都有自己的物理地址
- 总线一般是一次读取4B=32bit
- cpu里面有高速缓存cache和寄存器作为存储帮手
- 访问速度最快的是几纳秒,最慢的几毫秒,相差百万级
- 进程会共享所需要的内核资源
- 进程和内核的逻辑地址会经过中间的存储管理单元转换成物理地址,实现抽象、保护、共享、虚拟化
- 操作系统内核放在内存的前面一部分,进程有一部分放在内存里面,有一部分放在外存里面,如图
- 进程的逻辑地址空间可能会大于物理内存总量
操作系统采用的内存管理方式
- 重定位:段地址+偏移
- 分段:分成代码、数据、堆栈
- 分页:把内存分成最基本的单位
- 虚拟存储:把数据存到硬盘上,使得逻辑地址空间大于物理内存空间
逻辑地址生成
- 静态重定位是指装入时把逻辑地址转换成物理地址,装入后不变
- 动态重定位指装入后地址在执行中,模块地址会改变
- 编译:生成若干模块
- 链接:将模块和库函数链接到一起,形成一个完整的装入模块,此时生成逻辑地址
- 运行:将完整的模块装入内存
- 编译和链接后每个目标模块都以0号单元开始编址,不同进程有相同的逻辑地址
- MMU地址转换模块
连续内存分配
- 连续内存分配有两种实现方式:固定分区分配,动态分区分配
- 进程内部无法利用的碎片叫内碎片,分配单元之间无法利用的碎片叫外碎片
- 动态分配下,进程大小可变,由操作系统确定那些是可用的那些是不可用的区域
- 分配策略有三个:First-fit,Best-fit,Worst-fit
- First-fit:找到第一个合适的分区就装进去,简单,但有外碎片,高地址有大块内存空间,但大块内存空间分配就要找比较久,较慢
- Best-fit:找到比它大,而且大得最小的分区,相对简单,大的分区不会被拆开,但还是有外碎片,释放分区较慢
- Worst-fit:找到比它大,而且大得最多的分区,不喜欢,不记
碎片整理
- 将进程间的外碎片整理起来
- 只有可动态重定位的程序可以移动整理
- 一般在进程等待状态下时移动
- 小个的外碎片会选择跳过,避免开销
分区兑换
- 内存不够用时,会把等待状态的进程先放到外存
伙伴系统
- 不断将分区分成两个小的部分,直到装不下进程的前一次大小,最多空2^i-1内碎片
- 外碎片合并时如果不能合成空间大小2的整数幂,将不合并
- 目前unix和linux都有对伙伴系统的相关实现