c - 如何获得最快的数据处理方式: fork or/and multithreading

标签 c linux multithreading process fork

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

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

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

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

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

所有这些都在 Linux 中。

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

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

最佳答案

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

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

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

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

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

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

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

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

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

迈克尔·尼加德 (Michael Nygard) 的“释放它”(Release It) 是一本很好的读物。当然,他的书主要是关于 Java 世界中的模式;但他很好地诠释了“性能”的真正含义。

关于c - 如何获得最快的数据处理方式: fork or/and multithreading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39567896/

相关文章:

c - 链表中的段错误

c - 是否存在将文本文件转换为字符串文字作为构建步骤的任何内容?

python - 编写 Python 脚本以实时显示兆位/秒

c++ - 如何在 QML 函数异步的同时使用 QML 中的 QThread

c - 函数更改其他变量的数据

c - 如何使用 fgets 中的一行来制作单词数组?

linux - 无法将文件传输到 cgi-bin 文件夹

c - 在 C 中没有锁的线程之间共享 bool 值

multithreading - C++11共享指针线程安全被破坏?

c++ - 线程没有被分离