当进程崩溃时,操作系统是不是会刷新 CPU 缓存?

Posted

技术标签:

【中文标题】当进程崩溃时,操作系统是不是会刷新 CPU 缓存?【英文标题】:Does the OS flush CPU caches when a process crashes?当进程崩溃时,操作系统是否会刷新 CPU 缓存? 【发布时间】:2016-07-10 01:40:12 【问题描述】:

当操作系统(假设是 Linux)通过 GPF 或 SIGKILL 或类似方式突然终止进程时,操作系统是否会将修改后的 CPU 缓存行刷新到主内存?是否有不同的行为取决于 CPU 或操作系统?

我正在评估非易失性内存功能,并且想知道应用程序在崩溃时将什么状态写入内存。具体来说是否缺少当前修改的 CPU 缓存行。我还没有找到关于这个的官方声明。

感谢您的帮助!

【问题讨论】:

我投票结束这个问题,因为它属于 Unix&Linux 了解更多与硬件相关的细节对于程序员来说是至关重要的,所以我认为这不是题外话。没错,它也可能是其他论坛的主题。 【参考方案1】:

一般来说,是的。 “崩溃”进程不会导致最近的内存写入丢失。

从 CPU 的角度来看,引发异常对于“正常”事件的使用频率与对于致命事件的使用频率相同。例如,访问未映射的内存页面并不总是会通过 GPF/SEGV 导致崩溃;许多操作系统将使用此事件来实现动态内存分页(例如,读入内存映射文件的页面;为零填充内存区域分配物理内存;复制 COW 内存页面)。类似地,其他 CPU 异常,例如软件中断或软件模拟指令,可能会被操作系统解释并传递回进程而不杀死它。

(另外:考虑核心转储生成和调试器的情况。被杀死的进程并不总是立即销毁;操作系统可能出于各种目的将其状态保留在内存中。)

大多数操作系统要么在上下文切换时刷新缓存,要么允许 CPU 从缓存中正常写出页面。无论哪种情况,最近的写入肯定不会被忽略。

【讨论】:

感谢您的回答,非常有帮助!您能否推荐任何好的文档资源,我可以在其中找到有关该主题的更多信息?也许我错过了要搜索的正确术语。

以上是关于当进程崩溃时,操作系统是不是会刷新 CPU 缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 集群共享缓存

Linux系统清除缓存

缓存不一致

linux学习之缓存机制

线程同步的几种方法

linux下的缓存机制及清理buffer/cache/swap的方法梳理