【问题标题】:Are processes slower then threads进程是否比线程慢
【发布时间】:2011-11-09 06:21:53
【问题描述】:

我刚刚写了一个关于caching 的问题,这让我开始思考。使用具有严格 API 的服务器进程是否比静态链接的服务器库慢(可能在其自己的线程中)?

如果速度较慢,有多少开销? 操作系统是 linux,但我的大部分开发和测试都是在 windows 上。

【问题讨论】:

    标签: linux multithreading process


    【解决方案1】:

    是的,它比较慢,因为它涉及上下文切换和复制数据的额外工作。这就是 SQLite 受欢迎的原因之一。

    至于多少开销,“视情况而定”,但答案可能是“不足以成为您的问题”。与往常一样,如果有疑问,唯一要做的就是尝试两种方法并对其进行基准测试/分析。

    【讨论】:

      【解决方案2】:

      视情况而定。

      我认为上下文切换在 Linux 中的线程和进程之间并没有什么不同。然而:

      • 启动一个新进程(例如使用 posix_spawn 或 fork/exec)比启动一个新线程慢,因为您必须加载一个新的进程映像,它会调用动态链接器并执行其他操作

      • 多进程系统可以使用比多线程系统更多的内存 - 有时 - 取决于您共享的数据结构。这当然会影响性能,从而减少其他事情的内存。

      “fork 但不执行”的进程位于进程和线程“之间”的某个位置。然而,它们也有自己的问题(例如,如果许多库与另一个进程共享文件描述符,它们就会变得混乱)。

      【讨论】:

      • 至少在 ARM 上,进程切换与线程切换相比性能会受到很大影响,因为它们涉及由于虚拟地址空间更改而导致的缓存刷新。
      • @blueshift:IIRC 较新的 ARM 不再具有虚拟索引的虚拟标记缓存,因此这不适用于较新的 ARM。 OTOH,您可能需要刷新 TLB 和分支预测器。
      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2016-04-07
      • 2020-08-15
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多