进程与线程
进程
- 是资源分配的基本单位,它是程序执行时的一个实例
程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
Linux系统函数fork()可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理,父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。
线程
- 是独立调度的基本单位,程序执行的最小单位
一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
关系
- 一个进程内有一个或多个线程,同一个进程中的线程可以并发执行
- 同一个进程内的所有线程共享该进程的资源
- 两者均可并发执行
区别
- 资源:
- 进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
-
调度:
- 线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
-
地址空间、系统开销:
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
- 而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
-
通信:
- 线程之间的通信,可直接通过读/写同一进程里的数据段(全局变量、静态变量等)实现通信;
- 进程之间的通信,需要以通信的方式(IPC)来进行。