为了账号安全,请及时绑定邮箱和手机立即绑定

Linux中的线程与进程

Linux中的线程与进程

慕慕森 2019-09-18 10:38:40
我最近听过一些人说在Linux中,使用进程而不是线程几乎总是更好,因为Linux在处理进程方面非常有效,并且因为线程有很多问题(例如锁定)。但是,我很怀疑,因为在某些情况下,线程似乎可以带来相当大的性能提升。所以我的问题是,当遇到线程和进程都能很好地处理的情况时,我应该使用进程还是线程?例如,如果我正在编写Web服务器,我应该使用进程或线程(或组合)吗?
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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

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

  • CLONE_FILES:共享相同的文件描述符表(而不是创建副本)

  • CLONE_PARENT:不要在新任务和旧任务之间建立父子关系(否则,孩子的getppid()=父母的getpid()

  • CLONE_VM:共享相同的内存空间(而不是创建COW副本)

fork()呼叫clone(最少共享)pthread_create()呼叫clone(大多数共享)。**

forkpthread_create由于复制表和为内存创建COW映射,成本只是一点点,但Linux内核开发人员已经尝试(并成功)降低了这些成本。

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

实际上,如果您使用的是多处理器系统,则不共享可能实际上对性能有益:如果每个任务在不同的处理器上运行,则同步共享内存非常昂贵。


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

**简化。存在两个SYS_forkSYS_clone系统调用,但在内核中,sys_fork并且sys_clone它们都是围绕同一do_fork函数的非常薄的包装器,它本身就是一个薄的包装器copy_process。是的,术语processthread以及task相当互换使用Linux内核...


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 601 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信