前言前面我们我们已经了解了linux是如何进行内存分配的、虚拟内存和物理内存的关系、虚拟内存如何管理,今天我们来学习一下系统内存满了,会发生什么?以及会带来什么问题?大致分成这四个内容来进行学习 。
- 内存分配的过程
- 哪些内存可以被回收
- 内存回收带来的问题
- 如何保障一个进程不被kill
文章插图
内存分配的过程前面我们已经学习过应用程序通过 malloc 函数申请内存的,需要注意的是,malloc() 分配的是虚拟内存 。
如果分配后的虚拟内存没有被访问的话,虚拟内存是不会映射到物理内存的,这样就不会占用物理内存了 。
只有在访问已分配的虚拟地址空间的时候,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系 。
缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问 。在这个时候,被内存映射的文件实际上成了一个分页交换文件 。
【系统内存满了,会发生什么】如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,回收的方式主要是两种:直接内存回收和后台内存回收 。
- 后台内存回收(kswapd):在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行 。
- 直接内存回收(direct reclAIm):如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行 。
OOM Killer 机制会根据算法选择一个占用物理内存较高的进程,然后将其杀死,以便释放内存资源,如果物理内存依然不足,OOM Killer 会继续杀死占用物理内存较高的进程,直到释放足够的内存位置 。
物理内存申请过程如下图:
文章插图
哪些内存可以被回收系统内存紧张的时候,就会进行回收内存的工作,那具体哪些内存是可以被回收的呢?
主要有两类内存可以被回收,而且它们的回收方式也不同 。
- 文件页(File-backed Page):内核缓存的磁盘数据(Buffer)和内核缓存的文件数据(Cache)都叫作文件页 。大部分文件页,都可以直接释放内存,以后有需要时,再从磁盘重新读取就可以了 。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放 。所以,回收干净页的方式是直接释放内存,回收脏页的方式是先写回磁盘后再释放内存 。
- 匿名页(Anonymous Page):这部分内存没有实际载体,不像文件缓存有硬盘文件这样一个载体,比如堆、栈数据等 。这部分内存很可能还要再次被访问,所以不能直接释放内存,它们回收的方式是通过 Linux 的 Swap 机制,Swap 会把不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用 。再次访问这些内存时,重新从磁盘读入内存 。
文件页和匿名页的回收都是基于 LRU 算法,也就是优先回收不常访问的内存 。LRU 回收算法,实际上维护着 active 和 inactive 两个双向链表,其中:
- active_list 活跃内存页链表,这里存放的是最近被访问过(活跃)的内存页;
- inactive_list 不活跃内存页链表,这里存放的是很少被访问(非活跃)的内存页;
内存回收带来的问题回收内存方式的不同 。回收的内存类型的不同会带来不同的影响,下面我们就来学习一下不同的是否,不同的类型会带来怎样的影响 。
推荐阅读
- 服务器Linux系统配置mysql数据库主从自动备份
- Oracle数据库初始化参数解析:优化系统配置的终极指南!
- linux 是如何进行内存分配的
- TypeScript接口与类 - 类型系统高级用法
- 门禁系统安装步骤 门禁系统安装方法
- 秒懂分账系统的工作原理
- oppo手机怎么清理内存 Oppo手机怎么清理内存空间?
- 陈凯歌新片海报背后,每个细节都写满了算计,网友:用心险恶
- ghostWindows系统介绍
- Kubernetes 微内核的分布式操作系统