Joh*_*ino 4 linux process threads
为什么在线程之间切换比在进程之间切换并在它们之间共享数据更快?例如,在 ubuntu 上运行的 apache web 服务器可以使用 Prefork MPM(产生多个子进程)或 Worker MPM(为单个进程创建多个线程)。
快点,不完整的解释:
在线程切换中,您需要保存/加载的上下文要少得多。具体来说,内存是共享的。内核不必从脏页中取出任何页,并且 VM 会使用技巧来为新进程拉入所有内存(尽管可能需要拉入某些特定页面)。内核中还有其他进程特定的数据结构(例如,打开的文件描述符表)不需要换出。
作为副作用,此时您也更有可能使用处理器缓存中的内容。新进程可能需要启动冷缓存。
是的,有一些工具可以在进程之间共享内存(IPC 共享内存、管道),但没有一个工具像进程中的公共内存一样干净/容易。您不能像使用 realloc() 等那样增长共享内存块。除了共享内存之外的任何东西都意味着您需要多个数据结构副本,每个进程一个副本,并根据需要复制更改。
具体来说,apache 对于不同的操作系统有多种模型。原始模型是 pre-fork,提供进程隔离以换取一些重量级进程切换。这对于在第一次编写时很常见的 UNIX 运行良好,其中一些根本没有线程。Windows 的多进程非常糟糕,以至于 apache不得不做线程 - Windows 上的进程(至少在 apache 1.2/2.0 的时候)太重量级了。Linux 进程很轻,切换时间接近线程切换时间,所以通常保持在 Fork 之前。Solaris 有一个复杂的线程“LWP”模型,在混合线程/fork 模型中表现最好。