猿问

Linux中的线程与进程

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

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


慕慕森
浏览 613回答 3
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_fork和SYS_clone系统调用,但在内核中,sys_fork并且sys_clone它们都是围绕同一do_fork函数的非常薄的包装器,它本身就是一个薄的包装器copy_process。是的,术语process,thread以及task相当互换使用Linux内核...
随时随地看视频慕课网APP
我要回答