进程和线程的区别和联系及使用场景
进程
- 进程是对应用程序提供的一种抽象,是 OS 分配资源(CPU、RAM、...)的最小单元,编程模型更容易,有更强的容错性(一个进程崩溃了不会影响其他进程),有内核保证的隔离(数据和错误),使用 master/woker 形式的多进程架构一般可以一定程度的自恢复。一般使用管道、信号量、共享内存、信号量等进行 IPC(Interprocess Communication)
- 一般 Nginx/Redis 都属于 多进程模型
线程
- 线程是运行在进程上下文中的逻辑流,是 CPU 使用的最小单元,并且有自己的线程上下文,不同线程共享同一进程的除栈之外的虚拟地址空间,比进程上下文更轻量级。创建速度更快,线程间切换的代价更低(不用切换地址空间,不用更改寄存器,不用刷新 TLB),方便数据共享。
- 多在交互式、有响应优先级以及需要资源共享的程序中使用
一般使用的时候都是以进程池/线程池的形式来使用,不会有创建和销毁开销。一般能用多进程编程解决的问题不要用多线程
Ref: