目录
1、物理内存的主要问题?
2、Linux段页式存储中的页表
3、进程访问内存基本流程
4、进程访问虚拟地址时如何确认是否有页?
5、缺页异常是什么?如何处理?
6、page分页的策略与page status
7、swaping和paging的区别与联系
8、overcommit 和OOM killer
1、物理内存:
1)多个进程时,每个进程都给4G物理内存,分配完了只能等待;
2)进程直接访问物理内存,可修改其他进程的数据/内核地址数据;
3)内存随机分配,容易出现错误。
2、页表共三个部分组成:
此处讨论两级页表:
线性地址
CR3 -- 页目录表(包含目录项) -- 页表 ( 包含页表项)
物理地址
(页表项)--页面
3、内存访问:
进程 -- 内存 -- 虚拟地址 -- 物理内存 -- 物理地址
4、根据线性地址中的偏移量决定
偏移量占低12位,第0位是存在位,P=1表示页表项指向的该页在内存中,如果P=0,表示该页不在内存中。
5、缺页异常:
页表中对应的数据不在物理内存中。
处理:
把进程需要的数据从磁盘上缓存到物理内存中。内核调用页面异常处理程序:
通过“页面置换算法”,找一个目标覆盖页,将该页内容写到磁盘中,将进程所需数据缓存到物理页上,有效位变为1。
6、page status共四种:
1)已分配内存,未mapping(minor page fault)
free中的shared buffer作为虚拟地址中的一部分,当虚拟地址没有完全mapping到物理内存,虚拟地址不够用的时候,会引发soft(minor) page fault,需要等一小会儿完全mapping 了才行。
2)未分配物理内存(major page fault)。
3)已分配物理内存并已经mapping。
这是正常类型的page
4)已经分配物理内存已经mapping,但被swap out了。
这种情况下是物理内存不够用了,整个程序都被swap出去了。
进程的working set是指当前在物理内存中,属于该进程的pages组成的集合。
shrink working set指的是进程运行过程中缩小working set
page分为free page和dirty page,swap指的是将dirty page写到交换分区去。
OOM是指系统已经没有足够的内存给进程使用,即能free的都已经free了,能swap out的也已经swap out了,再也不能挤出物理内存的情况。
page的四种交换策略:
需要时才交换;
系统空闲时交换;
换出但不立即释放;
把页面换出推迟到不能再推迟为止。
7、swapping针对程序,paging针对页面
swapping指的整个进程,在物理内存和磁盘间swap in/swap out
tips:swap的数据kernel还是知道,因为metadata还在内核内存中。
进程中的线程结构,堆,栈必须被swap。
paging指的物理内存不够用时程序中的页面移入/移出磁盘
8、overcommit和OOM killer
linux虚拟内存的分配一般是“请求多少分配多少”,然而分配后不会完全映射到物理内存上,比如请求4M内存,内存仅有1M也答应;因为通常不一定会用到4M;
但也会有真的不够用的情况,类似银行的“挤兑危机”。这时候就需要有相应机制来处理,这就是OOM。当物理内存不够用,磁盘该swap out的也swap out了,这时候就会出现OOM(out-of-memory),于是内核调用OOM killer将一些进程kill以释放内存。
overcommit setting文件:
/proc/sys/vm/overcommit_memory
OOM配置文件:
/proc/1/oom_score_adj