Linux中的线程与进程

我最近听到一些人说,在Linux中,使用进程而不是线程几乎总是更好的,因为Linux在处理进程方面非常有效,而且与线程相关的问题太多(比如锁定)。然而,我对此表示怀疑,因为在某些情况下,线程似乎可以带来相当大的性能提升

所以我的问题是,当面临线程和进程都可以很好地处理的情况时,我应该使用进程还是线程?例如,如果我正在编写一个web服务器,我应该使用进程还是线程(或组合)

Linux使用1-1线程模型,对内核来说,进程和线程之间没有区别——一切都只是一个可运行的任务*

在Linux上,系统调用clone克隆任务,并具有可配置的共享级别,其中包括:

  • 克隆_文件:共享相同的文件描述符表(而不是创建副本)
  • CLONE\u PARENT:不要在新任务和旧任务之间建立父子关系(否则,子任务的getppid()=父任务的getpid()
  • CLONE\u VM:共享相同的内存空间(而不是创建COW副本)

fork()调用克隆(最小共享pthread\u create()调用克隆(最大共享)**

forking的成本比pthread\u createing稍微高一点,因为复制表和为内存创建COW映射,但Linux内核开发人员已经尝试(并成功)将这些成本降至最低

在任务之间切换,如果它们共享相同的内存空间和不同的表,将比不共享任务便宜一点,因为数据可能已经加载到缓存中。然而,即使没有共享任务,切换任务仍然非常快——这是Linux内核开发人员试图确保(并成功确保)的另一点

事实上,如果您在多处理器系统上,而不是共享实际上可能有助于提高性能:如果每个任务都在不同的处理器上运行,则同步共享内存的成本很高


*简化的克隆线程导致共享信号传递(需要克隆线程和,共享信号处理程序表)

**简化的。有SYS\u-forkSYS\u-clonesyscalls,但是在内核中,SYS\u-forkSYS\u-clone都是围绕同一do\u-fork函数的非常薄的包装器,它本身是copy\u进程的薄包装器。是的,进程线程任务这三个术语在Linux内核中可以互换使用

发表评论