第三章 物理内存管理
在操作系统中管理内存的不同方法
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
实现高度依赖硬件
- 必须知道内存架构
- MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求
地址空间
物理地址空间——硬件支持的地址空间
逻辑地址空间——一个运行的程序所拥有的内存范围。(一维的线性空间)
两者之间的对应关系:表TLB
高级语言——编译器——汇编语言文件.s
汇编语言——汇编器——机器语言文件.o
很多程序自带的.bin文件就是程序的二进制表示
在汇编语言转换为机器语言的过程中,汇编器会将汇编语言中的变量符号转换为地址。
(因为在高级语言和汇编语言中对于某个数据都是以符号来抽象表示,而机器语言需要将其转换为地址才可以进行访问)
Linker程序链接器:能让多个.o文件合起来生成一个.exe文件。
.exe file是一个能够在内存中执行,但是目前还是存放在硬盘中的程序。
在这个文件中,已经对不同的.o文件的访问地址(包括指令还是数据都有地址)已经做了定义(其中包括分配和映射过程)。
此时还需要通过Loader,它也是一个应用程序,它会将.exe文件放在内存中去运行。这一过程中它会在内存中进行逻辑地址的分配。
这样,程序就可以在内存中正常运行。
但是逻辑地址到物理地址还需要CPU去转换,这就是计组的内容了。
操作系统的作用就是建立逻辑地址与物理地址的映射。
地址的安全检查:
操作系统需要确保放在内存中的不同程序相互之间不能够干扰,所以需要确保每一个访问的地址空间是合法的。(如上图所示)
所以会有一个限制和约束,而这个限制和约束的范围也是操作系统去建立的。
逻辑地址在进行映射转换前需要进行一次比较。
程序的地址空间就是两个:起始空间和长度(程序大小)。
但是对一个程序来说,程序是一个个指令,而程序用到的数据并不跟程序存放在一起。也就是说,程序的指令和数据是分开存放的,分为指令区和数据区。
也就是说,CPU通过虚拟地址映射到物理空间中取指令,然后对数据进行运算。指令是一定会取的,但是数据如果需要运算,就一定会先加载到寄存器中(也就是到内存中取数据,这个过程也可能涉及I/O,即启动IO设备到硬盘或者其他设备中读取数据)。
3.3 连续内存分配:内存碎片与分区的动态分配
内存碎片问题
- 空闲内存不能被利用
- 外部碎片:在分配单元间的未使用内存
- 内部碎片:在分配单元中的未使用内存
分区的动态分配
简单的内存管理方法
- 当一个程序准许运行在内存中时,分配一个连续的区间
- 分配一个连续的内存区间给运行的程序以访问数据
3.4 压缩式和交换式碎片整理
这就是压缩式碎片整理
其核心就是拷贝内存
设计内存和磁盘上的虚拟内存的数据交换
- 地址空间 & 地址生成
- 连续内存分配:
- 第一适配
- 最佳适配
- 最差适配