具有相同可执行文件的进程之间的上下文切换是否更便宜

Is a context switch less expensive between processes with the same executable

问题

进程 运行 相同可执行文件(例如,cat 的两个单独实例)与进程 运行 不同可执行文件之间的上下文切换之间是否存在任何显着差异?

背景

我已经知道拥有相同的可执行文件意味着它可以缓存在内存中的相同位置以及可能可用的任何 CPU 缓存中,所以我知道当您从一个缓存切换时处理到另一个,如果它们都执行相同的可执行文件,则缓存未命中的几率较小(如果可执行文件足够小或者它们以大致相同的方式执行,则可能为零 "spot",并且内核在此期间不会执行任何可能导致相关内存从缓存中逐出的操作)。这当然适用于 "all the way down",内存仍在 RAM 中与已分页到 swap/disk。

我想知道我是否遗漏了其他注意事项?也许与虚拟内存映射有关,或者是否有任何内核能够以某种方式在两个进程之间的上下文切换之外获得更好的性能 运行 相同的可执行二进制文件?

动机

我一直在思考小程序只做一件事的 Unix 哲学,以及如何得出其逻辑结论,它导致许多小的可执行文件被分叉并执行多次。 (例如,30 多个 runsv 进程在 Void Linux 启动时几乎同时启动 - 请注意 runsv 只是启动期间的一个很好的例子,因为它们大部分时间都花在阻塞等待上对于事件,一旦他们启动了他们的子服务,所以除了早期启动之外,他们之间没有太多的上下文切换发生。但是我们可以很容易地想象许多 cat/bin/sh 实例 运行 在一次或其他。)

上下文切换开销是一样的。这通常是通过一条(耗时的)指令完成的。

有一些更高级的操作系统(即不是太监)支持安装的共享程序。当多个进程访问它们时,它们减少了开销。例如,只有一个只读数据副本加载到物理内存中。