第十五讲 基础篇:Linux内存是怎么工作的(2020.6.8)
这一讲相关的内容正好之前看csapp的时候总结了一下,可以直接贴出来作为总结了。
Linux的内存工作原理,这又是一个特别大的话题。一切向着尽量利用物理资源的方向在发展,
在没有虚拟内存的世界里,所以的进程都能看到同一个物理内存在这种模式下如果有多个进程那么这个内存管理就很复杂了(在DSP,嵌入时系统中可能总共就一个程序这时候完全可以直接使用物理内存)。针对Unix这种多进程的系统后来就有了虚拟内存的概念。
虚拟内存 是硬件异常,硬件地址翻译,主存,磁盘和内核软件的完美交互,他为没有进程提供一个很大的,一致的地址空间。
它将内存看成一个存储在磁盘上很大的连续的空间,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传递数据,通过这种方式很好的使用了内存。
为每个进程提供了一致的地址空间,从而简化了内存管理
每个进程的地址空间是独立的,避免了进程之间在地址空间上的破坏
物理地址和虚拟地址
物理寻址(嵌入式设备/DSP设备):
虚拟寻址系统(现代处理器):
虚拟内存作为磁盘的高速缓存工具
DRAM 作为磁盘的缓存,通过虚拟内存来管理磁盘上的那个块缓存到内存中来。
VP(virtual page):将虚拟内存分割成大小固定的块
PP(physical page):物理页(叶帧)
VP---->PP 关系
通过页表(page table) 来判定一个虚拟页是否缓存在DRAM中。如果命中就指向一个物理页中, 如果不命中,系统必须判断这个虚拟页存放在磁盘的那个位置,在物理内存中选择牺牲一个页,将虚拟页从磁盘复制到DRAM中,替换掉牺牲页。
页命中:
缺页:
虚拟内存作为内存管理工具
虚拟内存除了作为磁盘的高速缓存之外,还作为Linux的内存管理工具,这样Linux中的每个进程都有相同的的地址空间格式,两个进程通过将虚拟页面映射到相同的物理页帧上是实现了共享内存。
虚拟内存作为内存保护的工具
地址翻译
多级页表:
linux 内存系统
内存分配与回收
标准库中的malloc有两种实现方式:
小块内存(小于128k) 使用sbrk分配(释放并不返还给系统,容易造成系统碎片(详细见参考2))
大块内存(大于128k) 使用mmap内存映射的方式分配(每次unmap之后都会返还给系统,所以每次mallo都会导致缺页异常,内核的管理负担增大)
系统回收内存三种方式
LRU
回收不常访问的内存,把不常访问的内存通过交换分区直接写入磁盘
OOM
参考资料