进程用于把资源集中到一起,也就是资源管理的单位,而线程则是在CPU上被调度执行的实体。线程概念试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作。在有了多进程的情况下,还需要多线程的原因有以下几点:
- 同一进程中的多个线程运行在相同的地址空间并共享所有可用数据,而进程则在互不相同的地址空间中。
- 线程比进程更轻量级,创建和撤销也更快。
- 使得多个不同操作的线程可以重叠进行。例如一个线程占用CPU,另一个处理I/O。
- 使得在多CPU环境下,真正的并行成为可能。
使用多线程的一个典型的例子是Web服务器。
一个服务器进程分为多个线程:一个分派线程和多个工作线程。当客户端的请求到达时,分配线程选择一个工作线程对处理进行相应。工作线程从Web页面高速缓存直接返回响应或从磁盘调取Web页面(I/O操作)。在这个过程中,分派线程是可以继续接受来自客户端的请求并选择另一个工作线程进行响应的,工作线程进行的耗时的I/O操作并没有影响整个服务器的性能。这个例子使用多线程不仅因为其并行性,而且其Web页面高速缓存是被这些线程所共享的,而多个进程是无法实现这样的共享的。如果一个程序需要进行:读—处理—写这三个步骤时,使用多线程分别完成三个阶段的工作是很有优势的。
线程模型
由于线程具有进程的某些性质,所有有时被称为轻量级进程。多进程和多线程的形象表示如下图所示: