我们知道,如果用户空间程序保留 malloc(),它最终可能会触发 OOM 杀手。但是内核空间呢,当内核空间内存用完时,会触发OOM Killer释放内存吗?谢谢
答案1
默认情况下,Linux 上的内核分配和用户空间分配之间存在重要区别(只要 OOM 杀手是一个因素,这一点就适用)。内核内存分配函数分配地址空间和物理页,以便当分配函数返回时,调用者知道返回的任何有效指针都可以立即使用。内存分配从用户空间分配地址空间,并且默认情况下仅在必要时分配页面(这就是 OOM 杀手发挥作用的时候)。
换句话说,内核内存分配决不允许过度使用。
内核内存分配最终可能会触发 OOM 杀手,以释放分配给用户空间的页面。这有很多条件,因为此类分配可能是在无法进行 I/O 或无法重新进入文件系统等情况下进行的。请参阅GFP 标志文档了解详情。还有其他回收机制可用于内核分配,用于缓存等;当内核耗尽内存时,它可以刷新这些内存(在某些情况下)以恢复一些内存。