一、两者对比

进程是最小的资源分配单位,线程是最小的执行单位:

  • 每个进程至少有一个线程,任务的执行都是由线程来完成,也就是说,线程时进程运行时的实体。
  • 线程运行时依赖进程中分配的资源,一个进程可以有多个线程,但是每个线程只属于一个进程。

进程之间相互独立,线程之间数据共享:

  • 每个进程拥有自己独立的地址空间:堆、栈等。
  • 线程之间大部分数据是共享的,它只拥有自己独立的栈,局部堆以及单独的信号屏蔽字等。

进程创建和切换的开销比线程要大:

  • 操作系统切换进程的时候,需要保存进程上下文(线程也属于进程上下文中的内容)。创建进程时,子进程需要拷贝父进程的数据内容,遵循读时共享、写时复制的原则。
  • 线程切换只需要切换线程所有的栈空间,只需要移动栈指针即可,开销远小于进程切换。

进程间通信比线程间通信麻烦:

  • 进程间通信依赖IPC通信方式:共享内存、管道以及socket等,实现复杂。
  • 线程间通信只需要通过定义全局变量即可,各线程都能共享。

进程比线程稳定:

  • 多进程间,有各自独立的数据段,一个进程的崩溃不会影响到其他进程。
  • 多线程间数据共享,一个线程的崩溃往往会影响其他线程。

表格对比

对比点进程线程
定义进程时运行中的程序,是最小的资源分配单位线程是进程执行的实体,是最小的执行单位
资源占用占用资源多占用资源较少
内存共享数据不共享,遵循读时共享、写时复制原则大部分数据共享,只有私有的栈区不共享
通信依赖IPC通信方式,机制复杂可直接通过全局变量通信,实现简单
上下文切换耗时耗时长耗时短,更轻量
稳定性进程崩溃不会影响另外进程线程崩溃可能导致他线程也崩溃

二、多进程和多线程的选择

  • 需要频繁创建销毁的优先用线程
  • 需要进行大量计算的优先使用线程
  • 可能要扩展到多机分布的用进程,多核分布的用线程

三、参考文档

Difference between Process and Thread

编程思想之多线程与多进程系列

多线程还是多进程的选择及区别

最后修改:2020 年 02 月 26 日
喜欢就给我点赞吧