第一部分:进程
1. 进程的概念
进程:指一个具有一定独立功能的程序,在一个数据集合上的一次动态执行过程。
进程的组成:
一个程序运行的所有状态信息。
- 代码
- 数据
- 状态寄存器
- 通用寄存器
- 进程占用系统资源
进程的特点:
- 动态性
- 并发性
- 独立性
- 制约性
进程和程序的联系
- 进程市操作系统处于执行状态程序的抽象
- 程序 = 文件(静态的可执行文件)
- 进程 = 执行中的程序 = 程序 + 状态
- 同一个程序的多次执行对应不同的进程
- 进程执行的需要资源
- 内存
- cpu
进程和程序的区别:
- 进程是动态的,程序是静态的
- 程序是有序代码的集合
- 进程是程序的执行,进程有核心态/用户态
- 进程是暂时的,程序是永久的
- 进程是一个状态变化的过程
- 程序可长久保存
- 进程与程序的组成不同
- 进程的租车包括程序、数据和进程控制块
2. 进程控制块 PCB,Process Control Block
操作系统管理控制进程运行所用的信息集合
- 操作系统用PCB来描述进程的基本情况以及运行变化的过程
- PCB是进程存在的唯一标志
- 每个进程都在操作系统中有一个对应的PCB
进程控制块的使用
进程-创建,终止,组织管理
进程控制块的内容:
- 进程标识信息
- 处理机现场保存
- 进程控制信息
- 调度和状态信息
- 进程间的通信信息
- 存储管理信息
- 进程所用资源
- 有关数据结构连接信息
进程控制块的组织:
- 链表: 同一状态的进程其PCB成一链表,多个状态对应多个链表
- 索引表:统一状态归入一个索引表,由索引指向PCB
3. 进程状态
进程的生命周期划分:
- 创建
- 执行
- 等待
- 抢占
- 唤醒
- 结束
3.1 进程创建
- 系统初始化
- 用户请求创建一个新进程
- 正在运行的进程执行了创建进程的系统调用
-> 进入就绪状态
3.2 进程执行
- 内核选择一个就绪的进程,让它占用处理机并执行
如何选择? ——> 处理机的调度算法
3.3 进程等待
- 请求并等待系统服务,无法马上完成
- 启动某种操作,无法马上完成
- 需要的数据没有到达
3.4 进程抢占
- 高优先级进程就绪
- 进程执行当前时间用完
3.5 进程唤醒
- 被阻塞进程的资源满足
- 被阻塞进程等待的事件到达
进程只能被别的进程或操作系统唤醒
3.6 进程结束
自愿:
- 正常退出
- 错误退出
强制性的:
- 致命错误
- 被其他进程所杀
进程切换
4. 三状态进程模型
就绪 - 运行 - 等待
这三种是基本状态
Ready - Running - Block
创建:new
退出:Exit
5. 挂起进程模型
前面的部分都是和cpu相关的状态
还有一类进程模型是和存储相关的
进程挂起:处于挂起状态的进程映像在磁盘上,目的是减少进程占用内存
多加了2种状态,是指在外存中的进程状态
挂起(Suspend):把一个进程从内存转到外存
内存到外存的变迁情况:
- 等待 - 等待挂起
- 就绪 - 就绪挂起
- 运行 - 就绪挂起 (抢先分时系统的情况)
状态队列
由操作系统来维护一组队列,表示系统中所以进程的当前状态
不同队列表示不同状态
第二部分:线程
6. 线程的概念
为什么要引入线程?
在一个进程内部进一步提高并发性。
多进程实现 - 存在的问题:
- 进程之间如何通信,共享数据?
- 系统开销大,创建进程,进程结束,进程切换
如果放到一个进程内部,就会方便得多!
多进程得解决思路:
在进程内部增加一类实体,满足以下特性:
- 实体之间可以并发执行
- 实体之间共享相同的地址空间
这种实体就是线程!
线程:是进程的一部分,描述指令流的执行状态。它是进程中的指令执行流的最小单元,是CPU调度的基本单位。
进程:资源分配角色(由一组相关资源构成,包括地址空间,代码段,数据段,打开的资源等)
线程:处理机调度角色(指令流执行状态,线程控制块 TCB )
进程和线程的关系:
线程 = 进程 - 共享资源
线程的优点:
- 一个进程中可以同时存在多个线程
- 各个线程之间可以并发地执行
- 各个线程之间可以共享地址空间和文件等资源
缺点:
一个线程崩溃,会导致其所属进程的所有线程都崩溃
历史上:
单进程系统:MS-DOS
多进程系统:传统UNIX
单进程多线程:pSOS(对并发执行要求高,信息共享要求高,对安全隔离要求低)
多线程系统:现代UNIX
线程与进程的比较
- 进程是资源分配的单位,线程是cpu调度单位
- 进程拥有一个完整的资源平台,而线程只独享指令流执行的必要资源,如寄存器和栈
- 线程具有就绪、等待和运行三种基本状态今儿状态间的转换关系
- 线程能减少并发执行的时间和空间开销
线程的三种实现方式:
用户线程:在用户空间实现
如:POSIX Pthreads等
内核线程:在内核中实现:
如:Windows, Solaris, Linux
轻量级进程:在内核中实现,支持用户线程
如:Solaris (LightWeight Process)
7. 用户线程
由一组用户级的线程库函数来完成线程的管理,包括创建,终止,同步和调度
特征:
- 不依赖操作系统内核
- 在用户态实现线程
- 同一进程内用户线程切换速度快
- 允许每个进程拥有自己的调度算法
缺点:
- 线程发起系统调用时阻塞,则整个进程进入等待。
- 不支持基于线程的处理机抢占
- 只能按进程分配cpu时间
8. 内核线程
由内核通过系统调用实现的线程机制,由内核完成线程的创建,终止和管理
特征:
- 由内核维护 PCB 和 TCB
- 线程执行系统调用时被阻塞不影响其他线程
- 线程的开销较用户线程稍大
- 多线程的进程可获得更多cpu时间
轻权进程
内核支持的用户线程。一个进程可有一个或多个轻量级进程。每个轻权进程由一个单独的内核线程来支持。(Solaris/Linux)
但是,实际中这种方式并不理想。
用户线程与内核线程的对应关系
实际中,一对一的对应关系是最好的。