物理内存管理之非连续内存分配
- 两种方法分段(Segmentation)、分页(Paging)、
- 页表(Page Table)[分页中很总要的一种数据结构]
非连续内存分配之分段
问题之为什么需要非连续内存分配?
连续内存分配的缺点
- 分配给一个程序的物理内存是连续的
- 内存的利用率较低
- 有外碎片、内碎片的问题
非连续内存分配的优点:
- 一个程序的物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码与数据(共享库等…)
- 支持动态加载和动态链接
如何建立虚拟地址和物理地址之间的转换
- 软件方案
- 硬件方案
- 分段机制
- 分页机制
分段机制需要关注的两个问题:
- 程序的分段地址空间
- 分段寻址方案
分段寻址方案:段访问机制
一个段即为一个内存“块”,是一个逻辑地址空间,程序访问内存地址需要一个二维数组(s,addr
),其中s代表段号,addr
代表的是段内偏移。逻辑地址段号和物理地址段号的映射关系存放在段表(包括段的起始地址和段的长度信息)当中。段表是操作系统在寻址之前建立的,段表建立之后段机制才能正常的工作。
非连续内存分配之分页
分页与分段的区别:段的大小是可变的,页的大小是固定不变的
- 划分物理内存至固定大小的帧(frame,指的是物理页),大小是2的幂次:512,4096,8192
- 划分逻辑地址的空间至相同大小的页(page,指的是逻辑页),大小是2的幂次:512,4096,8192
地址转换方案:转换逻辑地址为物理地址(pages to frames)
- 页表
- MMU/TLB
帧(frame):物理内存被分割为大小相等的帧。
- 一个内存的物理地址是一个二元地址(f,o)
- f—帧号(F位,表示共有2^F个帧)
- o(offset)—帧内偏移(S位,每帧有2^S帧字节)
- 物理地址的=2^S * f + o
页(page):一个程序的逻辑地址空间被划分为大小相等的页
- 一个逻辑地址是一个二元数组(p,o)
- p—页号
- o—页内偏移
- 虚拟地址(逻辑地址)= 2^S * p + o (其中S是逻辑地址的二进制表示中,表示页内偏移所占的位数,具体地址是由两部分组成,即表示页号的二进制位数和表示页内偏移的二进制位数,其中2^S的计算结果为一页所具有的存储单元的个数)
–
页寻址机制(由逻辑地址转换成物理地址的过程)
途中页表的作用是由已知的页号寻找到对应的帧号(页的大小是固定的,但分段机制中段的大小不是固定的)
- 但是逻辑页的大小和物理地址帧的大小是不一致的,一般而言是逻辑地址的空间要大于物理地址的空间
- 页映射到帧,页是连续的虚拟内存,帧是非连续的物理内存(有助于减少内存碎片),不是所有的页都有对应的帧
提示:为了更好的理解知识点,博主在微信公众号中将操作系统知识进行了重新排版和插入图片。感兴趣的朋友可以扫码进行关注。