C 如何获得最快的数据处理方式:fork或/和多线程

C 如何获得最快的数据处理方式:fork或/和多线程,c,linux,multithreading,process,fork,C,Linux,Multithreading,Process,Fork,假设我们有一个客户端,它不断发送大量的双重数据。 现在我们正在尝试制作一个服务器,它可以接收和处理来自客户端的数据。 事实是: 服务器可以在很短的时间内收到双份邮件。 服务器上有一个处理double的功能,只需3分钟以上即可处理一个double 我们需要使服务器尽可能快地处理来自客户端的1000个双倍数据。 我的想法如下: 使用线程池创建多个线程,每个线程可以处理一个双线程。 所有这些都在Linux中。 我的问题: 目前,我的服务器只是一个包含多线程的进程。我正在考虑如果我使用fork(),它会

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

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

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

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

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

所有这些都在Linux中。

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

顺便说一句,我读过:


分叉
这样做比启动线程慢得多。一个线程比一个完整的操作系统进程要轻得多(传统上,虽然进程在过去几年中已经赶上了),不仅在CPU需求方面,而且在内存占用和一般操作系统开销方面

当您考虑一个预先安排好的线程或进程池时,安装时间在程序运行时不会占多大比例,因此您需要研究“进程间通信的成本是多少”——线程间通信(本地)通常比进程间通信便宜(线程不需要通过操作系统来交换数据,只是为了同步,在某些情况下,您甚至可以不通过操作系统来交换数据)。但不幸的是,您没有说明工作线程之间是否需要IPC


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

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

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

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

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

根据您的需求,您希望以一种方式构建该应用程序,允许您配置它将使用多少进程和线程。然后您开始分析(意思是:您测量正在发生的事情);也许您可以进行实验,为给定的硬件/操作系统堆栈找到最佳配置

编辑:我很想说——欢迎来到现实世界。你面临着满足产品精确“性能目标”的要求。没有这些目标,程序员的生活相当简单:大多数时候,一个人只是坐下来,组装一个合理的产品,并且考虑到当今硬件的强大,“一切都足够好了”

但是如果事情还不够好,那么只有一种方法:你必须了解在这里起作用的所有事情。从“我可以使用操作系统中的哪个系统调用来获得正确的内核/线程数”开始

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

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


迈克尔·尼加德(Michael Nygard)的《发布它》(Release It)是一本不错的读物。当然,他的书主要是关于Java世界中的模式的;但他在“性能”方面做得很好真正的意思是。

请注意,您的措辞是颠倒的:服务器提供呼叫服务。您描述的是服务器不断向客户端发送数据以进行处理的设置。从术语的角度来看,这应该是颠倒的。您有一个客户端希望向服务器发送数据以进行处理;而不是相反nd!@GhostCat谢谢。事实上,我称之为“服务器”,因为它是负责
监听的“服务器”,也是“客户端”这就是
connect
。只是说:你应该在措辞、文档等方面做到精确。以确保你的团队中的每个人都了解你的服务器客户端的性质,或者是一个clientserver?@GhostCat我得到了它并重新编辑。我的电脑有4个核心。但是我怎么知道每个核心的容量呢?当我需要多线程时,我就使用它我从不考虑核心能力……我更新了我的答案。我不确定你是否会喜欢,但是我认为这就是你要做的。非常感谢。这很有帮助,我很喜欢。我真的很喜欢你的回答。我很久以前就有过这样一个问题,你的回答帮助了我很多。坏事是:我只能一次投票。