进程和线程
1. 基本概念
-
进程(Process)
进程是一个动态的概念,通常指的是进程实体 = PCB + 程序段 + 数据段
。PCB主要包括程序计数器,程序上下文,程序资源(文件、信号等)等。 -
线程(Thread)
线程实际上是进程内部的一条执行序列(执行流),执行序列是指一组有序指令加数据的集合,执行序列是以函数为单位的。线程是一种轻量级的进程。线程一定是在进程内部进行活动的,并且每一个线程都拥有一个独立的计数器、进程栈和一组进程寄存器。强调一点,进程调度的对象是线程,而不是进程。 -
协程(Coroutine)
协程是一种用户态的轻量级线程,调度由用户控制,拥有自己独立的寄存器上下文和栈。协程的切换效率比线程还要高,协程和线程的区别包括:
- 线程是由CPU调度,而协程是由用户调度
- 线程存在安全问题,协程比线程较安全
- 线程使用同步机制,协程使用异步机制
- 管程(Monitor)
管程是一种程序设计语言结构部分,是代表共享资源的数据结构,以及对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块。管程被请求和释放 资源的进程所调用。本质上,管程是一种抽象数据结构(ADT)。
2. 进程和线程的区别
- 进程是系统资源分配的最小单位,线程是CPU调度的最小单位
- 一个进程可以包含多个线程,一个线程只能属于一个进程
- 进程创建的资源消耗比线程创建的资源消耗大很多
- 进程切换的效率比线程切换的效率低很多
- 系统中的进程相互独立,而同一个进程内的线程只有自己的程序计数器和栈区,其他空间共享
- 进程间通信必须借助外部手段,同一个进程内线程间通信可以借助共享空间
- 进程间不存在安全问题,同一个进程内的线程间存在安全问题
3. 进程的状态
一般情况下,将进程分为以下5中状态:
- 创建(New): 进程正在被创建,尚未到达就绪转态
- 就绪(Ready):准备运行状态,除了处理器以外的所有资源均已获得,一旦得到处理器资源即可运行
- 运行(Running):进程正在处理器上运行
- 阻塞(waiting):进程正在等待某一事件而暂停或等待某一资源可用或等待I/O操作完成。即使处理器空闲,进程也不能运行
- 结束(Terminated):进程正在从系统中消失,可能是正常结束也可能是其他原因中断退出
4. 进程间通信方式
系统中的进程相互独立,通信需要借助外部手段。大概有7种方式实现进程间通信:
4.1 管道/匿名管道
匿名管道