一、两者对比
进程是最小的资源分配单位,线程是最小的执行单位:
- 每个进程至少有一个线程,任务的执行都是由线程来完成,也就是说,线程时进程运行时的实体。
- 线程运行时依赖进程中分配的资源,一个进程可以有多个线程,但是每个线程只属于一个进程。
进程之间相互独立,线程之间数据共享:
- 每个进程拥有自己独立的地址空间:堆、栈等。
- 线程之间大部分数据是共享的,它只拥有自己独立的栈,局部堆以及单独的信号屏蔽字等。
进程创建和切换的开销比线程要大:
- 操作系统切换进程的时候,需要保存进程上下文(线程也属于进程上下文中的内容)。创建进程时,子进程需要拷贝父进程的数据内容,遵循读时共享、写时复制的原则。
- 线程切换只需要切换线程所有的栈空间,只需要移动栈指针即可,开销远小于进程切换。
进程间通信比线程间通信麻烦:
- 进程间通信依赖IPC通信方式:共享内存、管道以及socket等,实现复杂。
- 线程间通信只需要通过定义全局变量即可,各线程都能共享。
进程比线程稳定:
- 多进程间,有各自独立的数据段,一个进程的崩溃不会影响到其他进程。
- 多线程间数据共享,一个线程的崩溃往往会影响其他线程。
表格对比
对比点 | 进程 | 线程 |
---|---|---|
定义 | 进程时运行中的程序,是最小的资源分配单位 | 线程是进程执行的实体,是最小的执行单位 |
资源占用 | 占用资源多 | 占用资源较少 |
内存共享 | 数据不共享,遵循读时共享、写时复制原则 | 大部分数据共享,只有私有的栈区不共享 |
通信 | 依赖IPC通信方式,机制复杂 | 可直接通过全局变量通信,实现简单 |
上下文切换耗时 | 耗时长 | 耗时短,更轻量 |
稳定性 | 进程崩溃不会影响另外进程 | 线程崩溃可能导致他线程也崩溃 |
二、多进程和多线程的选择
- 需要频繁创建销毁的优先用线程
- 需要进行大量计算的优先使用线程
- 可能要扩展到多机分布的用进程,多核分布的用线程
此处评论已关闭