先决条件:内存管理系统、逻辑和物理地址的要求
内存分配技术:
为了存储数据和管理进程,我们需要一个大容量的内存,同时我们需要尽可能快地访问数据。但是如果我们增加内存的大小,访问时间也会增加,正如我们所知, CPU 总是为二级内存生成地址,即逻辑地址。但是我们要访问主存,所以需要将逻辑地址地址转换为物理地址。
主存与用户进程和操作系统交互,所以我们需要有效地使用主存。主存被划分为不重叠的内存区域,称为分区。
主内存可以通过两种方式广泛分配 –
- 连续内存分配
- 非连续内存分配
连续内存分配可以分为两种方式:
- 固定分区方案
- 可变分区方案。
连续内存分配中使用了不同的分区分配方法——
- 首次拟合
- 最适合
- 最不适合
- 下一个适合
非连续内存分配可以分为多种方式:
- 分页
- 多级分页
- 反向分页
- 分割
- 分段分页
MMU(内存管理单元):
虚拟地址和物理地址之间的运行时映射由称为 MMU 的硬件设备完成。
在内存管理中,操作系统将处理进程并在磁盘和内存之间移动进程以执行。它跟踪可用和已用内存。
MMU方案:
CPU------- MMU------Memory
- CPU 将生成逻辑地址,例如:346
- MMU 将生成一个重定位寄存器(基址寄存器)例如:14000
- 在内存中,物理地址位于 eg:(346+14000=14346)
当地址被发送到内存时,重定位寄存器中的值被添加到用户进程生成的每个地址上。用户程序永远不会看到真正的物理地址。该程序可以创建一个指向位置 346 的指针,将其存储在内存中,对其进行操作,并将其与其他地址进行比较——所有这些都类似于数字 346。
用户程序只生成逻辑地址。但是,这些逻辑地址在使用之前必须映射到物理地址。
地址绑定:
地址绑定是从一个地址空间映射到另一个地址空间的过程。逻辑地址是CPU在执行过程中产生的地址,而物理地址是指内存单元中的位置(加载到内存中的那个)。逻辑地址经过MMU或地址转换单元的转换。这个过程的输出是适当的物理地址或代码/数据在 RAM 中的位置。
地址绑定可以通过三种不同的方式完成:
编译时间 –
如果您知道在编译期间进程将驻留在内存中的位置,则会生成一个绝对地址。即物理地址在编译期间嵌入到程序的可执行文件中。将可执行文件作为进程加载到内存中非常快。但是如果生成的地址空间被其他进程占用,那么程序就会崩溃,需要重新编译程序来改变地址空间。
加载时间 –
如果在编译时不知道进程将驻留在何处,则将生成一个可重定位的地址。加载器将可重定位地址转换为绝对地址。加载器将进程在主存中的基地址与所有逻辑地址相加,生成绝对地址。在这里,如果进程的基地址发生变化,那么我们需要重新加载进程。
执行时间处理时间 –
指令在内存中并由 CPU 处理。此时可以分配和/或解除分配额外的内存。如果进程可以在执行期间从一个内存移动到另一个内存(动态链接 – 在加载或运行时完成的链接),则使用此选项。例如——压实。
将虚拟地址映射到物理地址:
在连续内存分配中,从虚拟地址到物理地址的映射并不是一项艰巨的任务,因为如果我们从二级内存中取出一个进程并将其复制到主内存中,那么地址将以连续的方式存储,因此如果我们知道基址进程的地址,我们可以找出下一个地址。
内存管理单元是 2 个寄存器的组合——
- 基址寄存器(重定位寄存器)
- 限制寄存器。
基址寄存器——包含进程的起始物理地址。
限制寄存器 –提及相对于进程占用区域的基地址的限制。
CPU 生成的逻辑地址首先由限制寄存器检查,如果生成的逻辑地址的值小于限制寄存器的值,则将重定位寄存器中存储的基地址与逻辑地址相加得到内存位置的物理地址。
如果逻辑地址值大于限制寄存器,则 CPU 陷入操作系统的陷阱,操作系统通过给出致命错误来终止程序。
在非连续内存分配中,进程可以分配到可用空间的任何位置。非连续内存分配中的地址转换很困难。
有几种技术可用于非连续内存分配中的地址转换,如分页、多级分页、反向分页、分段、分段分页。这些技术需要不同的数据结构和硬件支持,如 TLB。