一尘不染

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

linux

我听说在多核服务器上的linux下,只有1个进程但有多个线程是不可能达到最高性能的,因为Linux在IO上有一些限制,因此在8核服务器上只有1个进程有8个线程慢于8个进程。

任何意见?还有其他限制可能会使应用程序变慢吗?这些应用程序是一个网络C ++应用程序,可为数百个客户端提供服务,并带有一些磁盘IO。

更新: 我担心除了我自己实现的锁定以外,还有更多与IO相关的问题…在多个线程中同时进行网络/磁盘IO时是否没有问题?


阅读 320

收藏
2020-06-02

共1个答案

一尘不染

线程的缺点

线程数:

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

进程还是线程?

  • 如果要简化调试,请使用线程。
  • 如果您使用的是Windows,请使用线程。(在Windows中,进程非常重要)。
  • 如果稳定性是一个很大的问题,请尝试使用过程。(SIGSEGV/PIPE仅此而已…)。
  • 如果线程不可用,请使用进程。(现在还不那么普遍,但是确实发生了)。
  • 如果您的线程共享无法在多个进程中使用的资源,请使用线程。(或提供IPC机制以允许与资源的“所有者”线程进行通信)。
  • 如果您使用的资源仅基于每个进程一个(而每个上下文仅一个),那么显然使用进程。
  • 如果您的处理上下文绝对不共享任何内容(例如,套接字服务器在生成连接时就产生并忘记了连接accept()),而CPU是瓶颈,则请使用进程和单线程运行时(这些运行时应避免进行各种密集锁定,例如on)。堆和其他地方)。
  • 线程和进程之间最大的区别之一是:线程使用软件构造来保护数据结构,进程使用硬件(速度 明显 更快)。

链接

2020-06-02