一、非连续内存分配
1、为什么需要非连续内存分配?
-
▼
连续内存分配的缺点
-
■
分配给一个程序的物理内存是连续的
■ 内存利用率较低
■ 有外碎片、内碎片问题
▼
非连续内存分配的优点
-
■
一个程序的物理地址空间是非连续的
■ 更好的内存利用和管理
■ 允许共享代码与数据(共享库等…)
■ 支持动态加载和动态链接
▼
非连续内存分配的缺点
-
●
如何建立虚拟地址和物理地址之间的转换
■ 软件方案
■ 硬件方案
▼
两种硬件方案
-
●
分段
● 分页
二、分段
1、程序的分段地址空间
计算机程序是由很多段来组成的,有主程序、子程序、共享库等等,数据也有栈段、堆段以及共享数据段,如果能够把程序的各个段分离和共享,那么会有利于我们管理我们的程序。
该图中程序的逻辑地址空间是一段连续的地址空间,通过分段之后我们能把各个段部分有效地隔离开来,比如说可以将堆栈放到一个特定的物理地址并且用一个特定的管理权限管理起来。这样就可以让我们的程序中的某些段进行共享和隔离,以及管理。
左面的连续逻辑地址空间映射到右边的物理地址空间中时,段的顺序、位置以及地址空间的大小都有可能会发生变化,因此我们需要一定的映射机制来执行。如果用软件来执行的话,开销会非常大,所以我们就用硬件来完成这个映射机制。
2、分段寻址方案
x86 就是段寄存器+地址寄存器实现方式
上面这张图中的base和limit的箭头指向有问题
段表中存在的是逻辑地址空间中的段号与物理地址空间中的段号的对应关系。
段表中存放着两个重要的信息,一个是段的起始地址,一个是段的长度限制。
先根据逻辑地址的段号查段表中的项,可以找到一个起始地址(base)和长度限制(limit)。之后需要进行检查,判断偏移量是否大于段的长度,若大于则返回内存异常,若不大于则将偏移量加上起始地址就可以找到物理地址空间中的地址了。
操作系统建立段表
三、分页
1、分页地址空间
-
分段与分页
-
在分段机制中,需要知道段号与段内偏移。在分页机制中,需要知道页号以及页内偏移。两者之间的区别:在分段机制中,段的大小是可变的,但是分页机制中,页帧的大小是固定的。
分页
-
在分页机制中,物理内存被划分为固定大小的帧 "frame"(大小是2的幂,如:512,4096,8192)
-
同时逻辑地址空间也被划分为大小相同的页 "page"(大小是2的幂,如:512,4096,8192)
建立方案 转换逻辑地址为物理地址(pages to frames)
-
页表,MMU/TLB
-
帧(Frame)
共有 2F 个帧,每个帧的大小是 2S 字节。物理地址是两个部分的组合在一起 2S × f + o
-
页(Page)
页的大小与帧的大小是相等的,但是页号的大小可能与帧号的大小不相等,也就是说并不是所有的页都有对应的帧。因此这里的页号一共有 2P 个,页内偏移 o 是与物理地址相同的。逻辑地址为 2S × p + o
2、页寻址方案
我们根据页号加上页表的页表基址可以在页表中找到对应的帧号,然后就将帧号和偏移量合并,从而在物理内存中找到对应的物理地址。这里需要注意,一般逻辑地址的页号要比物理地址的帧号多。
我们可以知道,每一个页和帧的大小是一致的,因此我们比较方便去使用,而不必去担心分段机制中的段大小不一致的问题
-
页映射到帧
-
页是连续的虚拟内存
-
帧是非连续的物理内存
-
不是所有的页都有对应的帧