centos7中的上下文切换延迟

Context Switching delay in centos7

在我的 C 应用程序中,主进程派生了一个 child 进程,然后休眠十微秒,以便 child 有时间做好准备。休眠期过后,parent进程向child进程发送信号,开始监听指定端口。

此代码在 CentOS6 中执行良好,只有少数情况下睡眠时间不足以让 child 进程在来自 parent 的信号被传送之前设置其信号处理程序.但是,当此代码在具有相同系统规格的 CentOS7 中 运行 时,child 始终无法及时安装其信号处理程序。我必须将睡眠时间增加到 10 毫秒(长 1000 倍)才能获得与 CentOS6 中相同的性能。

我想知道在 same-spec 硬件上,相对于 CentOS 6,在 CentOS 7 中上下文切换如此缓慢的原因可能是什么?

不同编译的内核行为不同。你不能依赖时间间隔来做这些事情。既然你在 parent 中安装了信号处理程序,为什么不反转逻辑:当 child 准备就绪时,它可以向 parent 发送信号,然后 parent 可以开始控制 child - 没有人在忙着睡觉,一切都是事件驱动的

进程/线程调度由 OS 内核自行决定。 CentOS 7 使用与 CentOS 6.

不同的内核

无论如何,这根本不是 context-switching 的问题。上下文切换适用于共享相同 CPU [核心] 的线程/进程,但如今 single-core CPU 很少见,至少在 类 机器上是这样希望找到 CentOS。事实上,问题可能是 child 最初是否与 parent 安排在同一核心上,如果是,那么 returns 首先来自 fork().

例如,假设在 CentOS 6 上,child 和 parent 通常最终(最初)安排在同一个核心上,child 先拿到那个核心。在那种情况下,parent 根本不需要延迟,只要 child 在它首先产生 CPU 之前设置好它的信号处理程序。另一方面,如果在 CentOS 7 上,child 通常最初被安排在不同的核心上,并且两个进程立即进行,那么之前实际上并不重要的延迟突然变得重要.顺便说一下,这将是大多数措施的性能改进。

当然,所有这些都是推测。主要问题是您的方法存在严重缺陷。 parent 不应尝试猜测 child 何时准备就绪。相反,它应该等待 child 宣布 准备就绪。 child 可以通过管道或通过向 parent 发送信号来实现,或者更好的是,它们可以通过共享信号量或互斥量进行同步(这毕竟是那些 objects 的用途) .