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

Bar*_*ter 28 linux multithreading

我听说在多核服务器在Linux上是不可能达到最佳性能,当你刚刚1的过程,但多线程因为Linux对IO一定的局限性,使1个与工艺8核服务器上8个线程可能慢于8个进程.

任何意见?还有其他限制可能会减慢应用程序的速度吗?这些应用程序是一个网络C++应用程序,为100个客户端提供一些磁盘IO.

更新:我担心除了我自己实现的锁定之外还有一些与IO相关的问题......在几个线程中是否有任何问题在同时进行网络/磁盘IO?

Mat*_*ner 62

线程的缺点

主题:

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

进程还是线程?

  • 如果要使调试更容易,请使用线程.
  • 如果您使用的是Windows,请使用线程.(Windows中的进程非常重量级).
  • 如果稳定性是一个巨大的问题,请尝试使用流程.(一个SIGSEGV/PIPE是所需要的......).
  • 如果线程不可用,请使用进程.(现在不常见,但它确实发生了).
  • 如果您的线程共享无法从多个进程使用的资源,请使用线程.(或者提供IPC机制以允许与资源的"所有者"线程进行通信).
  • 如果您使用的资源仅在每个进程的基础上可用(并且每个上下文一个),显然使用进程.
  • 如果您的处理上下文完全没有共享(例如生成并忘记连接的套接字服务器accept()),并且CPU是瓶颈,请使用进程和单线程运行时(没有各种强烈的锁定,例如堆和其他地方).
  • 其中一个线程和进程之间最大的区别就是:线程使用的软件构造来保护数据结构,过程中使用的硬件(这是显著更快).

链接

  • 这是一个很好的答案,但使用"Windoze"这个术语只会让它变得贬值.无论您如何看待Windows,无论您如何看待其余部分,它肯定都有一个出色的线程API. (2认同)