浅谈进程、线程、协程

浅谈进程、线程、协程

概念

  • 进程:计算机中的程序关于某数据集合的一次运行活动,是系统资源分配和调度的基本单位,是操作系统结构的基础。进程间切换开销比较大,但相对安全稳定。以前:进程是程序的基本执行单位。现在:进程是线程的容器。
    • 进程是一个实体,每个进程都有对应的地址空间。一般包括:文本区域、数据区域、堆栈
      • 文本区域:存储处理器执行的代码
      • 数据区域:存储变量和进程执行期间使用的动态分配的内存
      • 堆栈:存储活动过程调用的指令和本地变量
    • 进程是一个活动的实体,执行中的程序。
  • 线程:可以被称为轻量级的进程。线程是进程的一个实体,是CPU调用和分派的基本单位。线程不拥有系统资源,只有运行中必不可少的资源,但线程可以和他所属的进程共享进程所属的全部资源。每个线程有自己独立的上下文,切换受系统控制 。
    • 线程是由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成
    • 线程的三种状态:就绪状态、执行状态、堵塞状态
  • 协程:可以被称为用户态的轻量级线程。协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,切回是恢复先前保存的寄存器上下文和栈即可。可以不加锁的访问全局变量。所以协程切换非常快

区别

  • 进程和线程的比较
    • 地址空间:线程是进程内的执行单元,进程内至少由一个线程共享进程的地址空间,而进程由自己独立的地址空间
    • 资源:进程是资源分配和拥有的单位,同一个进程中的线程共享进程的资源
    • 进程是系统资源分配和调度的基本单位,线程是CPU调度的基本单位
    • 每个线程都有程序运行的入口、顺序执行序列和出口,但线程不能独立的运行,必须依存在进程中,由进程提供多线程执行控制
    • 进程和线程都可并发执行
  • 线程和协程的比较
    • 线程可以拥有多个协程,进程也可以独立拥有多个协程。(由于全局解释锁(GIL)的存在,python不能真正的进行多线程执行,但协程的存在使得python也能利用多核CPU)
    • 线程调度由系统控制,协程调度则是由用户控制
    • 进程和线程都是同步机制,协程是异步机制
    • 协程保存上一次调用的状态,每次重新进入时,就相当于进入了上一次的调用状态(python典型:yield)

多进程和多线程

  • 多任务:同一个计算机系统中允许两个及两个以上的进程处于运行状态
  • 并行运行:CPU数 >= 线程数,所有线程则可同时运行
  • 并发运行:CPU数 < 线程数,利用CPU时间片,将多个线程按照一定的顺序单个执行

并行运行的效率高于并行运行

进程间通信技术:消息传递、同步、共享内存、远程调用

  • IPC通信机制的优点:信息共享、加速、模块化、方便、私有权分离
  • IPC通信的方法:文件、信号量、管道、共享内存、socket套接字