虚拟内存
操作系统设计了虚拟内存,每个进程都有自己的独立的虚拟内存。
虚拟内存的好处
- 进程的运行内存摆脱物理内存的限制:程序运行符合局部性原理,
CPU
访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的swap
区域。 - 各个进程间内存相互独立:每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的,互不影响,避免进程间地址冲突问题。
- 页表项可以用于控制属性:页表项中可以设定页的读写权限,标记该页是否存在,为操作系统提供了更好的安全性。
虚拟内存定义
- 虚拟内存是一种扩展物理内存的优化方法。虚拟内存将内存以页的形式存储在硬盘中并使用缓存,模拟更大的内存容量。
- 物理内存是计算机中的实际硬件内存,由
RAM
芯片组成。
虚拟内存与物理内存的区别
虚拟内存拓展了物理内存容量,并提供了更灵活的内存管理机制,但付出的代价是访问速度较慢。
- 大小:物理内存的容量是固定的,而虚拟内存的大小可以超过物理内存的容量。
- 访问速度:物理内存的访问速度较快,而虚拟内存的访问速度相对较慢,因为它需要与磁盘进行交互。
- 地址空间:物理内存使用物理地址进行访问,而虚拟内存使用虚拟地址,通过内存管理单元(
MMU
)映射到物理内存。 - 管理方式:物理内存的管理相对简单,而虚拟内存的管理涉及页表和页面置换等技术。
- 可用空间:物理内存的可用空间有限,而虚拟内存可以提供更大的可用空间,因为它可以使用磁盘空间作为扩展。
内存分段
内存分页
在Linux操作系统中,非连续分区的内存分配主要依赖于分页存储管理来实现。
页表
分页就是把整个虚拟和物理内存空间切分成一段固定的大小。这样一个连续并且尺寸固定的内存空间称之为页(page)。在linux
中,每个页大小为4KB
。
虚拟地址和物理地址间通过页表映射。
- 页表存储在内存中,内存管理单元
mmu
完成将虚拟地址转换为物理地址的工作。 - 由于内存空间都是预先划分的,不会像分段那样在段与段之间产生外部内存碎片。
- 内存分页机制分配内存的最小单位是页,可能导致出现页内出现内存浪费,导致内部内存碎片。
在分页机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。
内存转换流程:
- 把虚拟内存地址切分为页号和偏移量。
- 根据页号,从页表中查询对应的物理页号。
- 物理页号加上偏移量就得到了物理内存地址。
段页
段页式内存管理的优点
- 灵活性:结合段式和页式的优点,既方便管理不同类型的程序和数据,又能细致地分配和利用内存。
- 保护性:通过访问权限设置,对内存进行细粒度的访问控制,增强数据安全性。
- 共享性:支持多个程序共享内存段或页,减少冗余存储,提高内存使用效率。
- 虚拟化支持:通过页表和地址转换实现虚拟地址到物理地址的映射,支持虚拟内存技术。