操作系统概述
操作系统的基本概念
- 并发
- 并发:交替
- 并行:同时
- 共享
- 互斥共享
- 同时共享
- 虚拟
- 异步
操作系统的发展与分类
- 手工操作接端:打卡机
- 单道批处理系统
- 多道批处理系统(引入了中断)
- 分时操作系统(分片轮流为用户服务)
- 实时操作系统(优先完成紧急任务)
操作系统的运行环境
指令
- 特权指令
- 普通指令
处理机状态
- 用户态
- 核心态
程序
- 内存系统
- 应用程序
操作系统的内核
时钟、中断、原语(CPU切换、进程管理、存储器管理、设备管理)
体系结构
- 大内核
- 微内核
中断与异常
中断机制的诞生
解决各程序只能串行执行
中断的分类
- 内中断(也称异常、陷入)
- 自愿中断
- 指令中断
- 强迫中断
- 硬件故障
- 软件中断
- 自愿中断
- 外中断
- 外设请求
- 人工干预
进程与线程
进程的定义
- 程序:就是一个指令序列
- 内存
- 程序段
- 代码段
为了方便操作系统管理完成各个程序并发执行,引进了进程实体的概念。系统为每个运行的程序分配了一个数据结构,成为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放的位置)。
- PCB
- ...
- 程序段1
- 程序段2
- ...
- 代码段1
- 代码段2
- ...
进程(PCB)的组成
- 进程描述信息
- 进程标识符PID
- 用户标识符UID
- 进程控制和管理信息
- 进程当前状态
- 进程优先级
- 资源分配清单
- 程序段指针
- 数据段指针
- 键盘
- 鼠标
- 处理机相关信息
- 各种寄存器值
进程的组织
- 链接方式
- 按照进程状态将PCB分为多个队列
- 执行队列
- 就绪队列
- 索引指针
- 操作系统持有指向各个队列的指针
- 按照进程状态将PCB分为多个队列
- 索引方式
- 按照进程状态建立几张索引表
- 同上述链接方式
- 操作系统持有指向各个索引的指针
- 按照进程状态建立几张索引表
进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
- 结构性
进程的状态与转换
状态
- 创建态
- 就绪态
- 运行态
- 阻塞态
- 终止态
转换
- 创建态
- 创建态---->就绪态
- 就绪态
- 就绪态---->运行态
- 运行态
- 运行态---->就绪态
- 运行态---->阻塞态
- 运行态---->终止态
- 阻塞态
- 阻塞态---->就绪态
进程控制
- 创建进程,需要初始化PCB、分配系统资源
- 创建态->就绪态,修改PCB内容和相应队列
- 就绪态->运行态,需要恢复进程运行环境、修改PCB内容和相应队列
- 运行态->终止态,需要回收进程拥有资源,撤销PCB
- 运行态->就绪态,进程切换,需要保存进程运行环境、修改PCB内容和相应队列
- 阻塞态->就绪态,就绪态需要修改PCB内容和相应队列
进程通信
共享存储
- 基于数据结构的共享
- 基于存储区的共享
消息传递
报文(消息头、消息体)
- 直接通信
- 间接通信
管道通信
- 内存中开辟一块大小固定的缓存区
- 只能半双工
- 实现全双工通信需要连个管道
- 读写管道要互斥
线程
轻量级进程,基本的cpu执行单元,也是程序执行流的最小单元
引入线程机制的变化
- 资源分配、调度
- 传统进程机制中,进程是资源分配、调度的基本单位
- 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
- 并发行
- 传统进程机制中,只能进程间并发
- 引入线程后,线程间也能并发,提升了并发度
- 系统开销
- 传统的进程间并发,需要切换进程的运行环境,系统开销很大
- 线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
- 引入线程后,并发所带来的系统开销小
线程的属性
- 线程是处理机调度的单位
- 多cpu计算机中,各个线程可占用不同的cpu
- 每个线程都有一个线程ID、线程控制块TCB
- 线程也有就绪、阻塞、运行等基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址空间,统一进程的线程间通信甚至无需系统干预
- 统一进程的线程切换,不会引起进程切换
- 不同进程的线程切换,会引起线程切换
- 切换同进程内的线程,系统开销很小
线程的实现方式
用户级线程
用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责,包括线程切换。用户级线程可以在用户态下即可完成,无需操作系统干预。在用户看来有多个线程,但是在操作系统中意识不到线程的存在。
内核级线程
内核级线程的管理工作由操作系统内核完成。线程调度,切换等工作都由内核负责。
二者组合
内核级线程才是处理机分配的单位
多线程模型
在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了多线程模型的问题
多对一模型
- 模型:多个用户级线程映射到一个内核级线程,每个用户进程只对应一个内核级线程
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小
- 缺点:当一个用户级线程被堵塞后,整个进程都会被阻塞,并发度不高。多线程不可以在多核处理机上并行运行
一对一模型
- 模型:一个用户级线程映射到一个内核级线程。每个用户进程与用户级线程同数量的内核级线程
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行
- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大
多对多模型
- 模型:n用户级线程映射到m内核级线程(n>=m),每个用户级线程对应m个内核及线程
- 优点:克服了多对一模型并发度不高的缺点,又克服了一对一模型中的一个用户进程占用太多内核及线程,开销太大的缺点。
处理机调度
基本概念
从就绪的队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行
调度的层次
- 高级调度
- 外存与内存的调度:无->创建态->就绪态
- 中级调度
- 内存-外存-内存的调度:挂起态->就绪态
- 低级调度
- 从内存中就绪队列取出一个给CPU使用:就绪态->运行态
进程调度(低级调度)
进程调度的时机:就是按照某种算法从就绪队列中选择一个进程为其分配处理机
- 需要进行进程调度与切换的情况
- 当前运行的进程主动放弃处理机
- 进程正常终止
- 运行过程中发生异常而终止
- 进程主动请求阻塞(如等待I/O)
- 当前运行的进程被动放弃处理机
- 分给进程的时间片用完
- 有更紧急的事情需要处理(如I/O中断)
- 有更高优先级别的进程进入就绪队列
- 当前运行的进程主动放弃处理机
- 不能进行进程调度与切断的情况
- 在处理中断的过程中,中断处理过程复杂,与硬件密切关注,很难做到在中断处理过程中进行进程切换
- 进程在操作系统内核程序临界区中
- 在原子操作过程中(原语),原子操作不可中断,要一气呵成,如修改PCB中进程状态标志,并把PCB放到相应队列
进程同步与互斥
进程同步
并发性带来了异步性,有时需要通过进程同步解决这种异步问题。有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定的先后顺序。
进程互斥
对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源
- 四个部分
- 进入区
- 检查是否可进入临界区,若可进入,需要上锁
- 临界区
- 访问临界资源的那段代码
- 退出区
- 负责解锁
- 剩余区
- 其余代码部分
- 进入区
- 需要遵循的规则
- 空闲让进
- 临界区空闲时,应允许一个进程访问
- 忙则等待
- 临界区正在被访问时,其他试图访问的进程需要等待
- 有限等待
- 需要在有限时间内进入临界区,保证不会饥饿
- 让权等待
- 进不了临界区的进程,要释放处理机,防止忙等
- 空闲让进