操作系统
操作系统
绪论
操作系统的定义与目标★★
-
定义:操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件程序。
-
目标:方便性,有效性(提高系统资源的利用率、提高系统的吞吐量),可扩充性,开放性。
基本特征★★
-
并发性★:是指两个或多个活动在同一给定时间间隔中进行(并行:同时进行)
-
共享性★:是指计算机系统中的资源被多个进程共用
-
不确定性:在多道程序环境下,允许多个进程并发执行,但由于资源等因素的限制,使进程的执行以“停停走走”的方式运行,而且每个进程执行的情况(运行、暂停、速度、完成)也是未知的
-
虚拟性:把一个物理上的实体变为若干个逻辑上的对应物
并发、共享(互为存在条件),虚拟和异步特性前提是具有并发性
主要功能★★
- 处理机管理:进程控制、进程同步、进程通信、死锁处理、处理机调度等
- 存储器管理:内存分配、地址映射、内存保护与共享、内存扩充等
- 文件管理:文件存储空间管理、目录管理、文件读写管理和保护等
- 设备管理:缓冲管理、设备分配、设备处理、虚拟设备等
发展★★
-
手工操作阶段(无操作系统):人机速度矛盾
-
批处理阶段(操作系统开始出现)
- 单道(单进程式)
- 多道(多进程式):提高系统资源利用率(减少cpu空闲)
-
分时操作系统(不可以插队,有了人机交互):不能优先处理紧急事务
-
实时操作系统(可以插队)★★
- 特征:安全性、实时性、高可靠
- 硬实时系统:必须在被控制对象规定时间内完成(火箭发射、抢票)
-
软实时系统:时间松一些(订票)
可靠性:实时操作系统更强
交互性:分时操作系统更强
重要概念
两种指令
- 特权指令:不允许用户程序使用(只允许操作系统使用)如IO指令、置中断指令
- 非特权指令:普通的运算指令
两种程序
- 内核程序:系统的管理者,可执行一切指令、运行在核心态
- 应用程序:普通用户程序只能执行非特权指令,运行在用户态
处理机状态
- 用户态(目态):CPU只能执行非特权指令
- 核心态(管态、特权态、系统态):可以执行所有指令
- 用户态到核心态:通过中断(是硬件完成的)
- 核心态到用户态:特权指令psw的标志位 0用户态 1核心态
原语★★
- 处于操作系统最底层,是最接近硬件的部分
- 程序的运行具有原子性,操作只能一气呵成
- 程序运行时间较短、调用频繁
中断和异常★★
- 内中断(异常、例外、陷入)(信号来自CPU内部)
- 自愿中断----访管指令:程序员使用访管指令向操作系统请求服务★★
- 强迫中断----硬件中断、软件中断
- 外中断(中断)(信号来自CPU外部)★
- 外设请求
- 人工干预
- 外中断的处理过程:
- 每执行完一个指令后,CPU都需要检查当前是否有外部中断 信号;
- 如果检查到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW,程序计数器PC、各种通用寄存器)把他们存储在PCB(进程控制块中);
- 根据中断信号类型转入相应的中断处理程序;
- 恢复原进程的CPU环境并退出中断,返回原进程继续执行。
程序调用
系统给程序员(应用程序)提供的唯一接口,可获得OS服务。
在用户态发生、核心态处理
体系机构
大内核、微内核
进程调度
进程管理
目的★★
- 进程是系统进行**资源分配和调度的基本单位**;
- 进程作为程序独立运行的载体保障程序正常执行;
- 进程的存在使得操作系统资源的利用率大幅提升。
定义
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
结构/组成★★
- 进程控制块(PCB):保存进程运行期间相关的数据,是进程存在的唯一标志
- 程序段:能被进程调度到CPU的代码
- 数据段:一段数据
状态种类★★
- 运行态:进程获得CPU,其程序正在执行。
- 就绪态:其它资源(进程控制块、内存、栈空间、堆空间等)都准备好、只差CPU的状态。
- 阻塞态:进程因某种原因放弃CPU的状态,阻塞进程以队列的形式放置
- 创建状态:创建进程时拥有PCB但其它资源尚未就绪。
- 结束状态:进程结束由系统清理或者归还PCB的状态。
状态变化
线程
- 目的:为了更好的使用多道程序并发执行,提高资源利用率和系统吞吐量
- 特点:是程序执行的最小单位,基本不拥有任何系统资源(调度的基本单位)★★★
进程与线程区别与联系
-
一个进程可以有一个或多个线程;
-
线程包含在进程之中,是进程中实际运行工作的单位;
-
进程的线程共享进程资源;
-
一个进程可以并发多个线程,每个线程执行不同的任务。
处理机调度
概念
是对处理机进行分配,即从就绪队列中按照定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
分类
- 高级调度(作业调度)(次数少):外部存储、辅存-内存
- 中级调度(内存兑换)(次数中等):等待进程调出
- 低级调度(进程调度)(次数多):进程根据优先级调度
调度方式★★
- 剥夺式(抢占式):进程插队(进程进入运行会被强制中断)
- 非剥夺式(非抢占式):进程顺序执行(进程进入运行后不再退出)
调度准则
- CPU利用率
- 系统吞吐量
- 周转时间
- 周转时间=完成时间-提交时间
- 平均周转时间=周转时间/进程数
- 等待时间:运行未完成被中断,等待时间
- 响应时间:提交到运行
进程调度算法★★▲
先来先服务算法:按照在就绪队列中的先后顺序执行。
短进程优先调度算法:优先选择就绪队列中估计运行时间最短的进程,不利于长作业进程的执行。(上一个进程完成前,已经提交等待运行的进程)
高优先权优先调度算法:进程附带优先权,优先选择权重高的进程,可以使得紧迫的任务优先处理。(高响应比=(运行时间+等待时间)/等待时间)
时间片轮转调度算法:按照FIFO的原则排列就绪进程,每次从队列头部取出待执行进程,分配一个时间片执行,是相对公平的调度算法,但是不能保证就是响应用户。(一定是剥夺式)
多级反馈队列调度算法:每一级优先级不同
进程同步
引入原因
协调进程之间地相互制约关系
制约关系★★
- 同步(直接制约关系):多个进程协调工作次序而等待、传递信息所产生的制约关系(同步的)
- 互斥(间接制约关系):只能有一个进程进入临界区,另一个进程必须等待
临界资源
一次仅允许一个进程使用的资源(打印机,共享缓冲区、共享变量、公用队列)
临界区★★
在每个进程中访问临界资源的程序段
临界区互斥★★
-
原则★★
- 空闲让进:如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入
- 忙则等待:任何时候,处于临界区内的进程不可多于一个,其它所有试图进入临界区的进程必须等待。
- 有限等待:进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
- 让权等待:如果进程不能进入自己的临界区,则应**让出CPU,避免进程出现“忙等”**现象。
-
基本方法
信号量----利用PV操作实现互斥
死锁
死锁的四个必要条件★★
- 互斥条件:必须互斥使用资源才会产生死锁;
- 请求保持条件:进程至少保持一个资源,又提出新的资源请求,新资源被占用,请求被阻塞,被阻塞的进程不释放自己保持的资源;
- 不可剥夺条件:进程获得的资源在未完成使用前不能被剥夺(包括OS),只能由进程自身释放;
- 环路等待条件:发生死锁时,必然存在进程-资源环形链,环路等待不一定造成死锁,但是死锁一定有循环等待。
定义
多个进程因竞争资源而造成的一种僵局,如果没有外力,这些进程将无法推进
进程死锁、饥饿、死循环的区别
死锁:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。永远在互相等待的进程称为死锁进程。
饥饿:由于长期得不到资源导致进程无法推进;
死循环:代码逻辑BUG。
死锁的产生:竞争资源(共享资源数量不满足各进程需求)、进程调度顺序不当。
解决方法★★
- 预防:源头掐死
- 破坏互斥条件:将临界资源改造成共享资源(Spooling池化技术);(可行性不高,很多时候无法破坏互斥条件)
- 破坏请求保持条件:系统规定进程运行之前,一次性申请所有需要的资源;(资源利用率低,可能导致别的线程饥饿)
- 破坏不可剥夺条件:当一个进程请求新的资源得不到满足时,必须释放占有的资源;(实现复杂,剥夺资源可能导致部分工作失效,反复申请和释放造成额外的系统开销)
- 破坏环路等待条件:可用资源线性排序,申请必须按照需要递增申请;(进程实际使用资源顺序和编号顺序不同,会导致资源浪费)
- 避免:避免
- 安全序列算法:虽然保守,但可以保证系统时时处于安全状态。
- 银行家算法:检查当前资源剩余是否可以满足某个进程的最大需求;如果可以,就把该进程加入安全序列,等待进程允许完成,回收所有资源;重复1,2,直到当前没有线程等待资源;
- 检测:利用死锁原理
- 解除:解除★
- 资源剥夺法:去除资源
- 撤销进程法:终止进程
- 进程退回法:进程状态回退
存储管理
引入目的
存储管理为了确保计算机有足够的内存处理数据;确保程序可以从可用内存中获取一部分内存使用;确保程序可以归还使用后的内存以供其他程序使用。
主要功能
- 内存空间的分配和回收
- 存储的保护和共享:互不干扰
- 地址转换
- 逻辑地址
- 物理地址
- 内存扩充
- 利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存
用户程序的主要处理阶段★★
- 编辑阶段:创建源文件
- 编译阶段:由编译程序将用户源代码编译成若干目标模块,生成目标文件
- 链接阶段:由链接程序将编译后形成的一组目标模块及所需库函数链接在一起,形成一个完整的装入模块。生成可执行文件(生成逻辑地址)
- 装入阶段:由装入程序装入模块运行(动态重定位)
- 运行阶段:得到结果(运行时重定位)
相关概念★★
- 程序的装入
- 绝对装入(逻辑地址必须和实际的内存地址完全一样)
- 静态重定位(在编译时进行)
- 动态重定位★(在装载时进行)
- 程序的链接
- 静态链接
- 装入时链接
- 运行时链接
- 地址空间
- 逻辑地址空间(地址空间从0开始)
- 物理地址空间(内存中物理单元的集合)
管理方式★★▲
- 连续分配管理方式
- 单一连续分配:分配到内存固定的区域(有内部碎片)
- 固定分区分配:分配到内存不同的固定区域,分区可以相等、可以不等(内部碎片)
- 动态分区分配
- 可变分区存储管理:按照程序的需要进行动态的划分
- 动态分区的分配策略算法★★
- 首次适应(最好):空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区(顺序查找满足条件的分区)(增大查找开销)。
- 最佳适应:空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区(容量最小且满足条件)(外部碎片过多)。
- 最坏适应:空闲分区按容量递减的次序链接。找到第一个能满足要求的空闲分区(容量最大且满足条件)(对大进程不利)。
- 邻近适应:由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找(即使该分区剩余位置足够,也寻找下一分区)。
- **非连续分配管理方式(离散式)**★★
- 页式存储管理:将进程逻辑空间等分成若干大小的页面,相应的把物理内存空间分成与页面大小的物理块,以页面为单位把进程空间装进物理内存中分散的物理块。
- 段式存储管理:将进程逻辑空间分成若干段(不等分),段的长度由连续逻辑的长度决定。
- 段页式存储管理:现将逻辑空间按照段式管理分成若干段,再将内存空间按照页式管理分成若干页,分页可以有效提高内存利用率,分段可以更好的满足用户需求。
页式和者段式存储管理对比
- 段式存储和页式存储都离散地管理了进程的逻辑空间;
- 页是物理单位,段是逻辑单位;
- 分页是为了合理利用空间,分段是满足用户要求页大小由硬件固定,段长度可动态变化;
- 页表信息是一维的,段表信息是二维的;
内存扩充★★▲
- 覆盖(同一程序或进程中)
- 交换(不同进程/作业之间进行)
- 虚拟内存
- 引入原因:在逻辑上扩充内存
- 虚拟内存的特征:
- 多次性:无需再作业运行时一次性全部装入内存,而是允许被分成多次调入内存;
- 对换性:无需在作业运行时一直常驻内存,而是允许在作业运行过程中,将作业换入、换出;
- 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存用来,远大于实际的容量;
- 组成部分
- 页表机制
- 中断机制
- 地址变换机制
- 内存与外存
- 页面置换(淘汰)算法★★
- 先进先出(FIFO)(最早进入的淘汰)
- 最近最久未使用(LRU)(注意重新计数位置★★)
- 最近最少使用(LFU)(使用次数最少的淘汰,次数一样多使用FIFO或LRU)
- 最优(最佳)(OPT)(未来最久不使用的淘汰)
- 置换:内存与外存发生数据置换(外存进入内存、内存存储位置互换)
- 缺页中断次数:不重复进程数(进入内存)+发生置换的次数(发生置换)
- 缺页率:缺页中断次数/总页数的百分比
- 页面淘汰是由缺页中断引起的,但缺页中断不见得一定引起页面淘汰
- 抖动
- 页面频繁的换进换出
- 原因:分配给进程的进程块不足
- 页面分配的策略
- 固定分区局部置换(物理块不变)
- 可变分配全局置换(动态增加物理块)
- 可变分配全局置换(只允许从该进程的内存页面中挑选一页)
文件系统
文件、文件系统
概念
- 文件:是以计算机硬盘为载体的存储在计算机上的信息集合
- 文件系统:是操作系统中负责操纵和管理文件的一整套设施,实现文件的共享和保护,方便用户**“按名存取“(基本目标)**,提高文件的存取速度(最重要目标)。
功能
- 文件管理、目录管理、文件空间管理、文件共享和保护、提供方便的接口
文件的逻辑结构★★▲
- 无结构文件(即流式文件)(二进制文件、链接库)
- 有结构文件(记录式文件)(文本文件,文档,媒体文件)
- 顺序文件(磁带上的文件)
- 索引文件(索引表:其中的地址登记项用来指出文件在外存上的位置信息)
- 索引顺序文件
目录和目录结构
- 文件控制块:在文件系统内部给每一个文件唯一地设置一个文件控制块,用于描述和控制文件地数据结构,与文件一一对应(类似进程的PID)
- 目录结构
- 单机目录结构(不允许重名)
- 二级目录结构(解决了重名问题)
- 主文件目录
- 用户文件目录
- 树形目录(优:方便,缺:不便分享)
- 绝对路径(从根目录出发)
- 相对路径(从当前目录出发)
- 图形目录(实现了共享)
文件实现(辅存的存储空间分配)
- 文件(辅存)分配方式
- 连续分配(有外部碎片,可以直接访问)
- 链接分配(建立链接,不是直接访问,数据易丢失)
- 索引分配(加入FAT表,可直接访问)
- 文件(辅存)存储空间管理
- 空闲表法
- 空闲链表法
- 位示图法
磁盘管理★★▲
-
磁盘地址结构
-
磁盘调度算法
- 先到先服务算法(FCFS)(按顺序)
- **最短查找时间优先算法(SSTF)(找最近的)**会出现饥饿现象
- SCAN(电梯调度算法)(来回方向)(从小到大,掉头,从大到小)
- SCCN(循环扫描算法)(单方向)(从小到大,不掉头,回到最小,从小到大)
设备管理
设备管理的目标
使用方便、与设备无关(虚拟)、效率高、管理统一
I/O设备
- 分类
- 按照使用特性分类:存储设备(内存、磁盘、U盘)和交互IO设备(键盘、显示器、鼠标);
- 按照信息交换分类:块设备(磁盘、SD卡)和字符设备(打印机、shell终端);
- 按照设备共享属性分类:独占设备,共享设备,虚拟设备;
- 按照传输速率分类:低速设备,高速设备;
- I/O控制方式
- 程序直接控制方式(查询方式):(字节)cpu不断地取查询设备控制器是否将数据放到了数据存储器中,或者从数据存储器存到设备中,当完成IO时cpu才能去干别的事(CPU利用率低)
- 中断方式:(字节)cpu发出指令(分配任务)(并行),当设备控制器把数据存在数据存储器后,向cpu发出中断请求,然后cpu再来处理这部分数据**(寄存器有限)(CPU利用率低)**
- DMA方式:(数据块)DMA控制器直接将设备中地数据以数据块为单位直接传输到内存中,当传输结束后才向CPU发起中断(CPU介入频率降低)(介于IO设备和主存之间,不经过CPU)(不能传输离散数据块)
- IO通道控制方式:**(硬件)(与CPU共享内存)(可以传输离散数据块)(不经过CPU)**CPU对IO通道发出指令,IO通道自己工作,等数据传输玩才向CPU发起中断。
引入缓冲的目的和缓冲区的设置方式
- 引入缓冲的目的
- 缓和CPU与外设间速度不匹配的矛盾
- 提高CPU与外设之间的并行性
- 减少对CPU的中断次数
- 磁盘的高速缓存(磁盘中分出部分区域或由空闲空间)
- 缓冲区的设置方式
- 单缓冲:当数据达到率和离去率相差很大时,可采用单缓冲方式。
- 双缓冲:当信息输入和输出率相同(或相差不大)时,可利用双缓冲区,实现两者的并行。
- 多缓冲:对于阵发性的输入、输出,为了解决熟读不匹配问题,可以设立多个缓冲区。
常用设备分配技术
- 根据设备的使用性质
- 独占设备:不能共享的设备(打印机)。
- 共享设备:可由若干个进程同时共享的而设备(磁盘机)。
- 虚拟设备:利用某种技术把独占设备改造成可由多个进程共享的设备。
- 对三种设备采用三种分配技术
- 独占分配技术:固定分配给一个进程,直至该进程IO操作完成并释放。
- 共享分配技术:多进程共享一台设备,每个进程只用其中一部分。适用于高速、大容量的直接存储设备。
- 虚拟分配技术:SPOOLing技术(假脱机操作)。虚拟设备技术,把同步调用低速设备改为异步调用,在输入、输出之间增加了排队转储环节(输入井、输出井),SPoOLing负责输入(出)井与低速设备之间的调度,逻辑上,进程直接与高速设备交互,减少了进程的等待时间。
实现支持异步任务的线程池
线程池
- 线程池是存放多个线程的容器,CPU调度线程执行后不会销毁线程,将线程放回线程池重新利用。
使用线程池的原因
- 线程是稀缺资源 ,不应该频繁创建和销毁;
- 架构解耦,业务创建和业务处理解耦,更加优雅;
- 线程池是使用线程的最佳实践。
实现线程安全的队列Queue
- 队列:用于存放多个元素,是存放各种元素的“池”。
- 实现的基本功能:获取当前队列元素数量,往队列放入元素,往队列取出元素。
- 注意:队列可能有多个线程同时操作,因此需要保证线程安全,如下两种情况:
实现基本任务对象Task
- 实现的基本功能:任务参数,任务唯一标记(UUID),任务具体的执行逻辑
实现任务处理线程ProcessThread
- 任务处理线程需要不断地从任务队列里取任务执行,任务处理线程需要有一个标记,标记线程什么时候应该停止。
- 实现的基本功能:基本属性(任务队列、标记),线程执行的逻辑(run),线程停止(stop)。
实现任务处理线程池Pool
- 存放多个任务处理线程,负责多个线程的启停,管理向线程池的提交任务,下发给线程去执行。
- 实现的基本过程:基本属性,提交任务(put,batch_put),线程启停(start,join),线程池大小(size)。
实现异步任务处理AsyncTask
- 给任务添加一个标记,任务完成后,则标记为完成;任务完成时可直接获取任务运行结果;任务未完成时,获取任务结果,会阻塞获取线程。
- 主要实现的两个函数:设置运行结果(set_result),获取运行结果(get_result)
算法
进程调度算法
- 先来先服务算法
- 短进程优先调度算法
- 高优先权优先调度算法
- 时间片轮转调度算法
- 多级反馈队列调度算法
死锁解决算法
- 银行家算法,安全序列
页面置换(淘汰)算法
https://www.bilibili.com/video/BV1xt4y1173x/
缺页率计算
- 先进先出(FIFO)(最早进入的淘汰)
- 最近最久未使用(LRU)(注意重新计数位置★★)
- 最近最少使用(LFU)(使用次数最少的淘汰,次数一样多使用FIFO或LRU)
- 最优(最佳)(OPT)(未来最久不使用的淘汰)
磁盘调度算法
- 先到先服务算法(FCFS)
- 最短查找时间优先算法(SSTF)
- 电梯调度算法(SCAN)
- 循环扫描算法(SCCN)
分页分段式内存分配
https://www.bilibili.com/video/BV1VK411o7Kc/
- 分页式
- 逻辑地址=页号*页面大小+页内位置
- 物理地址=(块号)*块大小+位移量
- 页号和(块号)一一映射,页面大小=块大小,页内位置=位移量
- 分段式
- ①判断:比较段长和段内地址,是否会发生越界中段
- ②计算:物理地址=基址+段内地址
动态分区分配算法
https://www.bilibili.com/video/BV1uY411d7xH/
- 首次适应
- 最佳适应
- 最坏适应
- 邻近适应
临界区同步与互斥
算
- 先进先出(FIFO)(最早进入的淘汰)
- 最近最久未使用(LRU)(注意重新计数位置★★)
- 最近最少使用(LFU)(使用次数最少的淘汰,次数一样多使用FIFO或LRU)
- 最优(最佳)(OPT)(未来最久不使用的淘汰)
磁盘调度算法
- 先到先服务算法(FCFS)
- 最短查找时间优先算法(SSTF)
- 电梯调度算法(SCAN)
- 循环扫描算法(SCCN)
分页分段式内存分配
https://www.bilibili.com/video/BV1VK411o7Kc/
- 分页式
- 逻辑地址=页号*页面大小+页内位置
- 物理地址=(块号)*块大小+位移量
- 页号和(块号)一一映射,页面大小=块大小,页内位置=位移量
- 分段式
- ①判断:比较段长和段内地址,是否会发生越界中段
- ②计算:物理地址=基址+段内地址
动态分区分配算法
https://www.bilibili.com/video/BV1uY411d7xH/
- 首次适应
- 最佳适应
- 最坏适应
- 邻近适应
临界区同步与互斥
- 信号量----利用PV操作实现互斥