一、计算机系统概述
1.1 操作系统的基本概念
-
操作系统的基本特征
- 并发(Concurrence)
- 共享(sharing)
- 互斥共享方式
- 同时访问方式
- 虚拟(virtual)
- 异步(Asynchonism)
注:并发是共享的前提,共享反作用于并发
-
操作系统管理的计算机系统资源
- 处理机(central processing unit,实际上是对进程的管理)
- 存储器
- 文件
- 键盘等设备
-
操作系统作为用户与计算机硬件系统之间的接口
- 命令接口
- 交互式命令接口:一问一答
- 批处理命令接口:先说好命令
- 程序接口:由一组系统调用组成(api)
- 命令接口
1.2 操作系统的发展与分类
-
手工操作阶段
缺点:cpu等待手工操作
-
批处理阶段
-
单道批处理阶段
缺点:高速cpu等待低速io却无法切换作业
-
多道批处理阶段:允许多道程序在cpu中交替执行
缺点:无法交互
-
-
分时操作系统
缺点:无法保证任务的实时性
-
实时操作系统
- 硬实时
- 软实时:有弹性
-
网络操作系统与分布式操作系统
-
个人计算机操作系统
1.3 操作系统内核的运行环境
1.3.1 操作系统内核
- 时钟管理
- 中断机制
- 原语:通过暂时屏蔽中断实现
- 系统控制的数据结构及处理
- 数据结构
- 作业控制块
- 进程控制块
- …
- 操作
- 进程管理
- 存储器管理
- 设备管理
- 数据结构
注:用户程序通过系统调用中的访管指令产生中断,进而陷入内核态
1.3.2 中断和异常的概念
- 中断
- 内中断
- 自愿中断
- 强迫中断
- 外中断
- 内中断
1.3.3 系统调用
注:系统调用与访管指令的区别,系统调用中往往包含了一条访管指令
二、进程管理
2.1 进程与线程
2.1.1 进程的概念和特征
2.1.2 进程的状态与转换
- 进程的状态与转换
- 运行态
- 就绪态
- 阻塞态
- 创建态
- 结束态
2.1.3 进程控制
- 进程的创建
- 进程的终止
- 进程的阻塞和唤醒
- 进程切换
2.1.4 进程的组织
- 进程控制块(pcb)
- 程序段
- 数据段
2.1.5 进程的通信
- 共享存储
- 基于数据结构的共享
- 基于存储区的共享
- 消息传递
- 直接通信方式
- 间接通信方式
- 管道通信:对共享存储的优化(在一定程度上避免了阻塞)
2.1.6 线程的概念和多线程模型
- 线程
- 多线程模型
- 多(用户级线程)对一(内核级线程)模型
- 一对一模型
- 多对多模型
2.2 处理机调度
2.2.1 调度的概念
- 调度的层次
- 作业调度(长程调度)
- 中级调度(中程调度)
- 进程调度(短程调度)
2.2.2 调度的时机、切换与过程
- 调度方式(有优先级更高的进程进入等待队列时)
- 非剥夺调度方式
- 剥夺调度方式
2.2.4 调度的基本准则
- CPU利用率
- 系统吞吐量
- 周转时间
- 等待时间
- 响应时间
2.2.5 典型的调度算法
- 先来先服务(FCFS)调度算法
- 短作业优先(SJF)调度算法
- 优先级调度算法
- 高响应比优先调度算法
- 时间片轮转调度算法
- 多级反馈队列调度算法
2.3 进程同步
2.3.1 进程同步的基本概念
-
临界资源
- 临界资源的访问过程4部分
- 进入区
- 临界区
- 退出区
- 剩余区:代码中的其它部分
- 临界资源的访问过程4部分
-
同步
-
互斥
-
临界区要求
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待:避免忙等待
记忆:空闲让进 -> 忙则等待 -> 有限等待,让权等待
2.3.2 实现临界区互斥的基本方法
-
软件实现方法
-
单标志法
特点:turn表示现在允许turn号进程进入
缺点:违背空闲让进(具体指无法再次进入,必须轮换进入)
-
双标志法先检查
特点:通过数组标识资源,i进程想要进入时通过查看flag[j]先看看j进程有没有进入,没有则flag[i]=true
缺点:违背忙则等待
-
双标志法后检查
特点:通过数组标识资源,i进程想要进入时先置flag[i]=true,然后通过查看flag[j]先看看j进程有没有进入
缺点:违背空闲让进(具体指由于谦让导致饥饿)
-
Peterson算法
特点:是单标志法(解决双标志后检查法导致的饥饿)与双标志后检查法(解决互斥访问)的结合,i进程先置flag[i]=true(想要进入),然后置turn=j(j进程可以进入),判断while(turn==j&flag[j])
-
-
软件实现方法
- 中断屏蔽方法
- 硬件指令方法:以硬件的形式实现上述的软件逻辑
注:如何查看一个程序是否会导致死锁等问题:调整一下程序运行的顺序
2.3.3 信号量(实现进程同步互斥的基本方法)
出现原因:以上相关内容仅仅是临界区资源互斥的基本方法,将这种方法扩充到进程的互斥与同步问题,就是信号量
-
整型信号量
实现:一个整型表示资源数目量
缺点:违背让权等待
-
记录型信号量
实现:一个整型表示资源数目量,以及一个队列记录待请求的进程,在有相关资源时将他们唤醒
-
利用信号量实现同步
原理:一个信号量,一对p/v操作
-
利用信号量实现进程互斥访问
原理:一个信号量,两对p/v操作
-
利用信号量实现前驱关系
实现:使用多个不同的信号量
2.3.4 管程
本质:资源管理程序,是一种对信号量的封装
- 管程的组成
- 管程的名称
- 共享数据结构
- 操作(func)
- 共享数据结构的初始化语句
- 条件变量
2.3.5 经典同步问题
-
生产者-消费者问题
特点:使用mutex+empty和full信号量(可以认为是管程中的条件变量)
-
读者-写者问题
特点:使用count记录读者个数
-
哲学家进餐问题
特点:同种资源的多个请求
-
吸烟者问题
特点:对于不同资源的请求
2.4 死锁
2.4.1 死锁的概念
- 死锁的定义:由于系统中存在一些互斥且不可剥夺的资源,当进程在保持自身的资源的同时请求对方的资源,从而构成循环等待的队列,导致的进程无法推进的状况.(可以根据死锁产生的原因记忆)
- 死锁产生的原因:
- 互斥访问
- 不可剥夺
- 请求保持
- 循环等待
2.4.2 死锁的处理策略
- 死锁预防:破坏4个条件
- 避免死锁:银行家算法与安全状态
- 死锁的检测和解除:资源请求图+解除
2.4.3 死锁预防
- 破坏互斥条件:不太可行
- 破坏不可剥夺条件:仅可用于状态易于保存和恢复的资源
- 破坏请求并保持条件:预先分配
- 破坏循环等待条件:设定资源分配顺序
2.4.4 死锁避免
-
系统安全状态:
注:并非所有不安全状态都是死锁状态(因为系统的资源状态是在不断变化的,可能在真正造成死锁之前出现了新的变化,如被强制结束)
-
银行家算法
- 流程
- 资源数是否超过max
- 资源数是否超过avaliable
- 执行银行家算法
- 判定是否满足安全序列
- 流程
2.4.5 死锁检测与解除
- 资源分配图
- 死锁的解除
- 资源剥夺法:仅剥夺资源
- 撤销进程:直接剥夺进程
- 进程回退法:使进程回退到足以回避死锁的底部
注:阻塞是进程5态中的重要一态
3、内存管理
3.1 内存管理概念
3.1.1 内存管理的基本原理和要求
-
内存管理的功能
- 内存空间的分配与回收
- 地址转换
- 内存空间的扩充
- 存储保护
-
程序装入和邻接:在进行具体的内存管理之前,需要了解进程运行的基本原理和要求
- 编译
- 链接
- 静态链接:程序运行前链接
- 装入时动态链接:装入内存时链接
- 运行时动态链接:程序执行时链接(便于后期修改和更新)
- 装入:通过装入程序将装入模块装入内存运行
- 绝对装入:由编译程序产生绝对地址的目标代码
- 可重定位装入(静态重定位):地址变换在装入内存时一次完成
- 动态运行时装入(动态重定位):地址变换在程序执行时
-
逻辑地址空间与物理地址空间
- 逻辑地址
- 物理地址
-
内存保护
目标:操作系统不受用户进程的影响,同时用户进程不受用户进程的影响
两种方法:
- 在cpu中设置一对上,下限寄存器,存放用户作业在主存中的上下限
- 重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)
- 重定位寄存器:用于“加”
- 界地址寄存器:用于"比较"
3.1.2 覆盖与交换
- 覆盖:用于同一个程序或进程(当内存不够时,可以将同一个程序的原页面覆盖,以运行程序的其它内容)
- 交换用于不同进程(或作业)之间的上下文切换
3.1.3 连续分配管理方式
连续分配方式:为一个用户程序分配一个连续的内存空间
-
单一连续分配
-
固定分区分配
-
分区大小相等
-
分区大小不等
内部碎片:分区内部的空间浪费
-
-
动态分区分配
注:虽然是连续分配,但是没有提前规划好分区大小
外部碎片:分区外部的碎片
动态分区的分配算法
注:是内存分配管理方式中的内容
-
首次适应算法
-
最佳适应算法
-
最坏适应算法
-
邻近适应算法(LRU)
-
3.1.4 非连续分配管理方法
-
基本分页式存储管理方式
实现:硬件
发展:
- 普通
- 带快表
- 带二级页表
逻辑地址结构:页号+偏移
表项结构:页号+页始址
-
基本分段存储管理方式
实现:编译器
逻辑地址结构:段号+偏移
表项结构:段号+段长+段始址
-
段页式管理方式
3.2 虚拟内存管理
3.2.1 虚拟内存的基本概念
实现:需要建立在离散分配的内存管理方式上(3.1中的非连续分配管理方法)
3.2.2 请求分页管理方式
- 页表机制:在基本分页式存储器管理方式上进行扩充
3.2.3 页面置换算法
注:是虚拟内存部分的内容
- 最佳(opt)置换算法
- 先进先出(FIFO)置换算法
- 始终(clock)置换算法
3.2.4 页面分配策略
-
驻留集大小
物理块分配策略
- 固定分配局部置换:固定大小,在内部分配
- 可变分配全局置换:可变分配,全局可变的置换
- 可变分配局部置换可变分配,一般情况下在局部置换(当且仅当有频繁地换页时,才会以全局的方式增加物理页数,而且之后还需要返还)
-
调入页面的时机
- 预调页策略:适合运行前
- 请求调页策略:适合运行时
-
从何处调页
外存:文件去,对换区
- 系统有足够空间:都从对换区(新,旧页对换)
- 系统缺少足够的对换空间:修改的放入对换区
- unix:开始都放在文件区,调页后才放入对换区
3.2.5 抖动
- 抖动(问题)
- 工作集(解决方案)
4、文件系统管理
4.1 文件系统管理
4.1.1 文件系统基础
-
文件的定义
结构:(数据项构成记录,记录构成文件)
- 数据项
- 记录
- 文件
-
文件属性
-
文件属性
- 名称
- 标识符(id)
- 类型
- 位置
- 大小
- 保护
- 时间,日期和用户标识
以上并非文件内容的一部分,都保存在外存的目录结构中
-
目录结构
目录条目
- 文件名
- 标识符:通过该标识符可以定位其他属性的信息(存在FCB或inode中)
-
-
文件的基本操作
- 创建
- 写
- 读
- 重定位
- 删除
- 截断(类似reset)
-
文件的打开和关闭
- 初次打开:读取到内存,返回文件指针
- 其它进程的重复打开:添加count计数
- 读操作结束:若count为0,关闭文件
- 写操作结束:写完之后,还需要将文件写回到外存
4.1.2 文件的逻辑结构
逻辑结构:从用户观点出发看到的文件的组织形式
物理结构:从实现观点出发看到的文件在外存的存储组织形式
逻辑结构:
-
无结构文件(流式文件)
-
有结构文件(记录式文件)
-
顺序文件:记录
特点:定长文件
-
索引文件(不定长文件):构建索引表
特点:不定长文件
-
索引顺序文件:将记录分组,为每组第一项构建索引
形式如下:
- a
- a2
- a1
- b
- b1
- b0
- c
- c1
- c2
- …
- a
-
直接文件或散列文件:通过给定记录的键值或Hash
-
4.1.3 目录结构
-
文件控制块和索引节点
-
文件控制块:一种特殊的文件
内容:
- 基本信息
- 存取控制信息
- 使用信息
-
索引节点
出现原因:当我们通过文件名查找文件时,实际上是将文件名和FCB中的文件名信息比较.但是在查找时,FCB包含了存取控制信息等无关信息,这样增大了系统的开销.我们希望能直接将所要查找的文件名和FCB中的文件名比较,然后同一个指针关联所需要的信息.基于这样的思想,这就出现了索引节点.
使用:Unix操作系统
结构:
- 文件名
- 索引节点编号
磁盘索引节点:存放在磁盘上的索引结点
内存索引结点:将磁盘索引节点复制过来,同时添加了一些内容
-
-
目录结构
- 单级目录结构
- 两级目录结构
- 多级目录结构
- 无环图目录结构:通过增加一些指向同一节点的有向边,用于文件共享
4.1.4 文件共享
-
基于索引节点的共享方式(硬连接)
本质:增加了一个指向索引节点的指针
-
利用符号链实现文件共享
本质:通过文件记录共享文件的路径
注:两种方式都是以自己的路径名访问文件
4.1.5 文件保护
- 访问类型
- 访问控制
- 创建访问控制列表(Access Control List)
- 口令保护:在访问时需要提供口令
- 加密保护:将文件内容加密,需要密匙解码
4.2 文件系统实现
4.2.1 文件系统层次结构
- 用户调用接口:用户文件名发起请求
- 文件目录系统:将文件名一一匹配,获得对应得fcb或node索引节点
- 存取控制验证模块:验证访问权限
- 逻辑文件系统与文件信息缓冲区:根据文件的逻辑结构将用户要求读写的逻辑结构转换成文件逻辑结构内的相应块号(获得文件的逻辑地址块号)
- 物理文件系统:将相对块号转换成实际的物理地址
- 辅助分配模块:回收和分配物理空间
- 设备管理程序模块:处理文件的i/o请求
4.2.2 目录实现
与文件的查找方式息息相关(逻辑结构)
- 线性列表
- 哈希表
4.2.3 文件实现
这里主要是讨论文件的物理结构,即在磁盘上的实现
-
文件分配方式(对于磁盘非空闲块的管理)
-
连续分配:存在外部碎片
-
链接分配
-
隐式链接:只要有一个链接损坏则无法访问
-
显式链接
使用FAT(file allocation table):文件分配表
-
-
索引分配:与显式链接机制类似,可以认为是改进
每个文件都有一个索引块,如果索引块太小,无法支持大文件:
- 链接
- 多层索引
- 混合索引
-
-
文件存储空间管理(对磁盘空闲块的管理)
- 文件存储空间的划分和初始化
- 目录区
- 文件区
- 文件存储空间管理
- 空闲表法
- 空闲链接法
- 位示图法
- 成组链接法:空闲表法与成组链接法的结合,将相邻的空闲扇区归为一组(在ufs中将前15个链接地址放在inode中),然后链接起来
- 文件存储空间的划分和初始化
4.3 磁盘组织与管理
4.3.1 磁盘的结构
- 磁道:磁道的宽度与磁头相对应
- 扇区(盘块)
- 盘片
- 磁盘组
- 柱面
注:多个扇区组成的块是文件存取的最小单位
4.3.2 磁盘调度算法
读写操作花费的时间:寻道时间,延迟时间(磁头定位到扇区)和传输时间
- 先来先服务(FCFS)
- 最短寻道时间优先(STSF,shortest seek time first)
- 扫描算法(scan):双向到底循环
- 循环扫描(scan):单向到底循环
- Look
- C-Look
注:对于寻道时间的优化,一般是将数据存储在同一个柱面上的不同盘面更好
4.3.3 磁盘的管理
- 磁盘的初始化
- 磁盘分扇区以便磁盘控制器能进行读写
- 头(扇区属性)
- 数据区域
- 尾(属性)
- 操作系统将自己的数据结构记录在磁盘上
- 将磁盘分为由一个或多个柱面组成的分区(C盘,D盘等)
- 将物理分区进行逻辑格式化(创建文件系统)
- 磁盘分扇区以便磁盘控制器能进行读写
- 引导块:少部分存放在ROM上,大部分存放在磁盘上,对应的磁盘称为启动磁盘或系统磁盘
- 坏块:使系统尽量不去使用,因为这是硬件层面的错误,操作系统无法修复
补充:
磁盘结构:
-
引导控制块(Boot Control Block)
别名:
- ufs中:引导块(Boot Block)
- NTFS中:分区引导扇区(Partition Boot Sector)
-
分区控制块(Partition Controller Block)
- UFS中:超级块(Super Block)
- NTFS:主控文件(Master File Table)
5、输入/输出(I/o)管理
5.1 I/O管理概述
5.1.1 I/O设备
分类的各种依据
- 效率(由小到大)
- 人机交互类外部设备
- 网络通信设备
- 存储设备
- 传输速率
5.1.2 I/O控制方式
外围设备和内存之间的输入/输出控制方:
-
程序直接控制
-
中断驱动方式
特点:数据的交换需要cpu
-
DMA方式:cpu
特点:单个块的数据换不需要cpu
-
通道控制方式
特点:一组数据块的操作不需要cpu
5.1.3 I/O子系统的层次结构
- 用户层I/o软件:实现与用户交互的接口(read,write等…)
- 设备独立性软件:设备独立性软件
- 执行所有设备的公有操作
- 向用户层(或文件层)提供统一接口
- 设备驱动程序:与硬件相关的,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序
- 中断处理程序:如请求完成后,中断正在运行的程序
- 硬件设备
5.2 I/O核心子系统(还需要过一遍视频)
5.2.1 I/O 子系统概述
5.2.2 I/O 调度概念
5.2.3 高速缓存与缓冲区
- 磁盘高速缓存
- 缓冲区
- 单缓冲
- 双缓冲
- 循环缓冲
- 缓冲池