linux - Linux 中的线程与进程

标签 linux performance multithreading process

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

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

最佳答案

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

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

  • CLONE_FILES:共享同一个文件描述符表(而不是创建副本)
  • CLONE_PARENT:不要在新任务和旧任务之间建立父子关系(否则, child 的getppid() = parent 的getpid( ))
  • CLONE_VM:共享相同的内存空间(而不是创建 COW 副本)

fork() 调用 clone(最少共享)pthread_create() 调用 clone( 大部分分享)。 **

forking 比 pthread_createing 花费一点点,因为复制表和为内存创建 COW 映射,但 Linux 内核开发人员已经尝试(并成功)尽量减少这些成本。

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

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


* 简化。 CLONE_THREAD 导致信号传递被共享(这需要 CLONE_SIGHAND,它共享信号处理程序表)。

** 简化。 SYS_forkSYS_clone 系统调用都存在,但在内核中,sys_forksys_clone 都是非常薄的包装器围绕相同的 do_fork 函数,它本身是 copy_process 的薄包装。是的,processthreadtask 这三个术语在 Linux 内核中可以互换使用...

关于linux - Linux 中的线程与进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/807506/

相关文章:

c++ - X11 中的屏幕截图

linux - 如何根据文件是否存在递归执行命令

c# - 在 c# 中使用多个线程从 TwinCat 遍历非二进制树状结构

java - 线程同步

c - 如何释放子线程中的内存?

linux - 从程序集 AT&T 中的文件中读取数据

c++ - 我的应用程序中的 QKeyEvent 不起作用

java - android setText() 多个textView

javascript - Chrome 开发者工具中的 "XHR Load"是什么意思?

python - 为什么 Python 3.3 中的打印速度如此之慢,我该如何解决?