参考:小林coding
虚拟内存存在的目的?
为了能够同时运行多个进程同时进程之间互不干扰
虚拟地址通过MMU找到物理地址
物理内存怎么映射的?
物理内存的映射方法主要有两种,内存分段和内存分页
内存分段
把程序的不同区,分段映射
会存在问题:内存碎片、内存交换效率低
内存碎片很好理解,解决办法是:
先写入硬盘,再读回内存,位置都是紧贴在一起
内存交换效率低
每次内存交换都要交换一个程序的段,会导致交换效率低
内存分页
Linux下一个页大小是4KB
页表存储在内存中,MMU将虚拟内存转成物理内存地址
流程:
- 进程访问的虚拟地址在页表内查不到,此时会出现缺页异常
- 进入系统内核空间分配物理内存,更新进程页表
内存不够的情况:
- 会把最近没有使用的页内存释放,写入硬盘(换出)
- 需要时再加载回来(换入)
内存分页映射
如果只用一个页表,那么在进程增多时,页表的大小会特别大
多级页表
多级页表的一级页表可以覆盖整个内存空间
如果某个一级页表项没有被用到,二级页表就不会被创建
需要时才会创建。
64位操作系统的页表分级:
全局页目录项PGD
上层页目录项PUD
中间页目录项PMD
页表项PTE
TLB
页表cache
把最常访问的页表存储到访问速度更快的cache
称为页表缓存,快表
CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的⻚表。
段页式内存管理
先划成段,再从段里划成页
Linux内存管理
linux使用页式内存管理
虚拟内存地址分为内核空间和用户空间
所有进程的虚拟地址中的内核空间地址指向同一物理内存空间
用户空间
分为:
- 程序文件段,.text
- 已初始化数据段,.data
- 未初始化数据段,.bss
- 堆段
- 文件映射段
- 栈段