在Linux上工作的线程限制与networking/ IO绑定应用程序的进程相比有什么限制?

我听说在linux下的多核服务器上,当你只有一个进程但是multithreading时,不可能达到最高性能,因为Linux对IO有一些限制,所以在8核心服务器上有8个线程的进程可能是比8个进程慢。

任何意见? 还有其他的限制,可能会减慢应用程序? 这些应用程序是一个networkingC ++应用程序,服务于100多个客户端,有一些磁盘IO。

更新:我担心除了我自己实现的锁之外,还有一些与IO相关的问题…在几个线程中执行simultaniousnetworking/磁盘IO没有任何问题吗?

Solutions Collecting From Web of "在Linux上工作的线程限制与networking/ IO绑定应用程序的进程相比有什么限制?"

线程的缺点

主题:

  • 序列化内存操作。 这就是内核,MMU又必须服务诸如执行页面分配的mmap()操作。
  • 共享相同的文件描述符表。 有锁定涉及在这个表中进行更改和执行查找,它存储像文件偏移和其他标志的东西。 每一个使用这个表的系统调用,例如open()accept()fcntl()必须锁定它以将fd转换为内部文件句柄,以及何时进行更改。
  • 分享一些调度属性。 不断对流程进行评估,以确定他们加载到系统上的负载,并相应地进行安排。 线程数量多意味着调度程序通常不喜欢的CPU负载较高,并且会增加该进程事件的响应时间(例如读取套接字上的传入数据)。
  • 可能共享一些可写的内存。 任何由多个线程写入的内存(如果需要高级锁定的话,速度特别慢)会产生各种缓存争用和转移问题。 例如, malloc()free()等堆操作在全局数据结构上运行(可以在一定程度上解决)。 还有其他的全球结构。
  • 共享凭据,这可能是服务类型进程的一个问题。
  • 共享信号处理,这些将在处理它们时中断整个过程。

进程或线程?

  • 如果你想使调试更容易,使用线程。
  • 如果你在Windows上,使用线程。 (进程在Windows中是非常重量级的)。
  • 如果稳定性是一个巨大的问题,尝试使用进程。 (只需一个SIGSEGV/PIPE …)。
  • 如果线程不可用,请使用进程。 (现在不太常见,但确实发生过)。
  • 如果您的线程共享不能在多个进程中使用的资源,请使用线程。 (或者提供一个IPC机制来允许与资源的“所有者”线程进行通信)。
  • 如果您使用的资源只能以一个进程为基础(每个进程只有一个进程),那么显然使用进程。
  • 如果你的处理上下文没有任何共享(比如一个套接字服务器产生和忘记连接),而CPU是一个瓶颈,使用进程和单线程运行时(没有任何强烈的锁定如在堆和其他地方)。
  • 线程和进程之间最大的区别之一是:线程使用软件构造来保护数据结构,进程使用硬件(速度明显更快)。

链接

  • 并行线程(7)
  • 关于进程和线程(MSDN)
  • 线程与进程

它确实应该没有区别,但可能是关于设计。

多进程的应用程序可能不得不做更少的锁定,但可能会使用更多的内存。 在进程之间共享数据可能会更困难。

另一方面多进程可以更强大。 您可以调用exit()并最终安全地退出,而不会影响其他人。

这取决于客户的依赖程度。 我通常推荐最简单的解决方案。