操作系统
1、概述
1.1 定义
- 负责管理协调硬件、软件等计算机资源的工作
- 为上层的应用程序、用户提供简单易用的服务(提供接口)
- 操作系统是系统软件,而不是硬件
1.2 操作系统的功能
- 处理机管理
- 存储器管理
- 设备管理
- 文件管理
1.2.1 进程调度
1.2.2 为用户提供服务(接口):
- 命令接口:允许用户直接使用(联机命令接口、脱机命令接口)
- 程序接口:(由一组**系统调用(也称广义指令)**组成):允许用户通过程序间接使用
GUI
:现代操作系统中最流行的图形用户接口
1.3 特征
- 并发:
- 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
- 并行:指两个或多个事件在同一时刻同时发生。
- 共享
- 互斥共享方式(如:同一段时间内摄像头只能分配给其中一个进程)
- 同时共享方式(如:对硬盘资源的共享使用)
- 虚拟
- 空间复用技术(如虚拟存储器)
- 时分复用技术(如处理器的分时共享)
- 异步
多道程序环境允许多个程序并发
执行,但由于资源有限,如cpu只有一个,进程的执行并不是一贯到底的,而是走走停停的,它以不可预知的速度向前推进。
1.4 OS的发展和分类
-
手工操作阶段
-
批处理阶段
- 单道批处理系统(缺:内存仅能有一道程序运行,资源利用率低)
- 多道批处理系统(操作系统开始出现,并引进中断技术,各程序可并发执行;缺:没有人机交互功能)
- 分时操作系统
- (以时间片为单位轮流为各个用户服务,实现人机交互功能,缺:平均时间,无应对紧急任务的能力)
- 实时操作系统
- (主要特点:及时性和可靠性;优:能及时处理紧急任务)
- 硬实时系统(必须在绝对严格的规定时间内完成处理)
- 软实时系统
- 网络操作系统
- (实现网络资源的共享和各计算机之间的通信)
- 分布式操作系统
- (主要特点:分布性和并发性)
- 个人计算机操作系统
1.5 OS的运行机制和体系结构
1.5.1 运行机制
-
两种指令
- 特权指令(如:内存清零指令)
- 非特权指令
-
两种处理器状态(通过寄存器
PSW
的标志位来识别)- 核心态
- 用户态(CPU只能执行非特权指令)
-
两种程序
-
内核程序
-
应用程序(只能执行非特权指令)
-
1.5.2 操作系统内核功能
-
时钟管理:实现计时功能
-
中断处理
-
原语(具有原子性;运行时间短,调用频繁)
-
对系统资源进行管理的功能
- 进程管理
- 存储器管理
- 设备管理
1.5.3操作系统的体系结构
-
大内核–>优:高性能,结构混乱,难以维护;缺:内核代码庞大,
-
微内核–>优:结构清晰;缺:需频繁在核心态和用户态之间切换,性能低
1.6 中断和异常
1.6.1 中断分类:
- 内中断(异常、例外、陷入)信号来源CPU内部,与当前执行的指令有关
- 自愿中断——指令中断
- 强迫中断
- 硬件故障(如:缺页)
- 软件中断(如:整数除零)
- 内中断(另一种分类方式)
- 陷阱
- 故障
- 终止
- 外中断(中断)与当前执行的指令无关
- 外设请求(I/O中断请求)
- 人工干预(强行终止)
1.6.2 系统调用
系统调用会使处理器从用户态进入核心态,发生在用户态,执行在核心态(执行陷入指令会产生内中断,使处理器进入核心态)
- 系统调用——(按功能分类)
- 设备管理:完成设备的请求释放/动等功能
- 文件管理:完成文件的读/写/创建删除等功能
- 进程控制:完成进程的创建撒销/阻塞唤醒等功能
- 进程通信:完成进程之间的消息传递信号传递等功能
- 内存管理:完成内存的分配回收等功能
2、进程与线程
2.1 进程
程序段、数据段、PCB三部分组成了进程实体。
2.1.1 进程的特性
- 动态性(动态性是进程最基本的特征)
- 并发性
- 异步性(各进程以不可预知的速度向前推进,可能导致运行结果的不确定性)
- 独立性(进程是资源分配、接受调度的基本单位)
- 结构性
2.2 进程的状态
- 运行态
- 就绪态
- 阻塞态–>指进程因发生某事件(如请求 I/O、申请缓冲空间等)而暂停执行时的状态
- 创建态–>进程正在被创建,操作系统为进程分配资源、初始化PCB
- 终止态
2.2.1 进程状态的转换
2.3 进程的控制
用原语实现进程控制,原语采用“关中断指令”和“开中断指令”实现
2.3.1 进程映像
一般由程序、数据、栈、PCB组成
2.3.2 PCB(控制代码块)
-
进程描述信息(PCB是进程存在的唯一标志)
- 进程标识符
PID
- 用户标识符
UID
- 进程标识符
-
进程控制和管理信息
-
进程当前状态
-
进程优先级
-
-
资源分配清单
- 程序段指针、数据段指针、键盘、鼠标
-
处理机相关信息
- 各种寄存器值
2.3.3 原语操作
- 更新PCB中的信息
- 将PCB插入适合的队列
- 分配/回收资源
2.3.2 相关原语
- 进程的创建
- 进程的终止
- 进程的阻塞
- 进程的唤醒(阻塞和唤醒要成对出现)
- 进程的切换
2.4 进程的组织
- 链接方式
- 索引方式
2.5 进程的通信
- 共享存储(两个进程对共享空间的访问必须是互斥的)
- 基于数据结构的共享
- 基于存储区的共享(速度快)
- 消息传递(进程间的数据交换以格式化的消息为单位)
- 直接通信方式(直接挂到进程的消息缓冲队列)
- 间接通信方式(通过中间体(信箱))
- 管道通信(半双工通信)
2.6 线程、多线程模型
引进线程:可增加并发度,减少并发带来的开销
线程是处理机调度的单位,进程是资源分配的单位
- 线程的实现方式
- 用户级线程(所有的线程管理工作都由应用程序负责(包括线程切换))
- 内核级线程(内核级线程的管理工作由操作系统内核完成。)
- 组合方式(操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。)
- 多线程模型
- 多对一(优:进程管理开销小效率高、、缺:一个线程阻塞会导致整个进程都被阻塞(并发度低))
- 一对一(优:进程管理开销大、、缺:各个线程可分配到多核处理机井行执行,并发度高)
- 多对多(集二者之所长)
3、 处理机调度
按照一定的算法选择一个进程并将处理机分配给它运行
3.1 调度的三个层次
- 高级调度(作业调度):外存–>内存
- 中级调度(内存调度):挂起–>唤醒
- 低级调度(进程调度):就绪态–>运行态
进程的挂起状态与七状态模型
进程切换的过程主要完成了:
- 对原来运行进程各种数据的保存
- 对新的进程各种数据的恢复
3.2 进程调度
3.2.1 时机
-
什么时候进行进程调度?
- 主动放弃
- 进程正常结束
- 因IO请求、P操作、阻塞原语等,从运行态进入阻塞态
- 被动放弃
- 优先级更高的进程占用
- 时间片用完
- 主动放弃
-
什么时候不能进行进程调度?
- 在处理中断的过程中
- 进程在操作系统内核程序临界区中不能进行调度与切换
- 原子操作过程中(原语)
3.2.2.进程调度的方式
- 非剥夺调度方式(非抢占式)–>只能由当前运行的进程主动放弃CPU
- 剥夺调度方式(抢占式)–>可由操作系统剥夺当前进程的CPU使用权
3.2.3 调度算法的评价指标
3.3 调度算法
3.3.1 先来先服务(FCFS
)
非抢占式的算法
3.3.2 短作业优先(SJF
)
追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
最短的作业先服务
SJF
是非抢占式的算法
也有抢占式的算法–最短剩余时间优先算法(SRTN
)
3.3.3 高响应比优先(HRRN
)
响应比:(等待时间+要求服务时间)/要求服务时间
非抢占式的算法
3.3.4 时间片轮转调度算法(RR)
各进程轮流执行一个时间片的时间
抢占式算法
3.3.5 优先级调度算法
非抢占式:执行完一个进程再按优先级次序进行调度
抢占式:当执行时发现有更高优先级的进程到达就绪队列,则立即发生调度
3.3.6 多级反馈队列调度算法
抢占式算法
4、进程同步与死锁
4.1 进程同步
并发性带来了异步性,进程同步是为了解决进程的异步问题。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定的先后顺序。
4.2 进程互斥
进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。
即同一时间段内只能允许一个进程访问该资源(临界资源)。
4.2.1 临界资源
只允许一个进程访问的共享资源称为临界资源。
4.2.2 临界资源的访问过程
- 进入区:检查是否可进入临界区,若可进入,需要“上锁”
- 临界区:访问临界资源的那段代码
- 退出区:负责解锁
- 剩余区:其他代码
4.2.3 临界区访问准则
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
- 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
4.3 互斥的软件实现方法
- 单标志法
- 双标志先检查
- 双标志后检查
- Peterson算法
- 在进入区"主动争取一主动谦让—检查对方是否想进、己方是否谦让"
主要问题:不遵循"让权等待"原则,会发生“忙等”
- 在进入区"主动争取一主动谦让—检查对方是否想进、己方是否谦让"
4.4 互斥的硬件实现方法
- 中断屏蔽方法
TestAndSet
(TS
指令/TSL
指令)- Swap指令 (
XCHG
指令)
4.5 信号量机制
一对原语:wait(S)原语、signal(S)原语,简称P(S)、V(S)操作
- 整型信号量
- 用一个整数型变量作为信号量,数值表示某种资源数
- 整型信号量与普通整型变量的区别:对信号量只能执行 初始化、P、V 三种操作
- 整型信号量存在的问题:不满足让权等待原则
- 记录型信号量
- S.value 表示某种资源数,S.L 指向等待该资源的队列
- P 操作中,一定是先S.value–之后可能需要执行 block 原语
- V 操作中,一定是先S.value++,之后可能需要执行 wakeup 原语
- 注意:要能够自己推断在什么条件下需要执行 block或wakeup
- 可以用记录型信号量实现系统资源的“申请”和“释放”
- 可以用记录型信号量实现进程互斥、进程同步
- AND型信号量
4.6 经典的进程同步问题
- 生产者-消费者问题
- 多生产者-多消费者问题
- 读者-写者问题
- 哲学家进餐问题
- 吸烟者问题
- 打瞌睡的理发师问题
4.7 管程
为了解决信号量机制编程麻烦、易错的问题
4.8 死锁
死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进。
饥饿:由于长期等待得不到想要的资源,无法向前推进。
4.8.1 产生死锁的必要条件
- 互斥条件
- 部分分配(占有且等待)条件
- 不可抢占(非剥夺)条件
- 循环等待条件
4.8.2 什么时候会发生死锁?
- 各进程对不可剥夺的资源(如打印机)的竞争
- 请求和释放资源的顺序不当
- 实现互斥的P操作在实现同步的P操作之前
4.8.3 死锁的处理策略
-
预防死锁:破坏死锁产生的四个必要条件中的一个或几个。
-
避免死锁:用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
- 安全序列、安全状态、不安全状态
- 避免系统进入不安全状态------银行家算法
-
死锁的检测和解除:允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措
施解除死锁。 -
死锁的检测
-
解除死锁的主要方法有:
- 资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
- 撤销进程法(或称终止进程法):强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一赛,以后还得从头再来。
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
5、存储管理
5.1 存储
内存可存放数据。程序执行前需要先放到内存中才能被CPU处理-----缓和CPU与硬盘之间的速度矛盾
指令的工作原理—操作码+若干参数(可能包含地址参数)
5.1.1 地址空间
- 逻辑地址(相对地址)
- 物理地址(绝对地址)
5.1.2 从写程序到程序运行—编译、链接、装入
编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言
链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
装入(装载):由装入程序将装入模块装入内存运行
5.1.3 链接的三种方式
1.静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块)之后不再拆开。
2.装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
3.运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
5.1.4 装入的三种方式
绝对装入:编译时产生绝对地址
静态重定位:装入时将逻辑地址转换为物理地址
动态重定位:运行时将逻辑地址转换为物理地址,需设置重定位寄存器
5.2 内存管理
1.操作系统负责内存空间的分配与回收
2.操作系统需要提供某种技术从逻辑上对内存空间进行扩充(实现虚拟性)
5.2.1 地址转换
操作系统负责实现逻辑地址到物理地址的转换
三种方式
1.绝对装入:编译器负责地址转换(单道程序阶段,无操作系统)
2.可重定位装入:装入程序负责地址转换(早期多道批处理阶段)
3.动态运行时装入:运行时才进行地址转换(现代操作系统)
5.2.2 存储保护
保证各进程在自己的内存空间内运行,不会越界
两种方式
1.设置上下限寄存器
2.利用重定向继勋奇、界地址寄存器进行判断
5.2.3 内存空间扩充
- 覆盖技术
- 交换技术
- 覆盖与交换的区别
5.2.4 内存空间的分配与回收
5.2.4.1 连续分配管理方式
- 单连续分配
- 固定分区分配
- 动态分区分配
- 动态分区分配算法:
- 首次适应算法(First Fit)
最佳适应算法(Best Fit)
最坏适应算法(Worst Fit)
邻近适应算法(Next Fit)
- 首次适应算法(First Fit)
- 动态分区分配算法:
5.2.4.2 非连续分配管理方式
- 基本分页存储管理
- 基本分段存储管理
- 段页式存储管理
5.3 虚拟内存管理
5.3.1 传统存储管理的特征、缺点
一次性:作业数据必须一次全部调入内存
驻留性:作业数据在整个运行期间都会常驻内存
5.3.2 局部性原理
时间局部性:现在访问的指令、数据在不久后很可能会被再次访问
空间局部性:现在访问的内存单元周围的内存空间,很可能在不久后会被访问
高速缓存技术:使用频繁的数据放到更高速的存储器中
5.3.3 虚拟内存的定义和特征
定义:程序不需全部装入即可运行,运行时根据需要动态调入数据,若内存不够,还需换出一些数据
特征
多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
对换性:无需在作业运行时一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
5.3.4 实现虚拟内存技术
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
5.4 页面置换算法
5.4.1 算法
- 最佳置换算法(OPT)
- 先进先出置换算法(FIFO)
- 最近最久未使用置换算法(LRU)
- 时钟置换算法(CLOCK)
- 改进型的时钟置换算法
5.4.2 页面分配策略
**抖动(颠簸) 现象:**页面频繁换入换出的现象。主要原因是分配给进程的物理块不够
**工作集:**在某段时间间隔里,进程实际访问页面的集合,驻留集大小一般不能小于工作集大小
- 局部分配策略
- 全局分配策略
6、文件管理
6.1 磁盘组织与管理
6.1.1 磁盘的结构(磁盘、磁道、扇区、盘面、柱面、磁头)
磁盘的物理地址—>(柱面号,盘面号,扇区号)
6.1.2 磁盘调度算法
一次磁盘读/写操作需要的时间:寻找时间、延迟时间、传输时间
- 先来先服务(FCFS)
- 最短寻找时间优先 (SSTF)
- 扫描算法(SCAN)
- 循环扫描算法(C-SCAN)
减少延迟时间的方法:交替编号、错位命名、磁盘地址结构的设
6.1.3 磁盘的管理
-
磁盘初始化
-
引导块
-
坏块的管理
6.2 文件的基础知识
6.2.1 文件的定义:
一组有意义的信息的集合
6.2.2 文件的逻辑结构
-
无结构文件(流式文件)
-
有结构文件(记录式文件)
- 顺序文件
- 索引文件
- 索引顺序文件
6.2.3 文件的物理结构(文件分配方式)
- 连续结构(分配)
- 链接结构
- 隐式链接
- 显式链接
- 索引结构
6.2.4 文件目录
文件控制块(实现文件目录的关键数据结构)
目录结构:
- 单级目录结构
- 两级目录结构
- 多级目录结构(树形目录结构)
- 无环图目录结构
索引结点(对文件控制块的优化)
6.2.5 文件共享
- 基于索引结点的共享方式(硬链接)
- 基于符号链的共享方式(软链接)
6.2.6 文件保护
- ☐令保护
- 加密保护
- 访问控制
6.3 存储空间
6.3.1 概念
空闲区表
位示图
6.3.2 管理方法
- 空闲表法
- 空闲链表法
- 位示图法
- 成组链接法
6.4 文件基本操作
- 创建文件(create系统调用)
- 删除文件(delete系统调用)
- 读文件(read系统调用)
- 写文件(write系统调用)
- 打开文件(open系统调用)
- 关闭文件(close系统调用)
7 、 I/O管理
7.1 I/O设备基础
7.1.1 概念
将数据 Input/Output(输入/输出)计算机的外部设备
7.1.2 分类
- 按使用特性分类
- 人机交互类外部设备
- 存储设备
- 网络通信设备
- 按传输速率分类
- 低速设备
- 中速设备
- 高速设备
- 按信息交换的单位分类
- 块设备(传输快,可寻址)
- 字符设备(传输慢,不可寻址,常采用中断驱动方式)
7.2 I/O设备控制
7.2.1 I/O控制器的功能
- 接受和识别CPU发出的命令
- 向CPU报告设备的状态
- 数据交换
- 地址识别
7.2.2 I/O控制器的两种寄存器编址方式
- 内存映像
- 寄存器独立编址
7.2.3 I/O设备的方式
- 程序直接控制方式
- 中断驱动方式
- DMA方式
- 通道控制方式
7.2.4 l/O软件层次
- 用户层软件
- 设备独立性软件
六大功能
逻辑设备表—LUT
不同的设备需要不同的驱动程序 - 设备驱动程序
- 中断处理程序
7.3 I/O核心子系统
7.3.1 功能
用户层软件:假脱机技术(SPOOLing技术)
设备独立性软件:I/O调度、设备保护、设备分配与回收、缓冲区管理(即缓冲与高速缓存管理)
7.3.2 假脱机技术(SPOOLing)
- 脱机技术
- 假脱机技术
- 共享打印机
7.3.3 分配与回收(DCT-COCT-CHCT-SDT)
7.3.4 缓冲区管理(单缓冲-双缓冲-循环缓冲-缓冲池)
一般利用内存作为缓冲区
缓解CPU与设备的速度矛盾、减少对CPU的中断频率、解决数据粒度不匹配的问题、提高CPU与I/O设备之间的并行性
- 单缓冲
- 双缓冲
- 循环缓冲
- 缓冲池