周志遠教授作業系統_chap08_Operating System Chap8 Memory Management_.pdf
1. 在程序中使用内存—地址绑定
三种方式
- Compile Time (编译时指定)
- Load Time(load时指定物理地址)
- Run Time Address Binding(虚拟内存,需要硬件支持)
- MMU硬件-转换CPU传出的虚拟地址到真实地址
- 有弹性,方便os调配资源
- 方便user编程,管理程序就好,减少系统使用复杂度
2. 把程序加载进内存
逻辑vs物理地址
2.1.动/静态加载
Static Loading 主存预先分配好程序空间
Dynamic Loading
- 需要使用function code才分配空间
- 更好利用内存
- 不加载不用程序
- 大量不频繁代码(e.g.异常处理)不会加载
- 不是os直接支持,由使用者/程序决定
2.2.动/静态链接
Static Linking
所有库都被loader合并进程序(不同程序重复load 库)
- 浪费内存
- 二进制文件包含所有运行库,执行时更快
- 即使采用动态加载+静态链接也无法防止重复代码问题
Dynamic Linking
链接推迟到执行时
坏处:需要OS支持Dynamic Linking。运行速度慢,需要在runtime时去寻找lib
- 只有一份代码(库)复制到内存,所有程序共享
- 每个程序的执行码都有都有存根→引用各自的库
- Stub:存根,一个小程序code
- Windows 上的DLL(Dynamic link library)
3. 把一个程序在主存和磁盘间移动—交换
3.1.交换
进程能在Backing Store中被交换出内存,随后再带进内存以继续执行
Backing Store
硬盘上的一块空间。与文件系统不同,由MMU直接管理
3.2.为什么需要交换进程
- 释放空间
- 滚出滚入:交换低优先级进程和高优先级进程(系统调度)
在Chap 9. 虚拟内存继续讨论如何SWAP
3.3.交换的要点
- 交换回来的内存位置
- 程序binding at compile time/load time → 必须相同
- Binding at execution time → 可以不同
- 将要被交换的进程必须是idle的
- 不能在做IO
- 解决方法:
- 等到IO做完后才交换
- 通过OS Buffer做IO
※4. 分配内存
4.1 连续内存分配
4.1.1.Fixed-partition
每个进程加载进固定大小的分区
多道 数目取决于 分区数量
4.2 Fragmentation—碎片
★4.3 不连续内存分配——分页