①当进程开始执行需要申请内存时,会通过malloc函数去申请,此时会申请一个连续的4G虚拟内存空间,并设置相应的页表项,此时并不会分配物理内存,即也不会映射相应物理内存地址。
②当进程代码去读写此页表项的时候,CPU会访问虚拟内存,发现对应的虚拟内存没有映射到物理内存;就会引发缺页中断,此时调用缺页中断函数。
③函数调用时如果有足够的内存,就会分配并将磁盘中此程序的代码与数据拷贝到物理内存上,并完成页表的映射。
如果内存不足则会触发:
-
后台内存回收(kswapd):在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
-
直接内存回收(direct reclaim):如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。
-
以下图片来源于小林coding ,作者小林coding