1 进程的基本概念
并发环境 && 并发程序
一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束单状态,并且次序不是事先确定的。
在并发环境下执行的程序就叫做并发程序
进程(Process)的定义
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位,又称任务。
进程的特点
- 进程是程序的一次执行过程,一个程序执行了两次、执行了三次,那就是不同的进程。
- 进程又是运行程序的一个抽象,它代表了所运行的那个环境,也就是它代表了一个 CPU 因此我们有时候说进程是对 CPU 的一个抽象。正是因为有了虚拟化技术,所以将一个 CPU 把它变换成多个虚拟的 CPU 每个进程好像都在跑在自己的 CPU 上,这就是一个抽象的结果。
- 作为进程,它在运行过程中,需要各种各样的资源所以操作系统的资源是以进程为单位来分配的,比如说内存 文件等等。 最重要的一个资源呢,实际就是地址空间,操作系统为每一个进程分配了一个独立的地址空间。
- 操作系统通过调度把 CPU 的控制权交给某个进程
进程控制块(Process Control Block)
它是操作系统用于管理控制进程的一个专门的数据结构,用来保存和管理进程的所需要的所有信息,PCB 和进程都是一一对应的,所有 PCB 集中在一起放在内存的一个固定区域,它们的集合形成了进程表,它的大小往往是固定的,表示一个操作系统最多支持多少个进程。
进程描述信息
- 进程标示符(process ID),唯一,通常为整数
- 进程名,通常基于可执行文件名,不唯一
- 用户标示符,哪个用户创建
- 进程组关系
进程的分类
- 系统进程(优先级较高)
- 用户进程
- 前台进程(和用户直接交互)
- 后台进程(启动以后后台工作的进程)
- CPU 密集进程(占用 CPU 较多时间)
- I/O 密集型进程
上下文(CONTEXT)切换
- 将 CPU 硬件状态从一个进程切换到另外一个进程的过程称为上下文切换
- 进程运行时,其硬件状态保存在 CPU 上的寄存器中
- 进程不运行时,这些寄存器的值保存在 PCB 中;当操作系统要运行一个新的进程时,将改新进程所对应的 PCB 中的相关值送到对应的寄存器中
2 进程的状态以及状态转换
进程的三种基本状态
运行态
占有 CPU,并在 CPU 上运行
就绪态
已经具备运行条件,但由于没有空闲 CPU,而暂时不能运行
等待态
因等待某一事件而暂不能运行
进程状态之间的转换
进程的其他状态
创建态
已完成创建一个进程的所必要的工作,但未同意执行该进程
终止态
终止执行后,进程进入该状态
挂起态
操作系统让一部分进程暂时不能运行,目的是为了调节负载,其不占用内存空间,将其进程映像保存在磁盘上。注意: 它不是等待
五状态进程模型
七状态进程模型
进程队列
- 操作系统为每一类进程创建一个或者多个队列
- 队列元素为 PCB
- 伴随着进程状态的改变,其 PCB 从一个队列进入另外一个队列
- 单 CPU 下运行队列里只能有一个进程
3 进程的控制
进程控制操作完成进程各状态之间的转换,由具有特定功能的原语组完成
原语
完成某种特定功能的一段程序,具有不可分割性或不可中断性(原语的执行必须是连续的,在执行过程中不允许被中断)也叫原子操作
- 进程创建原语
- 进程撤销原语
- 阻塞原语
- 唤醒原语
- 挂起原语
- 激活原语
- 改变进程优先级
...
进程的创建
- 给新的进程分配一个唯一标识,以及进程控制块
- 为进程分配地址空间
- 初始化进程控制快
- 设置相应的队列指针
进程的撤销
- 回收进程所占有资源
- 撤销该进程的 PCB
进程的阻塞
处于运行状态的进程,在其运行过程中,会期待、 等待某个事件的发生。等待键盘的输入,或者是等待磁盘的数据传输,或者是等待其他进程给它发来一些消息。在这些事件没有发生的情况下,那么进程需要自己执行一个阻塞原语来使自己的状态由运行态变为阻塞态。
4 线程的引入
为什么要在进程中再派生线程
应用的需要
- 我们最常用的这种字处理软件如果只有一个进程,那么当你去编辑、输入的时候那么排版的工作就做不了,就不能够去存盘。因此,我们通常会在录入输入一些文档的过程中再派生出其它的线程来完成其它的任务。为了防止任务丢失,我们也需要一个线程去定时存储任务。
开销的考虑
- 创建和撤销一个新线程花费时间较少
- 两个线程的切换发挥时间少
- 线程之间的通信不需要内核的介入
- 同一进程内的线程共享内存和文件
性能角度
- 当有多个处理器的时候,一个进程下的多个线程就可以同时执行
线程的基本概念
线程是进程的一个运行实体,是 CPU 的调度单位,有时候将线程称为轻量级线程。
线程的属性
- 标示符 ID
- 有状态和状态转换
- 不运行时需要保存上下文
- 有自己的栈和栈指针
- 共享所在进程的地址空间和其他资源
- 自己可以创建撤销另外一个线程
线程机制的实现
- 用户级线程
- 核心线程
- 混合方式
用户级线程
- 在用户空间建立线程库:提供一组管理线程的过程
- 运行时系统: 完成线程的管理工作
- 内核管理的还是进程,不知道线程的存在
- 线程的切换不需要内核干预
优点
- 线程切换快
- 调度算法是应用程序特定的
- 用户级线程可运行在任何操作系统上(只需要实现相应线程库)
缺点
- 内核只将处理器分配进程,同一进程重的两个线程不能同时运行于两个处理器上
- 大多数系统调用是阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞
核心级线程
- 内核管理所有的线程,并向应用程序提供 API 接口
- 内核维护进程和线程的上下文
- 线程的切换需要内核支持
- 以线程为基础进行调度
混合模型
- 线程创建在用户空间完成
- 线程调度等在内核态完成
5 重点小结
进程
并发性
任何进程都可以与其他进程一起向前推进
动态性
进程是正在执行程序的实例,进程产生是动态产生,动态消亡的,在其生命周期内,在三种基本状态之间转换
独立性
进程是资源分配的一个独立单位
交互性
指进程在执行过程中可以能与其它进程产生直接或者间接的关系
异步性
每个进程都以其相对独立的,不可预知的速度向前推进
进程映像 程序 + 数据 + 栈 + PCB
线程
- 多线程应用场景
- 线程的基本概念、属性
- 线程的实现机制
本文使用 mdnice 排版