一、进程的定义
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
二、进程的组成
1. 进程包含的内容
进程包含了正在运行的一个程序的所有状态信息。
- 程序的代码;
- 程序处理的数据;
- 程序计数器中的值,指示下一条将运行的指令;
- 一组通用的寄存器的当前值,堆、栈;
- 一组系统资源。
2. 进程与程序的联系
- 程序是产生进程的基础;
- 程序的每次运行构成不同的进程;
- 进程是程序功能的体现;
- 通过多次执行,一个程序可对应多个进程;
- 通过调用关系,一个进程可包含多个程序。
3. 进程与程序的区别
- 进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行,进程有核心态和用户态;
- 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存;
- 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块。
三、进程的特点
1. 动态性
可动态地创建、结束进程。
2. 并发性
进程可以被独立调度并占用处理机运行。
3. 独立性
不同进程的工作不相互影响。
4. 制约性
因访问共享数据/资源或进程间同步而产生制约。
5. 描述进程
描述进程的数据结构是进程控制块(Process Control Block,PCB),操作系统为每个进程都维护了一个 PCB,用来保存与该进程有关的各种状态信息。
四、进程控制结构
进程控制块是操作系统管理控制进程运行所用的信息集合,PCB 是进程存在的唯一标志。
1. PCB 的信息
- 进程标识信息;
- 处理机状态信息保护区:保存进程的运行现场信息;
- 进程控制信息:调度和状态信息、进程间通信信息、存储管理信息、进程所用资源、有关数据结构连接信息。
2. PCB 的组织方式
- 链表:同一状态的进程其 PCB 成一链表,多个状态对应多个不同的链表;
- 索引表:同一个状态的进程归入一个 index 表(由 index 指向 PCB),多个状态对应多个不同的 index 表。
五、进程的生命期管理
1. 进程创建
- 系统初始化时;
- 用户请求创建一个新进程;
- 正在运行的进程执行了创建进程的系统调用。
2. 进程运行
内核选择一个就绪的进程,让它占用处理机并执行。
3. 进程等待
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
- 请求并等待系统服务,无法马上完成;
- 启动某种操作,无法马上完成;
- 需要的数据没有到达。
4. 进程唤醒
进程只能被操作系统或是别的程序唤醒。
- 被阻塞进程需要的资源可被满足;
- 被阻塞进程等待的事件到达;
- 将该进程的 PCB 插入到就绪队列中。
5. 进程结束
- 正常退出(自愿的);
- 错误退出(自愿的);
- 致命错误(强制性的);
- 被其他进程所杀(强制性的)
六、进程状态变化模型
1. 基本状态
- 运行状态:当一个进程正在处理机上运行时;
- 就绪状态:一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行;
- 等待状态:一个进程正在等待某件事而暂停运行。
- 创建状态:一个进程正在被创建,还没有被转到就绪状态之前的状态;
- 结束状态:一个进程正在从系统中消失时的状态。
2. 状态变化图
七、进程挂起
1. 进程挂起
进程在挂起状态时,意味着进程没有占用内存空间,处于挂起状态的进程映像在磁盘中。
2. 挂起状态
- 阻塞挂起状态:进程在外存并等待某件事的出现;
- 就绪挂起状态:进程在外存,但只要进入内存,即可运行。
3. 与挂起相关的状态装换
挂起
- 阻塞到阻塞挂起:没有进程处于就绪状态或就绪状态需要更多的内存资源时,会进行这种转换,以提交新进程或运行就绪状态;
- 就绪到就绪挂起:当有高优先级阻塞(系统认为很快就绪的)进程和低优先级就绪进程时,系统会选择挂起低优先级就绪进程;
- 运行到就绪挂起:对抢占式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起状态时,系统可能会把进程转到就绪挂起状态;
在外存时的状态状态转换
阻塞挂起到就绪挂起:当阻塞挂起因相关事件出现时,系统会把阻塞挂起转换为就绪挂起进程;
解挂/激活:进程从外存转到内存
- 就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程,会进行这种转换。
- 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程。
4. 状态队列
- 由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态;
- 不同状态分别用不同的队列来表示;
- 每个进程的 PCB 都根据它的状态加入到相应的队列中去,状态变化后,切换队列。
八、线程的引入
- 实体之间可以并发地执行
- 实体之间可以共享共同的地址空间
九、线程的定义
进程当中的一条执行流程。
1. 从两个方面重新理解进程
- 从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台;
- 从运行的角度:代码在这个资源平台上的一条执行流程(线程)。
- 线程 = 进程 - 共享资源
2. 线程的优缺点
优点
- 一个进程中可以存在多个进程;
- 各个线程之间可以并发地执行;
- 各个线程之间可以共享地址空间和文件等资源。
缺点
一个线程崩溃,会导致其所属进程的所有线程崩溃。
3. 线程与进程的比较
- 进程是资源分配单位,线程是 CPU 调度单位;
- 进程拥有一个完整的资源平台,而线程只独享必不可少的资源;
- 线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换;
- 线程能减少并发执行的时间和空间开销。
十、线程的实现
1. 线程的实现方式
- 用户线程:在用户空间实现;
- 内核线程:在内核中实现;
- 轻量级进程:在内核中实现,支持用户线程。
2. 用户线程与内核线程的关系
- 多对一
- 一对一
- 多对多
3. 用户线程
在用户空间实现的线程机制,它不依赖于操作系统内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。
缺点
- 如果一个线程发起系统调用而阻塞,则整个进程在等待;
- 当一个线程开始运行后,除非它主动地 CPU 的使用权,否则它所在的进程当中的其他线程将无法运行;
- 由于时间片分配给进程,故与其他进程相比,在多线程执行时,每个线程得到的时间少,执行会比较慢。
4. 内核线程
在操作系统的内核当中实现的一种线程机制,由操作系统内核来完成线程的创建、终止和管理。
5. 轻量级进程
轻量级进程(lightweight process)是内核支持的用户线程,一个进程可有一个或者多个轻量级进程,每个量级进程由一个单独的内核线程来支持。
十一、上下文切换
1. 上下文切换发生的时机
- 暂停当前运行进程,从运行状态变成其他状态调度
- 另一个进程从就绪状态变成运行状态
2. 上下文切换保存的信息
- 寄存器;
- CPU 状态;
- 内存地址空间