简单的说,分叉占用的资源较多,且在客户端很多时可伸缩性不佳(但只要客户端数量适中,分叉在现代UNIX和Linux系统中的效率很高。如果系统有多个CPU,效率就更高了);而线程化可能带来同步问题。
对进程(运行的程序)进行分叉时,基本上是复制它,而这样得到的两个进程都将从当前位置开始继续往下执行,且每个进程都有自己的内存副本(变量等)。原来的进程为父进程,复制的进程为子进程。如果你是科幻小说迷,可将它们视为并行的宇宙:分叉操作在时间轴上创建一个分支,最终得到两个独立存在的宇宙(进程)。所幸进程能够判断它们是原始进程还是子进程(通
常查看函数fork的返回值),因此能够执行不同的操作。
在分叉服务器中,对于每个客户端连接,都将通过分叉创建一个子进程。父进程继续监听新连接,而子进程负责处理客户端请求。客户端请求结束后,子进程直接退出。由于分叉出来的进程并行地运行,因此客户端无需等待。
鉴于分叉占用的资源较多(每个分叉出来的进程都必须有自己的内存),还有另一种解决方案:线程化。 线程是轻量级进程(子进程),都位于同一个进程中并共享内存。这减少了占用的资源,但也带来了一个缺点:由于线程共享内存,必须确保它们不会彼此干扰或同时修改同一项数据,否则将引起混乱。这些问题都属于同步问题。在现代操作系统(不支持分叉的Windows除外)中,分叉的速度其实非常快,较新的硬件能够更好地应付其资源消耗。如果你不想处理麻烦的同步问题,分叉可能是不错的选择。