【问题标题】:How to get the fastest data processing way: fork or/and multithreading如何获得最快的数据处理方式:fork 或/和多线程
【发布时间】:2017-01-26 19:57:57
【问题描述】:

假设我们有一个客户端,它不断发送大量的双重数据。

现在我们正在尝试做一个服务器,它可以接收和处理来自客户端的数据。

这是事实:
服务器可以在很短的时间内收到双倍。
服务端有个处理double的功能,只处理一个double需要3分钟以上。

我们需要让服务器尽可能快地处理来自客户端的 1000 个双精度数据。

我的想法如下:
使用线程池创建多个线程,每个线程可以处理一个double。

所有这些都在 Linux 中。

我的问题:
现在我的服务器只是一个包含多线程的进程。我正在考虑如果我使用fork(),会更快吗?
我认为只使用fork() 而不使用多线程应该是一个坏主意,但是如果我创建两个进程并且每个进程都包含多线程怎么办?这种方法可以更快吗?

顺便说一句,我读过:
What is the difference between fork and thread?
Forking vs Threading

【问题讨论】:

  • 请注意您的措辞倒置:服务器 提供调用服务。您正在描述 server 不断向 client 发送数据以进行处理的设置。从术语的角度来看,应该颠倒过来。您有一个 client 想要将数据发送到 server 进行处理;不是反过来!
  • @GhostCat 谢谢。事实上,我称它为“服务器”,因为它是执行listen 的“服务器”,而它是执行connect 的“客户端”。
  • 只是说:您应该在措辞、文档等方面准确无误,以确保团队中的每个人都了解您的服务器客户端的性质,或者是客户端服务器?
  • @GhostCat 我得到它并重新编辑。

标签: c linux multithreading process fork


【解决方案1】:

在某种程度上,这在很大程度上取决于底层硬件。它还取决于内存限制、IO 吞吐量……

示例:如果您的 CPU 有 4 个内核,并且每个内核都能够运行两个线程(并且该系统上没有太多其他事情发生);那么您可能更希望有一个包含 4 个进程的解决方案;每个运行两个线程!

或者,当使用 fork() 时,你会 fork() 4 次;但在每个分叉进程中,您应该将工作分配给两个线程。

长话短说,你真正想做的是:把自己锁在某个角落。您想要创建一个具有健全和合理设计的服务(如前所述,您正在构建一个服务器,而不是客户端)。

根据您的要求,您希望以一种允许您配置分别有多少进程的方式构建该应用程序。它将使用的线程。然后你开始分析(意思是:你衡量发生了什么);也许你做实验来找到给定硬件/操作系统堆栈的最佳值。

编辑:我很想说 - 欢迎来到现实世界。您正面临满足产品精确“性能目标”的要求。没有这样的目标,程序员的生活很容易:大多数时候,一个人只是坐下来,组装一个合理的产品,并考虑到当今硬件的力量,“事情已经足够好了”。

但如果事情不够好,那么只有一种方法:您必须了解所有在此发挥作用的事情。从“我可以使用我的操作系统中的哪些系统调用来获得正确的核心/线程数?”开始。

换句话说:您“逃脱”而不知道您正在使用的硬件的确切容量的日子已经结束了。如果您打算“玩这个游戏”;那么就没有弯路:您将必须学习规则!

最后:这里重要的不是进程与线程。您必须了解,您需要在这里掌握整体。如果您调整客户端以获得最大的 CPU 性能,这将无济于事……然后发现网络或 IO 问题导致的“损失”是您仅查看 CPU 获得的“损失”的 10 倍。换句话说:您必须查看系统中的所有部分;然后您需要测量以了解您的瓶颈所在。然后然后由您决定要采取的行动!

Michael Nygard 的“Release It”是一本很好的读物。当然,他的书主要是关于 Java 世界中的模式;但他在“性能”的真正含义方面做得很好。

【讨论】:

  • 我的电脑有 4 个核心。但是我怎么知道每个核心的容量呢?当我需要多线程时,我只是使用它,我从不考虑核心的容量......
  • 我更新了我的答案。不确定你是否会喜欢这样,但我认为这就是你要做的。
  • 非常感谢。它有帮助,我喜欢它。
  • 说真的,我真的很喜欢你的回答。我很久以前就有这样的问题,你的回答对我很有帮助。坏事是:我只能投票一次......
【解决方案2】:

fork 这样的方式比启动线程要慢得多。线程比完整的操作系统进程更轻量级(传统上,尽管进程在过去几年已经赶上),不仅在 CPU 要求方面,而且在内存占用和一般操作系统开销方面。

当您考虑预先安排的线程或进程池时,设置时间在程序运行时不会占太多,因此您需要研究“进程间的成本是多少通信” - 线程之间(本地)通常比进程之间便宜(线程不需要通过操作系统来交换数据,仅用于同步,在某些情况下你甚至可以不这样做)。但不幸的是,您没有说明 工作线程之间是否需要 IPC。

总结:我看不出使用fork() 有什么好处,至少在效率方面没有。

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多