[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-saOJtCs0-1677480684212)(…/images/image-20220526165354046.png)]
操作系统 是指 控制和管理整个计算机系统的硬件与软件资源,合理地组织、调度计算机的工作与资源的分配,进而为用户和其他软件提供方便接口与环境的程序集合。操作系统是计算机系统中最基本的系统软件
计算机系统自下而上分为4部分:硬件、操作系统、应用程序、用户 (划分与计算机组成原理不同)
操作系统的特征 (并发、共享、虚拟、异步)
并发(Concurrence)
并发:同一时间间隔
9:00到9:30 吃饭,9:30到10:00 学习,则在 9:00到10:00这段间隔里面,吃饭与学习并发
共享(Sharing)(互斥共享方式 与 同时访问方式)
指系统中的资源,可供内存中多个 **并发执行 **的进程共同使用
互斥共享方式
仅当进程访问完并释放该资源后,才允许另一个进程对该资源进行访问。
一段时间内,只允许一个进程访问的资源,称为 临界资源 或 独占资源。计算机系统中的大多数物理设备 及某些软件中所用的 栈、变量和表格,都属于 临界资源。
同时访问方式
允许在一段时间内由多个进程**“同时”访问**,“同时”是宏观概念,微观上,这些进程是 交替地对该资源进行访问,即“分时共享”。典型资源是 磁盘设备。
互斥共享 要求一种资源在一段时间内(哪怕是一段很小的时间)只能满足一个请求,否则就会出现严重问题。而 同时访问共享 通常要求一个请求分几个时间片段间隔地完成,其效果与连续完成的效果相同。
并发 和 共享 是操作系统两个最基本的特征,两者之间互为存在的条件
虚拟(Virtual)
把一个物理上的实体,变为若干逻辑上的对应物。实现虚拟的技术,称为 虚拟技术,虚拟技术可归纳为 时分复用技术 (处理器的分时共享) 和 空分复用技术 (虚拟存储器)
通过多道程序设计技术,让多道程序并发执行,来分时使用一个处理器
将一台机器的物理存储器变为虚拟存储器,以便从逻辑上扩充存储器的容量
将一台物理I/O设备虚拟为多台逻辑上的I/O设备
异步(Asynchronism)
多道程序环境允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停,它以不可预知的速度向前推进
操作系统作为计算机系统资源的管理者
处理器管理
存储器管理
包括 内存分配与回收、地址映射、内存保护与共享、内存扩充 等功能
文件管理
包括 文件存储空间的管理、目录管理、文件读写管理和保护
设备管理
主要任务是 完成用户的I/O请求,方便用户使用各种设备,提高设备的利用率, 包括 缓冲管理、设备分配、设备处理、虚拟设备 等功能
操作系统作为用户与计算机硬件系统之间的接口(命令接口、程序接口)
CPU通常执行两种不同性质的程序
操作系统内核程序
用户自编程序
(即系统外层的应用程序,或简称应用程序)操作系统内核程序是用户自编程序的管理者,因此内核程序要执行一些特权指令,而用户自编程序出于安全考虑不能执行这些指令。
特权指令
:计算机中不允许用户直接使用的指令,如I/O指令、置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等的指令。具体实现上,将CPU的状态划分为用户态(目态)和核心态(管态、内核态)。用户自编程序运行在用户态,操作系统内核程序运行在核心态。
一些与硬件关联较紧密的模块,如时钟管理、中断处理、设备驱动等处于最低层。其次是运行频率较高的程序,如进程管理、存储器管理和设备管理等。这两部分内容构成了操作系统的内核。这部分内容的指令操作工作在核心态。
内核是计算机上配置的底层软件,是计算机功能的延伸,内核包含以下4方面内容
时钟管理
中断机制
原语
系统控制的数据结构及处理
系统中用来登记状态信息的数据结构很多,如作业控制块、进程控制块(PCB)、设备控制块、各类链表、消息队列、缓冲区、空闲区登记表、内存分配表
为了实现有效的管理,系统需要一些基本的操作,常见的如下3种
进程管理
进程状态管理、进程调度和分派、创建与撤销进程控制块等。
存储器管理
存储器的空间分配和回收、内存信息保护程序、代码对换程序等。
设备管理
缓冲区管理、设备分配和回收等
中断和异常的概念
系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此,需要在核心态建立一些“门”,以便实现从用户态进入核心态。在实际操作系统中,CPU运行上层程序时唯一能进入这些“门”的途径就是通过中断或异常。
发生中断或异常时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的。
操作系统的发展过程大体上就是一个想方设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某种资源时,把它对那种资源的占有权释放,而这一行为就需要通过中断实现。
中断(Interruption)也称外中断,指来自CPU执行指令以外的事件的发生
异常(Exception)也称内中断、例外、或陷入(trap),指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、虚存系统的缺页及专门的陷入指令等引起的事件。对异常的处理一般要依赖于当前程序的运行现场,而且异常不能被屏蔽,一旦出现应立即处理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHIfNZ0z-1677480684213)(…/images/image-20220602171428645.png)]
中断处理的过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xFc0Kbgw-1677480684213)(…/images/image-20220602171757667.png)]
关中断
CPU响应中断后,首先要保护程序的现场状态,在保护现场的过程中,CPU不应响应更高级中断源的中断请求。否则,若现场保存不完整,在中断服务程序结束后,也就不能正确恢复并继续执行现行程序。
保存断点
为保证中断服务执行完毕后能正确地返回到原来的程序,必须将原来的程序的**断点(即程序计数器PC)**保存起来。
中断服务程序寻址
实质是取出中断服务程序的入口地址送入程序计数器PC。
保存现场和屏蔽字
进入中断服务程序后,首先要保存现场,现场信息一般是指**程序状态字寄存器PSWR(Program Status Word Register)**和某些通用寄存器的内容。
开中断
允许更高级中断请求得到响应
执行中断服务程序
这是中断请求的目的。
关中断
保证在恢复现场和屏蔽字时不被中断
恢复现场和屏蔽字
将现场和屏蔽字恢复到原来的状态
开中断、中断返回
中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序。
系统调用
指用户在程序中调用操作系统所提供的一些子功能,系统调用可视为特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在此用户程序中,凡是与资源有关的操作(存储分配、进行I/O传输及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令由几十条乃至上百条之多。这些系统调用按功能可分为如下几类
设备管理
文件管理
进程控制
进程通信
内存管理
系统调用相关功能设计系统资源管理、进程管理之类的操作,必须需要使用某些特权指令才能完成,所以系统调用的处理需要由操作系统内核程序负责完成,要运行在核心态。用户程序可以执行陷入指令(又称防管指令或trap指令)来发起系统调用,请求操作系统提供服务。可以这么理解,用户程序执行陷入指令,相当于把CPU的使用权主动交给操作系统内核程序(CPU状态会从用户态进入核心态),之后操作系统内核程序再对系统调用请求作出相应处理。处理完成后,操作系统内核程序又会把CPU的使用权还给用户程序(即CPU状态会从核心态回到用户态)。这么设计的目的是,用户程序不能直接执行对系统影响非常大的操作,必须通过系统调用方式请求操作系统代为执行,以便保证系统的稳定性和安全性,防止用户程序随意更改或访问重要的系统资源,影响其他程序的运行
用户通过操作系统运行上层程序(如系统提供的命令解释程序或用户自编程序),而这个上层 程序的运行依赖于操作系统底层管理程序提供服务支持,当需要管理程序服务时,系统通过硬件中断机制进入核心态,运行管理程序;也可能是程序运行出现异常情况,被动地需要管理程序的服务,这时就通过异常处理来进入核心态。管理程序运行结束时,用户程序需要继续运行,此时通过相应的保存的程序现场退出中断处理程序或异常处理程序,返回断点处继续执行。如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n84tqiC5-1677480684214)(…/images/image-20220711112214621.png)]
列举一些用户态转核心态的例子
由用户态进入核心态,不仅状态需要切换,而且所用的堆栈也可能需要用户堆栈切换为系统堆栈,但这个系统堆栈也是属于该进程的。
用户态转核心态,会用到访管指令,访管指令是在用户态使用的,所以它不可能是特权指令
并行性
并发性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GJHipOE-1677480684214)(…/images/image-20220712081540195.png)]
进程的概念
多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性和不可再现性的特征。为此引入了进程的概念,用来描述、控制程序的并发执行,实现操作系统的并发性、共享性。
为了使参与并发执行的程序(含数据)能独立地运行,必须配置一个专门的数据结构,称为进城控制块(Process Control Block,PCB),由程序段、相关数据段、PCB三部分组成了进程映像(进程实体)
创建进程,实质上就是创建进程映像中的PCB。撤销进程,实质上是撤销进程的PCB。进程映像是静态的,进程是动态的
PCB是进程存在的唯一标志
进程
:进程实体的运行过程,是系统进行资源分配、调度的一个独立单位
进程的特征
动态性
最基本的特性
并发性
重要特征
独立性
异步性
结构性
进程通常有以下5种状态,前3种是基本状态
运行态
就绪态
阻塞态
等待态
创建态
结束态
注意区分就绪态与等待态
进程状态的转换
就绪态 -> 运行态
运行态 -> 就绪态
运行态 -> 阻塞态
阻塞态 -> 就绪态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnEBGqVW-1677480684214)(…/images/image-20220713111007884.png)]
一个进程从运行态变成阻塞态是主动行为,从阻塞态变成就绪态是被动行为,需要其他进程的协助
一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,是一个不可分割的基本单位
进程的创建
进程的终止
引起进程终止的事件主要有
正常结束
异常结束
外界干预
操作系统终止进程的过程(撤销原语)
进程的阻塞和唤醒
正在执行的进程,由于期待的事件未发生(请求系统资源失败、等待某种操作完成、新数据尚未到达、无新工作可做),由系统自动执行阻塞原语(Block),使自己由运行态变为阻塞态
可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞态。阻塞原语的执行过程如下
当被阻塞进程所期待的事件出现时(启动的IO操作已完成、期待的数据已到达),由有关进程(释放该IO设备的进程、或提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒,唤醒原语执行过程如下
Block原语与Wakeup原语是一对作用相反的原语,必须成对使用。Block原语是由被阻塞进程自我调用实现的,Wakeup原语是由一个与被唤醒进程合作或被其他相关的进程调用实现的
进程切换
处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。进程切换的过程如下
进程切换与处理机模式切换是不同的,模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断、异常进入核心态运行,执行完后又回到用户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,而无需改变当前进程的环境信息。而切换进程,则当前进程的环境信息需要改变。
调度和切换的区别,调度是决定资源分配给哪个进程的行为,是一种决策行为。切换是实际分配的行为,是执行行为。一般来说,先资源调度,后进程切换
进程控制块
最核心
进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制、管理,管理结束时,系统收回其PCB,该进程随之消亡。
PCB主要包括进程描述信息、进程控制、管理信息、资源分配清单、处理机相关信息等,详细如下
进程描述信息 | 进程控制和管理信息 | 资源分配清单 | 处理及相关信息 |
---|---|---|---|
进程标识符(PID) | 进程当前状态 | 代码段指针 | 通用寄存器值 |
用户标识符(UID) | 进程优先级 | 数据段指针 | 地址寄存器值 |
代码运行入口地址 | 堆栈段指针 | 控制寄存器值 | |
程序的外存地址 | 文件描述符 | 标志寄存器值 | |
进入内存时间 | 键盘 | 状态字 | |
处理机占用时间 | 鼠标 | ||
信号量使用 |
组织PCB的常用方式有链接方式和索引方式两种
链接方式
索引方式
程序段
数据段
PV操作是低级通信方式,高级通信方式是以较高的效率传输大量数据的通信方式,主要有3种
共享存储
低级方式
:基于数据结构的共享高级方式
:基于存储区的共享消息传递
直接通信方式
间接通信方式
信箱通信方式
管道通信
消息传递的一种特殊方式,所谓管道,是用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。
为了协调双方的通信,管道机制必须提供三方面的能力:互斥、同步、确定对方的存在
管道也是一种文件,但是管道可以克服使用文件进行通信的两个问题
限制管道的大小
读进程也可能工作的比写进程快
从管道读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。管道只能采用半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。
管道可以理解为共享存储的优化和发展,因为在共享存储中,若某进程要访问共享存储空间,则必须没有其他进程在该共享存储空间进行写操作
PV操作是一种实现进程互斥、同步的有效方式,与信号量的处理相关,P表示通过的意思,V表示释放的意思
线程的基本概念
线程与进程的比较
调度
拥有资源
并发性
系统开销
地址空间和其他资源
通信方面
线程的属性
线程的实现方式
用户级线程
(User-Level Thread, ULT)
内核级线程
(Kernel-Level Thread, KLT)、内核支持的线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjVsUR5R-1677480684215)(…/images/image-20220714111545655.png)]
多线程模型
多对一模型
一对一模型
多对多模型
调度的基本概念
调度的层次
作业调度
高级调度
中级调度
内存调度
进程调度
低级调度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVOcos0D-1677480684215)(…/images/image-20220714142625537.png)]
三级调度的联系
进程调度、切换程序是操作系统内核程序。
现代操作系统中,不能进行进程的调度、切换的情况有以下几种
处理中断的过程中
进程在操作系统内核程序临界区中
其他需要完全屏蔽中断的原子操作过程中
若在上述过程中发生了引起调度的条件,则不能马上进行调度、切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度、切换
应该进行进程调度、切换的情况如下
发生引起调度条件、当前进程无法继续运行下去时,可以马上调度切换。若操作系统只在这种情况下进行进程调度,则是非剥夺调度
中断处理结束、自陷处理结束后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度、切换。若操作系统支持这种情况下的运行调度程序,则实现了剥夺方式调度
进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息推入当前进程的内核堆栈来保存它们,并更新堆栈指针。内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作之后,开始运行新的进程
非剥夺调度方式
非抢占方式
剥夺调度方式
抢占方式
CPU利用率
系统吞吐量
周转时间
等待时间
响应时间
先来先服务(FCFS)
调度算法
最简单的调度算法,可用于作业调度、进程调度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wO9a8Rm-1677480684215)(…/images/image-20220714161058333.png)]
属于不可剥夺算法,对所有作业都公平,长作业先到达,会使后面许多短作业等待长时间,因此不能作为分时系统、实时系统的主要调度策略
被结合在其他调度策略中使用
特点是算法简单、但效率低。对长作业有利,不利于短作业(相对于SJF、高响应比),有利于CPU繁忙型作业,不利于IO繁忙型作业。
短作业优先(SJF)
调度算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MC3y77zg-1677480684215)(…/images/image-20220714162342375.png)]
缺点
SJF调度算法的平均等待时间、平均周转时间最少
优先级
调度算法
非剥夺式优先级
调度算法
剥夺式优先级
调度算法
静态优先级
动态优先级
高响应比优先
调度算法
用于作业调度,对FCFS、SJF的一种综合平衡。在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,选出最高的作业运行
响应比 R p = 等待时间 + 要求服务时间 要求服务时间 响应比R_p = \frac{等待时间+要求服务时间}{要求服务时间} 响应比Rp=要求服务时间等待时间+要求服务时间
时间片轮转
调度算法
多级反馈队列
调度算法
是时间片轮转调度算法和优先级调度算法的综合发展,通过动态调整进程优先级、时间片大小,该算法可以兼顾多方面的系统目标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9vI8iEX0-1677480684216)(…/images/image-20220714165445316.png)]
实现思想
优点
终端型作业用户
短批处理作业用户
长批处理作业用户
临界资源
一次仅允许一个进程使用的资源
对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区,为了保证临界资源的正确使用,可把访问临界资源的过程分为4部分
进入区
临界区
退出区
剩余区
do {
entry section;
critical section;
exit section;
remainder section;
} while (true)
同步
制约关系
互斥
间接制约关系
空闲让进
忙则等待
有限等待
让权等待
软件实现方法
单标志法
双标志法先检查
每个进程访问临界区资源之前,先查看临界资源是否正被访问,若正被访问,该进程需等待;否则,进程才进入自己的临界区。为此,设置一个数据flag[i],如第i个元素值为FALSE,表示** P i P_i Pi进程未进入临界区,值为TRUE**,表示进入临界区。
优点是不用交替进入,可连续使用。缺点是两个进程可能同时进入临界区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzOoO33C-1677480684216)(…/images/image-20220714191407175.png)]
双标志法后检查
算法二先检测对方的进程状态标志,再置自己的标志,由于在检测、放置中可插入另一个进程到达时的检测操作,会造成两个进程在分别检测后同时进入临界区。为此,该算法先将自己的标志设置为TRUE,再检测对方的状态标志,若对方标志为TRUE,则进程等待;否则进入临界区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y46Egaal-1677480684216)(…/images/image-20220714192200840.png)]
两个进程几乎同时都想进入临界区时,分别将自己的标志值flag设置TRUE,并同时检测对方的状态(执行while语句),发现对方也要进入临界区时,双方互相谦让,导致都无法进入,形成饥饿现象
Peterson's Alogrithm
为了防止两个进程为进入临界区而无限期等待,又设置了变量turn,每个进程在先设置自己的标志后,再设置turn标志。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bCC0WKGl-1677480684216)(…/images/image-20220714192703592.png)]
利用flag解决临界资源的互斥访问,利用turn解决饥饿现象
硬件实现方法
中断屏蔽方法
硬件指令方法
TestAndSet指令:这条指令是原子操作,即执行该代码时不允许被中断。其功能是读出指定标志后把该标志设置为真。
可以为每个临界资源设置一个共享布尔变量lock,表示资源的两种状态:true表示正被占用,初值为false。在进程访问临界资源之前,利用TestAndSet检查和修改标志lock;若有进程在临界区,则重复检查,直到进程退出。
Swap指令:该指令的功能是交换两个字(字节)的内容
以上对TestAndSet和Swap指令的描述仅是功能实现,而非软件实现的定义。事实上,它们是由硬件逻辑直接实现的,不会被中断
应为每个临界资源设置一个共享布尔变量lock,初值为false;在每个进程中再设置一个局部布尔变量key,用于与lock交换信息。在进入临界区前,先利用Swap指令交换lock与key的内容,然后检查key的状态;有进程在临界区时,重复交换和检查过程,直到进程退出。
优点是适用于任意数目的进程,不管是单处理机、多处理机;简单、容易验证其正确性;支持进程内有多个临界区,只需为每个临界区设置一个布尔变量
缺点是进程等待进入临界区时要耗费处理时间,不能实现让权等待。从等待进程中随机选择一个进入临界区,有的进程可能一直选不上,从而导致饥饿现象
信号量机制是一种功能较强的机制,可用来解决互斥与同步问题,只能被两个标准原语wait(S)、signal(S)访问,也可记为P操作和V操作
原语指完成某种功能且不被分割、不被中断执行的操作序列,通常可由硬件实现。原语功能不被中断执行的特性在单处理机上可由软件通过屏蔽中断方法实现
整型信号量
记录型信号量
利用信号量实现同步
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kF4v5EwM-1677480684216)(…/images/image-20220714202830579.png)]
利用信号量实现进程互斥
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpDLyxga-1677480684217)(…/images/image-20220714202911856.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jQmkVqAx-1677480684217)(…/images/image-20220714202921138.png)]
利用信号量实现前驱关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l4JhCTUe-1677480684217)(…/images/image-20220714203134304.png)]
为使各程序段能正确执行,应设置若干初始值为0的信号量。例如,为保证** S 1 → S 2 , S 1 → S 3 S_1 \rightarrow S_2,S_1 \rightarrow S_3 S1→S2,S1→S3**的前驱关系,应分别设置信号量a1,a2。同样,其他程序段类似
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJGXlACp-1677480684217)(…/images/image-20220714203359636.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZeLlHWnj-1677480684217)(…/images/image-20220714203405886.png)]
分析进程同步和互斥问题的方法步骤
定义
产生原因
系统资源的竞争
进程推进顺序非法
死锁产生的必要条件
互斥条件
不剥夺条件
请求并保持条件
循环等待条件
直观上看,循环等待条件似乎和死锁的定义一样,其实不然,按死锁定义构成等待环所要求的条件更严,它要求 P i P_i Pi等待的资源必须由 P i + 1 P_{i+1} Pi+1来满足,而循环等待条件无此限制。
如下所示,资源分配图含圈而不一定造成死锁的原因是,同类资源数大于1,但若系统中每类资源都只有一个资源,则含圈就变成了系统出现死锁的充要条件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZjoGyue-1677480684218)(…/images/image-20220714211807014.png)]
注意区分不剥夺条件和请求并保持条件
为使系统不发生死锁,必须破环死锁的4个必要条件之一;或允许死锁产生,但当死锁发生时,能检测出死锁,并有能力实现恢复
死锁预防
避免死锁
死锁的检测及解除
思索处理策略的比较
资源分配策略 | 各种可能模式 | 优点 | 缺点 | |
---|---|---|---|---|
死锁预防 | 保守,宁可资源闲置 | 一次请求所有资源,资源剥夺,资源按序分配 | 适用于突发式处理的进程,不必进行剥夺 | 效率低可,进城初始化时间延长;剥夺次数过多;不便灵活申请新资源 |
死锁避免 | 是预防和检测的折中,在运行时判断是否可能死锁 | 寻找可能的安全允许顺序 | 不必进行剥夺 | 必须知道将来的资源需求;进程不能被长时间阻塞 |
死锁检测 | 宽松,只要允许就分配资源 | 定期检查死锁是否已经发生 | 不延长进程初始化时间,允许对死锁进行现场处理 | 通过剥夺解除死锁,造成损失 |
互斥
条件
不剥夺
条件
请求并保持
条件
循环等待
条件
系统安全状态
银行家算法
进程运行之前,先声明对各种资源的最大需求量
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量
数据结构描述
可利用资源向量 Available
最大需求矩阵 Max
分配矩阵 Allocation
需求矩阵 Need
三个矩阵间存在下述关系
N e e d = M a x − A l l o c a t i o n Need = Max - Allocation Need=Max−Allocation
安全性算法
资源分配图
系统死锁可利用资源分配图来描述
圆圈代表一个进程,框代表一类资源。由于一种类型的资源可能有多个,因此用框中的一个圆代表一类资源中的一个。
进程到资源的有向边称为请求边
资源到进程的边称为分配边
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6JPATftX-1677480684218)(…/images/image-20220715094159414.png)]
死锁定理
在资源分配图中,找出既不阻塞又不孤点的进程P
消去它所有的请求边和分配边,使之称为孤立的结点
若能消去图中所有的边,则称该图是可完全简化的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Pe9NB4W-1677480684218)(…/images/image-20220715111237482.png)]
系统状态为死锁的条件是当且仅当系统状态的资源分配图是不可完全简化的,该条件为死锁定理
死锁解除
资源剥夺法
撤销进程法
进程回退法
为什么要引入进程
什么是进程?由什么组成
为什么要进行处理机调度?
为什么会产生死锁?产生死锁有什么条件?
互斥条件
不剥夺条件
请求并保持条件
循环等待条件
解决死锁的办法
预防死锁
避免死锁
死锁的检测与解除
银行家算法的工作原理
内存空间的分配与回收
地址转换
内存空间的扩充
存储保护
进程运行的基本原理
程序装入和链接
创建进程首先要将程序、数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤
编译
链接
装入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wemsidej-1677480684218)(…/images/image-20220715154259219.png)]
程序的链接有以下三种方式
静态链接
装入时动态链接
运行时动态链接
内存装入模块装入内存的三种方式
绝对装入
可重定位装入
动态运行时装入
动态重定位
程序在内存中若发生移动,则需要采用动态装入方式。
装入程序把装入模块装入内存后,不立即把装入模块的相对地址转换为绝对地址,而是推迟到程序真正要执行的时候才进行。因此,装入内存后,所有的地址均为相对地址,这种方式需要一个重定位寄存器的支持
特点是:可以将程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,之后在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GnkW6Rq8-1677480684218)(…/images/image-20220716160309460.png)]
逻辑地址空间与物理地址空间
内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法
在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限与上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界
采用重定位寄存器(或基址寄存器)和界地址寄存器(或限长寄存器)来实现这种保护。重定位寄存器含物理地址的最小值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85v0XCe9-1677480684219)(…/images/image-20220716161422449.png)]
实现内存保护需要重定位寄存器和界地址寄存器,因此要注意两者区别。重定位寄存器用来加的,逻辑地址加上重定位寄存器的值就能得到物理地址;界地址寄存器是用来比的,通过比较界地址寄存器的值与逻辑地址的值来判断是否越界
单一连续分配
固定分区分配
最简单的一种多道程序存储管理方式,将用户内存空间划分为若干固定大小的区域,每个分区只能装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环
固定分区分配有两种划分分区的方法
分区大小相等
分区大小不等
为了便于内存分配,通常将分区按大小排队,并建立分区说明表,其中各表项包括每个分区的始址、大小、状态(是否已分配)
当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为已分配
未找到合适分区时,则拒绝为该用户程序分配内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeRNSv2u-1677480684219)(…/images/image-20220716180602894.png)]
这种方式存在两个问题
固定分区是可用于多道程序设计的最简单的存储分配,无外部碎片,但不能实现多进程共享一个主存区,所以存储空间利用率低。很少用于现代通用操作系统,但可用于控制多个相同对象的控制系统
动态分区分配
可变分区分配
不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要
因此,系统中分区的大小、数目是可变的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IXUEDIPg-1677480684219)(…/images/image-20220716182022217.png)]
动态分区在开始分配时是很好的,但之后会导致内存中出现许多小的内存块,即外部碎片,指在所有分区外的存储空间会变成越来越多的碎片,与固定分区的内部碎片正好相对。
在进程装入或换入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略
首次适应(First Fit)
算法
最佳适应(Best Fit)
算法
最坏适应(Worst Fit)
算法 **最大适应(Largest Fit)**算法
邻近适应(Next Fit)
算法 循环首次适应算法
三种内存分区管理方式的比较
作业道数 | 内部碎片 | 外部碎片 | 硬件支持 | 可用空间管理 | 解决碎片方法 | 解决空间不足 | 提高作业道数 | |
---|---|---|---|---|---|---|---|---|
单道连续分配 | 1 | 有 | 无 | 界地址寄存器、越界检查机构 | - | - | 覆盖 | 交换 |
多道固定连续分配 | ≤ N \le N ≤N(用户空间划为N块) | 有 | 无 | 上下界寄存器、越界检查机构、基地址寄存器、长度寄存器、动态地址转换机构 | - | - | - | - |
多道可变连续分配 | - | 无 | 有 | 同上 | 数组、链表 | 紧凑 | - | - |
以上三种内存分区管理方法有一个共同特点,即用户进程(或作业)在主存中都是连续存放的
根据分区大小是否固定分为分页存储管理方式和分段存储管理方式
分页存储管理方式
根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式
基本分页存储管理方式
固定分区产生内部碎片,动态分区产生外部碎片,这两种技术的内存利用率都比较低。这就引入了分页思想
分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片。本质的不同点是块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存空间时,才产生主存碎片,所以尽管会产生内部碎片,但这种碎片相对于进程来说也是很小的,每个进程平均只产生半个块大小的内部碎片,也称页内碎片
分页存储的几个概念
页面和页面大小
地址结构
逻辑地址结构如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JgUNPj8s-1677480684219)(…/images/image-20220718084638668.png)]
地址长度为32位,011**位是页内地址,**1231位是页号,地址空间最多允许** 2 20 2^{20} 220**页
地址结构决定了虚拟内存的寻址空间有多大,在实际问题中,页号、页内偏移、逻辑地址大多都是用十进制数给出的。
页表
为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般存放在内存中
配置页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。
页表由页表项组成,页表项与地址都由两部分构成,第一部分都是页号,但页表项第二部分是物理内存中的块号,地址第二部分是页内偏移。页表项第二部分与地址第二部分共同组成物理地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyqeMQaC-1677480684219)(…/images/image-20220719083424728.png)]
基本地址变换机构
将逻辑地址转换为内存中的物理地址,地址变换借助于页表实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lyCnkbU4-1677480684220)(…/images/image-20220719083600591.png)]
在系统中通常设置一个页表寄存器(PTR),存放页表在内存的起始地址F和页表长度M。进程未执行时,页表的始址、长度存放在进程控制块中,当进程执行时,才将页表始址、长度存入页表寄存器。设页面大小为L,逻辑地址A到物理地址E的变换过程如下(逻辑地址、页号、每页的长度都是十进制数)
计算页号P(P=A/L)和页内偏移量W(W=A%L)
比较页号P和页表长度M,若P >= M,则产生越界中断,否则继续执行
页表中页号P对应的页表项地址 = 页表始址F + 页号P * 页表项长度,取出该页表项内容b,即为物理块号。
注意区分页表长度和页表项长度。页表长度的值是指一共有多少页,页表项长度是指页地址占多大的存储空间
计算E = b * L + W,用得到的物理地址E去访问内存
以上地址变换由硬件自动完成,页式管理只需给出一个整数就能确定对应的物理地址,因为页面大小L是固定的。因此,页式管理中地址空间是一维的
页表项的作用是找到该页在内存中的位置。以32位逻辑地址空间、字节编址单位、一页4KB为例,地址空间一共有** 2 32 B / 4 K B = 1 M 2^{32}B/4KB=1M 232B/4KB=1M页,因此,需要log1M=20位才能保证表示范围能容纳所有页面,又因为字节作为编址单位,即页表项的大小 > = ⌈ 20 / 8 ⌉ = 3 B >=\lceil 20/8 \rceil = 3B >=⌈20/8⌉=3B**。所以在这个条件下,为了保证页表项能够指向所有页面,页表项的大小应该大于3B,当然,也可选择更大的页表项让一个页面能够正好容下整数个页表项,进而方便存储(如取成4B,一页正好可以装下1K个页表项),或增加一些其他信息
分页管理方式存在的两个主要问题
具有快表的地址变换机构
若页表全部放在内存中,则存取一个数据或一条指令至少要访问两次内存
访问页表,确定所存取的数据或指令的物理地址
根据该地址存取数据、指令
这种方法比通常执行指令的速度慢了一半
为提高速度,在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器–快表,又称相联存储器(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。
具有快表的地址变换机构如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UptpeJGF-1677480684220)(…/images/image-20220719102820142.png)]
具有快表的分页机制中,地址的变换过程如下
一般快表的命中率可达90%以上,这样分页带来的速度损失就可降低至10%以下。快表的有效性基于局部性原理
两级页表
使用层次结构的页表,将页表的10页空间也进行地址映射,建立上一级页表,用于存储页表的映射关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qKLQmDof-1677480684220)(…/images/image-20220719103610248.png)]
二级页表实际上是在原有页表结构上再加上一层页表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5pFjLYk-1677480684220)(…/images/image-20220719103644752.png)]
建立多级页表的目的在于建立索引,以便不用浪费主存空间去存储无用的页表项,也不用盲目地顺序式查找页表项
基本分段存储管理方式
与分页的区别联系
分段
按照用户进程中的自然段划分逻辑空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WJ2RDOl-1677480684220)(…/images/image-20220719104341698.png)]
页式系统中,逻辑地址的页号、页内偏移量对用户是透明的,但段式系统中,段号、段内偏移量必须由用户显式提供,在高级程序设计语言中,这个工作由编译程序完成
段表
每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项记录该段在内存中的始址和长度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTcX0zmP-1677480684221)(…/images/image-20220719104727261.png)]
配置段表后,执行中的进程可通过查找段表,找到每段所对应的内存区
地址变换机构
分段系统的地址变换如下图。为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址F和段表长度M。从逻辑地址A到物理地址E之间的地址变换如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHauc7Xg-1677480684221)(…/images/image-20220719105124746.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBt5GvbR-1677480684221)(…/images/image-20220719105142537.png)]
段的共享与保护
与分页管理类似,分段管理的保护方法主要有两种
分页管理中的地址越界保护只需要判断页号是否越界,页内偏移是不可能越界的
与页式管理不同,段式管理不能通过给出一个整数便确定对应的物理地址,因为每段的长度是不固定的,无法通过整数除法得出段号,无法通过求余得出段内偏移,所以段号和段内偏移一定要显式给出,因此分段管理的地址空间是二维的
段页式管理方式
页式存储管理能有效的提高内存利用率,分段存储管理方式能反映程序的逻辑结构,有利于段的共享。
段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。
段页式系统中,作业的逻辑地址分三部分,段号、页号、页内偏移量,如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmEBw1jq-1677480684222)(…/images/image-20220719111154053.png)]
为了实现地址变换,系统为每个进程建立一张段表,每个分段有一张页表。段表表项中至少包括段号、页表长度、页表始址,页表表项中至少包括页号、块号,此外,系统中还应有一个段表寄存器,指出作业的段表始址、段表长度
段表寄存器和页表寄存器的作用都有两个:一是在段表、页表中寻址,二是判断是否越界
注意:在一个进程中,段表只有一个,页表可能有多个
地址变换时,通过段表查到页表始址,通过页表找到页帧号,最后形成物理地址。进行一次访问,实际需要三次访问主存,这里同样可以使用快表来加快查找速度,关键字由段号、页号组成,值是对应的页帧号、保护码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5TwAShr-1677480684222)(…/images/image-20220719111708636.png)]
段页式管理的地址空间是二维的
一次性
驻留性
时间局部性
空间局部性
多次性
对换性
虚拟性
请求分页存储管理
请求分段存储管理
请求段页式存储管理
建立在基本分页系统基础之上,为了支持虚拟存储器而增加了请求调页、页面置换功能。是目前最常用的一种实现虚拟存储器的方法
页表机制
不同于基本分页系统,请求分页系统在一个作业运行之前不要求全部一次性调入内存,因此在作业运行过程中,必然会出现要访问的页面不在内存中的情况,如何发现、处理这种情况?为此,在请求页表项中增加了4个字段,如下
状态位P
访问字段A
修改位M
外存地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBxlKRvT-1677480684222)(…/images/image-20220719140947279.png)]
缺页中断机构
地址变换机构
进行地址变换时,先检索快表
若找到要访问的页,则修改页表项中的访问位(写指令还需要重置修改位),然后利用页表项中给出的物理块号和页内地址形成物理地址
若未找到该页的页表项,则应到内存中去查找页表,再对比页表项中的状态位P,看该页是否已调入内存,未调入则产生缺页中断,请求从外存把该页调入内存
最佳(OPT)置换算法
选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率。
可用来评价其他算法
先进先出(FIFO)页面置换算法
优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。该算法实现简单,只需要把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面
FIFO算法还会产生所分配的物理块数增大而页故障数不减反增的异常现象,(由Belady发现),故称Belady异常。只有FIFO算法才会出现这种异常
最近最久未使用(LRU)置换算法
时钟(CLOCK)置换算法
LRU算法性能接近于OPT算法,但实现起来比较困难,且开销大;FIFO算法实现简单,但性能差。试图用比较小的开销接近LRU算法的性能,这类算法都是CLOCK算法的变体,因为算法要循环扫描缓冲区,像时钟的指针一样转动,所以称为CLOCK算法,又称**最近未使用(NRU,Not Recently Used)**算法
简单的CLOCK算法給每帧关联一个附加位,称为使用位。当某页首次装入主存时,将该帧的使用位设置为1,当该页随后再被访问到时,其使用位也被置为1。对于页替换算法,用于替换的候选帧集合可视为一个循环缓冲区,并有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统将该位重新置0;若在这个过程开始时,缓冲区中的所有帧的使用位均为0,则选择遇到的第一个帧替换;若所有帧的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并停留在最初的位置上,替换该帧中的页。由于该算法循环检查各页面的情况,因此称CLOCK算法
CLOCK算法的性能比较接近LRU算法,而通过增加使用的位数目,可以使得CLOCK算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型CLOCK置换算法,这样,每帧都处于以下4种情况
算法执行如下操作步骤
改进型CLOCK算法优于简单CLOCK算法的地方在于替换时,首选没有变化的页,由于修改过的页在被替换之前必须写回,因而这样做会节省时间
改进型CLOCK算法与普通CLOCK算法区别
操作系统中任何经过优化的页面置换算法都有一个原则
CLOCK算法只考虑到是否被访问过,因此被访问过的当然尽可能留下,未使用过的就淘汰;而改进型CLOCK算法对使用过的页面又做了细分,分为使用过但未修改和使用过且修改过,因此,若有未使用过的页面,则当然首先把它换出,若全部页面都使用过,则当然有限把未修改过的页面换出。
固定分配局部置换
可变分配全局置换
可变分配局部置换
预调页策略
请求调页策略
系统拥有足够的对换空间
系统缺少足够的对换区空间
UNIX方式
分页管理VS分段管理
分页 | 分段 | |
---|---|---|
目的 | 页是信息的物理单位,分页是为实现离散分配方式,以削减内存的外零头,提高内存的利用率。或者说,分页仅是由于系统管理的需要,而不是用户的需要 | 段是信息的逻辑单位,含有一组意义相对完整的信息。分段的目的是能更好地满足用户的需求 |
长度 | 页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面 | 段的长度不固定,决定于用户所编写的程序,通常由编译程序在对程序进行编译时,根据信息的性质来划分 |
地址空间 | 作业地址空间是一维的,即单一的线性地址空间,程序员利用一个记忆符即可表示一个地址 | 作业地址空间是二维的,程序员在标识一个地址时,需给出段名、段内地址 |
碎片 | 有内部碎片,无外部碎片 | 有外部碎片,无内部碎片 |
共享和动态链接 | 不容易实现 | 容易实现 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1SqojUfr-1677480684222)(…/images/image-20220721190211843.png)]
数据项
基本数据项
组合数据项
记录
文件
名称
标识符
类型
位置
大小
保护
时间、日期、用户标识
创建文件
写文件
读文件
文件重定位(文件寻址)
删除文件
截断文件
文件指针
文件打开计数
文件磁盘位置
访问权限
无结构文件
流式文件
有结构文件
纪录式文件
顺序文件
串结构
顺序结构
索引文件
对于定长记录文件,要查找第i条记录,可直接根据公式得到第i条记录相对于第1条记录的地址
A i = i × L A_i=i \times L Ai=i×L
对于可变长记录文件,要查找第i条记录,必须顺序地查找前i-1条记录,从而获得相应记录的长度L,再根据公式计算第i条记录的首址
A i = ∑ i = 0 i − 1 L i + 1 A_i=\sum^{i-1}_{i=0} L_i+1 Ai=i=0∑i−1Li+1
假定每条记录前用一个字节指明该记录的长度
变长记录文件只能顺序查找,系统开销较大,可以建立一张索引表加快检索,索引表本身是定长记录地顺序文件
索引顺序文件
直接文件或散列文件
文件控制块
基本信息
存取控制信息
使用信息
索引结点
文件主标识符
文件类型
文件存取权限
文件物理地址
文件长度
文件链接计数
文件存取时间
索引结点编号
状态
访问计数
逻辑设备号
链接指针
搜索
创建文件
删除文件
显示目录
修改目录
单极目录结构
两级目录结构
多级目录结构(树形目录结构)
无环图目录结构
基于索引结点的共享方式(硬链接)
利用符号链实现文件共享(软链接)
访问类型
访问控制
用户调用接口
文件目录系统
存取控制验证模块
逻辑文件系统与文件信息缓冲区
物理文件系统
辅助分配模块
设备管理程序模块
线性列表
哈希表
连续分配
要求每个文件在磁盘上占有一组连续的块,如下图,磁盘地址定义了磁盘上的一个线性排序。这种排序使作业访问磁盘时需要的寻道数和寻道时间最小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTxeDZs1-1677480684223)(…/images/image-20220803172217573.png)]
支持顺序访问、直接访问,优点是实现简单、存取速度快
缺点是文件长度不宜动态增加,因为一个文件末尾后地盘块可能已分配给其他文件,一旦需要增加,就需要大量移动盘块。此外,反复增删文件后,会产生外部碎片(与内存管理分配方式中的碎片相似),且很难确定一个文件需要的空间大小,因而只适用于长度固定的文件。
链接分配
采取离散分配的方式,消除了外部碎片,因此显著提高了磁盘空间的利用率;又因为根据文件的当前需求为其分配必须的盘块,当文件动态增长时,可以动态地再为它分配盘块
分为隐式链接、显式链接两种形式
隐式链接
每个文件对应一个磁盘块的链表
磁盘块分布在磁盘的任何地方,除最后一个盘块外,每个盘块都有指向下一个盘块的指针,这些指针对用户是透明的
目录包括文件第一块的指针和最后一块指针
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytdZbkpH-1677480684223)(…/images/image-20220803173142160.png)]
创建新文件时,目录中增加一个新条目。每个目录项都有一个指向文件首块的指针。该指针初始化为NULL以表示空文件,大小字段为0。写文件会通过空闲空间管理系统找到空闲块,将该块链接到文件的尾部,以便写入。读文件则通过块到块的指针顺序读块
缺点是无法直接访问盘块,只能通过指针顺序访问文件,且盘块指针会消耗一定的存储空间。隐式链接分配的稳定性也是一个问题,系统在运行过程中由于软件、硬件错误导致链表中的指针丢失、损坏,会导致文件数据的丢失
显式链接
把用于链接文件各物理块的指针,从每个物理块的块末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中进设置一张,称为文件分配表(File Allocation Table,FAT)。
每个表项中存放对应快的下一块链接指针,即下一个盘块号。文件的第一个盘块号记录在目录中,后续的盘块可通过查FAT找到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rC3SeHhI-1677480684223)(…/images/image-20220803173742837.png)]
不难看出,FAT的表项与全部磁盘块一一对应,并且可以用特殊数字表示
FAT不仅记录了文件各块之间的先后链接关系,同时还标记了空闲的磁盘块,操作系统也可以通过FAT对文件存储空间进行管理。当某进程请求操作系统分配一个磁盘块时,操作系统只需从FAT中找到**-2**的表项,并将对应的磁盘块分配给进程即可
FAT表在系统启动时就会被读入内存,因此查找FAT的过程是在内存中进行的,因此不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数
索引分配
解决了连续分配的外部碎片和文件大小管理的问题。但是,链接分配不能有效支持直接访问(FAT除外)。索引分配解决了这个问题,它把每个文件的所有的盘块号都集中放在一起构成索引块(表)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mkWPKCU0-1677480684223)(…/images/image-20220803175526871.png)]
每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。目录条目包括索引块的地址。要读第i块,通过索引块的第i个条目的指针来查找、读入所需的块
创建文件时,索引块的所有指针都设为空
索引分配支持直接访问,且没有外部碎片问题
缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。可以采用如下机制解决
链接方案
多层索引
混合索引
三种分配方式比较
访问第n条记录 | 优点 | 缺点 | |
---|---|---|---|
连续分配 | 需访问磁盘1次 | 顺序存取时速度快,文件定长时可根据文件起始地址及记录长度进行随机访问 | 文件存储要求连续的存储空间,会产生碎片,不利于文件的动态扩充 |
链接分配 | 需访问磁盘n次 | 可解决外存的碎片问题,提高外存空间的利用率,动态增长较方便 | 只能按照文件的指针链顺序访问,查找效率低,指针信息存放消耗外存空间 |
索引分配 | m级需访问磁盘m+1次 | 可以随机访问,文件易于增删 | 索引表增加存储空间的开销,索引表的查找策略对文件系统效率影响较大 |
访问文件需要两次访问外存,首先要读取索引块的内容,然后访问具体的磁盘块,因而降低了文件的存取速度。为了解决这一问题,通常将文件的索引块读取内存的缓冲区中,以加快文件的访问速度。
文件存储器空间的划分与初始化
一般来说,一个文件存储在一个文件卷中。文件卷可以是物理盘的一部分,也可以是整个物理盘
在一个文件卷中,文件数据信息的空间(文件区)和存放文件控制信息FCB的空间(目录区)是分离的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ayY5re5U-1677480684223)(…/images/image-20220803193449025.png)]
文件存储器空间管理
文件存储设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题
空闲表法
连续分配方式,与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。
系统为外存上的所有空闲区建立一张空闲盘块表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列,如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZNZoCCkt-1677480684224)(…/images/image-20220803194042383.png)]
空闲盘区的分配与内存的动态分配类似,同样采用首次适应算法、循环首次适应算法等。
系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并
空闲链表法
位示图法
利用二进制的一位来表示磁盘中的一个盘块的使用情况,磁盘上所有的盘块都有一个二进制与之对应
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svXAexdL-1677480684224)(…/images/image-20220803201145338.png)]
盘块的分配
顺序扫描位示图,从中找出一个或一组其值为0的二进制位
将找到的一个或一组二进制位,转换成与之对应的盘块号
修改位示图,令map[i,j] = 1
盘块的回收
将回收盘块的盘块号转换成位示图中的行号和列号,转换公式为
i = ( b − 1 ) D I V n + 1 j = ( b − 1 ) M O D n + 1 \rm i=(b-1) \ DIV \ n+1 \newline \rm j=(b-1) \ MOD \ n+1 i=(b−1) DIV n+1j=(b−1) MOD n+1
修改位示图,令map[i,j] = 0
成组链接法
空闲表法、空闲链表法不适用于大型文件系统,因为这会使空闲表或空闲链表太大
结合了空闲表法、空闲链表法两种方法,克服了表太大的缺点
大致思想是,把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一个顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针。假设磁盘最初全为空闲扇区,其成组链接如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBUaSktS-1677480684224)(…/images/image-20220803202357022.png)]
表示文件存储器空闲空间的位向量表或第一个成组链块,以及卷中的目录区、文件区划分信息都需要存放在辅存储器中,一般放在卷头位置,在UNIX系统中称为超级块。在对卷中的文件进行操作前,超级块需要预先读入系统空闲的主存,并且经常保持主存超级块与辅存卷中的超级块的一致性
磁盘是由表面涂有磁性物质的金属或塑料构成的圆形盘片,通过一个称为磁头的导体线圈从磁盘存取数据。在读写操作期间,磁头固定,磁盘在下面高速旋转。如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G8rNE65f-1677480684224)(…/images/image-20220803202945568.png)]
磁盘盘面上的数据存储在一组同心圆中,称为磁道。每个磁道与磁头一样宽,一个盘面有上千个磁道,磁道又划分为几百个扇区,每个扇区固定存储大小(通常为512B),一个扇区称为一个盘块。相邻磁道及相邻扇区间通过一定的间隙分隔开,以避免精度错误。注意,由于扇区按固定圆心角度划分,所以密度从最外道向里道增加,磁盘的存储能力受限于最内道的最大记录密度。
扇区是磁盘可寻址的最小存储单位,磁盘地址用**柱面号·盘面号·扇区号(或块号)**表示
磁盘按不同的方式可分为若干类型
固定头磁盘
活动头磁盘
固定盘磁盘
可换盘磁盘
一次磁盘读写操作的时间由寻找时间(寻道时间)、旋转延迟时间、传输时间决定
寻找时间
T s T_s Ts
活动头磁盘在读写信息前,将磁头移动到指定磁道所需要的时间。这个时间除跨越n条磁道的时间外,还包括启动磁臂的时间s,即
T s = m × n + s T_s=m \times n + s Ts=m×n+s
m是与磁盘驱动器速度有关的常数,约为0.2ms,磁臂的启动时间s约为2ms
旋转延迟时间
T r T_r Tr
磁头定位到某一磁道的扇区所需要的时间,设磁盘的旋转速度为r,则
T r = 1 2 r T_r=\frac{1}{2r} Tr=2r1
对于硬盘,典型的旋转速度为5400转/分,相当于一周11.1ms,则** T r T_r Tr**为5.55ms;对于软盘,其旋转速度为300600转/分,则**$T_r$**为50100ms
传输时间
T t T_t Tt
从磁盘读出或向磁盘写入数据所经历的时间,这个时间取决于每次所读/写的字节数b和磁盘的旋转速度
T t = b r N T_t= \frac{b}{rN} Tt=rNb
r为磁盘每秒的转数,N为一个磁道上的字节数
总平均存取时间
T a T_a Ta
T a = T s + 1 2 r + b r N T_a=T_s+ \frac{1}{2r} + \frac{b}{rN} Ta=Ts+2r1+rNb
目前常用的磁盘调度算法
先来先服务
(First Come First Served, FCFS)
根据进程请求访问磁盘的先后顺序进行调度,是最简单的算法
优点是具有公平性。若只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5x2DwXy-1677480684224)(…/images/image-20220804175330352.png)]
最短寻找时间优先
(Shortest Seek Time First, SSTF)
选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以便使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但能提供比FCFS算法更好的性能
这种算法会产生饥饿现象,即远离磁头的磁道访问被无限期延迟
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UqHZyUmO-1677480684225)(…/images/image-20220804180106672.png)]
扫描
(SCAN)(电梯调度算法)
在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,实际上就是在最短寻找时间优先算法的基础上规定了磁头运动的方向
这种算法对最近扫描过的区域不公平,因此它在访问局部性方面不如FCFS、SSTF算法好
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVEUaLs3-1677480684225)(…/images/image-20220804180644289.png)]
循环扫描
(Circular SCAN,C-SCAN)
在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。由于SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,所以使用改进型的C-SCAN算法来避免这个问题
采用SCAN算法和C-SCAN算法时,磁头总是严格地遵循从盘面的一端到另一端,显然,在实际使用时还可以改进,即磁头移动只需要达到最远端的一个请求即可返回,不需要到达磁盘端点。这种形式的SCAN算法和C-SCAN算法称为LOOK调度和C-LOOK调度,因为它们在朝一个给定方向移动前会查看是否有请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTaYsiui-1677480684225)(…/images/image-20220804181223307.png)]
几种磁盘调度算法的对比
优点 | 缺点 | |
---|---|---|
FCFS | 公平、简单 | 平均寻道距离大,仅应用在磁盘IO较少的场合 |
SSTF | 性能比FCFS好 | 不能保证平均寻道时间最短,可能出现饥饿现象 |
SCAN | 寻道性能较好,可避免饥饿现象 | 不利于远离磁头一端的访问请求 |
C-SCAN | 消除了对两端磁道请求的不公平 | - |
除减少寻找时间外, 减少延迟时间也是提高磁盘传输效率的重要因素.可以对盘面扇区进行交替编号, 对磁盘片组中的不同盘面错位命名
磁盘寻块时间分为三部分,即寻道时间, 延迟时间, 传输时间, 寻道时间, 延迟时间属于找的时间, 凡是找的时间都可以通过一定的方法削减, 但传输时间是磁盘本身性能所决定的, 不能通过一定的措施减少
磁盘初始化
引导块
坏块
人机交互类外部设备
存储设备
网络通信设备
低速设备
中速设备
高速设备
块设备
字符设备
程序直接控制方式
中断驱动方式
思想是, 允许I/O设备主动打断CPU的运行并请求服务, 从而解放CPU, 使得其向I/O控制器发送读命令后, 可以继续做其他有用的工作.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-El6KhQw7-1677480684225)(…/images/image-20220808084107217.png)]
I/O控制器的角度
CPU的角度
该方式比程序直接控制方式有效, 但由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU, 这就导致了中断驱动方式仍然会消耗较多的CPU时间
DMA方式
中断驱动方式中, I/O设备与内存之间的数据交换必须要经过CPU中的寄存器, 所以速度还是受限, 而DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据交换通路, 彻底解放CPU
特点如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EncKqx9v-1677480684226)(…/images/image-20220808092104017.png)]
要在主机与控制器之间实现成块数据的直接交换, 须在DMA控制器中设置4类寄存器
命令/状态寄存器(CR)
内存地址寄存器(MAR)
数据寄存器(DR)
数据计数器(DC)
DMA方式的工作过程是
DMA控制方式与中断驱动方式的主要区别是
通道控制方式
整个I/O系统可以视为具有4个层次的系统结构, 各层次及其功能如下
用户层I/O软件
设备独立性软件
向用户层(或文件层)提供统一接口
设备驱动程序
中断处理程序
硬件设备
设备控制器通过寄存器与CPU通信, 在某些计算机上, 这些寄存器占用内存地址的一部分, 称为内存映像I/O, 另一些计算机则采用I/O专用地址, 寄存器独立编址. 操作系统通过向控制器寄存器写命令字来执行I/O功能. 控制器收到一条命令后, CPU可以转向进行其他工作, 而让设备控制器自行完成具体的I/O操作, 当命令执行完毕后, 控制器发出一个中断信号, 操作系统重新获得CPU的控制权并检查执行结果, 此时, CPU仍旧从控制器寄存器中读取信息来获得执行结果和设备的状态信息
设备控制器的主要功能如下
接收和识别CPU或通道发来的命令
实现数据交换, 包括设备和控制器之间的数据传输; 通过数据总线或通道, 控制器和主存之间的数据传输
发现和记录设备及自身的状态信息, 供CPU处理使用
设备地址识别
为了实现上述功能, 设备控制器必须包含以下组成部分
设备控制器与CPU的接口
数据寄存器
控制/状态寄存器
设备控制器与设备的接口
I/O控制逻辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WXCoYDbO-1677480684226)(…/images/image-20220808101119398.png)]
磁盘高速缓存
(Disk Cache)
缓冲区
(Buffer)
目的
实现方法如下
缓冲区有一个特点
根据系统设置缓冲器的个数, 缓冲技术可以分为如下几种
单缓冲
在设备和处理机之间设置一个缓冲区, 设备和处理机交换数据时, 先把被交换数据写入缓冲区, 然后需要数据的设备或处理机从缓冲区取走数据
记从磁盘把一块数据输入缓冲区的时间为T, 操作系统将该缓冲区中的数据传送到用户区的时间为M, 而CPU对这一块数据处理的时间为C, 则单缓冲区处理每块数据的用时为
m a x ( C , T ) + M max(C,T)+M max(C,T)+M
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPSAoxIg-1677480684226)(…/images/image-20220808104446336.png)]
双缓冲
根据单缓冲的特点, CPU在传送时间M内处于空闲状态, 由此引入双缓冲. I/O设备输入数据时先装填到缓冲区1, 在缓冲区1填满后才开始装填缓冲区2, 与此同时处理机可以从缓冲区1中取出数据放入用户进程处理, 当缓冲区1中的数据处理完后, 若缓冲区2已填满, 则处理机又从缓冲区2中取出数据放入用户进程处理, 而I/O设备又可以装填缓冲区1.
注意, 必须等缓冲区2充满才能让处理机从缓冲区2取出数据. 双缓冲机制提高了处理机和输入设备的并行操作的程序
双缓冲区处理一块数据的用时为
m a x ( C + M , T ) max(C+M, T) max(C+M,T)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zNRPQolN-1677480684226)(…/images/image-20220808104556190.png)]
循环缓冲
缓冲池
由多个系统公用的缓冲区组成, 缓冲区按其使用状况可以形成三个队列, 空缓冲队列, 装满输入数据的缓冲队列(输入队列), 装满输出数据的缓冲队列(输出队列). 还应具有4种缓冲区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKEtPga9-1677480684226)(…/images/image-20220808111128750.png)]
当输入进程需要输入数据
时, 便从空缓冲队列的队首摘下一个空缓冲区, 把它作为收容输入工作缓冲区, 然后把输入数据输入其中, 装满后再将它挂到输入队列队尾. 当计算进程需要输入数据
时, 便从输入队列取得一个缓冲区作为提取输入工作缓冲区, 计算进程从中提取数据, 数据用完后再将它挂到空缓冲队列尾. 当计算进程需要输出数据
时, 便从空缓冲队列的队首取得一个空缓冲区, 作为收容输出工作缓冲区, 当其中装满输出数据后, 再将它挂到输出队列队尾. 当要输出时, 由输出进程从输出队列中取得一个装满输出数据的缓冲区, 作为提取输出工作缓冲区, 当数据提取完后, 再将它挂到空缓冲队列的队尾.
高速缓存与缓冲区的对比
高速缓存 | 缓冲区 | |
---|---|---|
相同点 | 介于高速设备和低速设备之间 | 同左 |
存放数据区别 | 存放的是低速设备上的某些数据的复制数据, 即高速缓存上有的, 低速设备上面必然有 | 存放的是低速设备传递给高速设备的数据(或相反), 而这些数据在低速设备(或高速设备)上却不一定有备份, 这些数据再从缓冲区传送到高速设备(或低速设备) |
目的区别 | 高速缓存存放的是高速设备经常要访问的数据, 若高速设备要访问的数据不在高速缓存中, 则高速设备就需要访问低速设备 | 高速设备和低速设备的通信要经过缓冲区, 高速设备永远不会直接去访问低速设备 |
设备分配概述
独占式使用设备
分时式共享使用设备
以SPOOLing方式使用外部设备
(Simultaneous Peripheral Operation On-Line, 假脱机)
设备分配的数据结构
设备控制表
DCT
一个设备控制表就表征一个设备, 而这个控制表中的表项就是设备的各个属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLbBkIrC-1677480684227)(…/images/image-20220808152727637.png)]
控制器控制表
COCT 和 通道控制表
CHCT
4种I/O控制方式中, 通道方式明显要比其他几种方式更加优越, 因此现代操作系统的I/O控制采用的都是通道控制. 设备控制器控制设备与内存交换数据, 而设备控制器又需要请求通道为它服务, 因此每个COCT必定有一个表项存放指向**相应通道控制表(CHCT)**的指针, 而一个通道可为多个设备控制器服务, 因此CHCT中必定有一个指针, 指向一个表, 这个表上的信息表达的是CHCT提供服务的那几个设备控制器, CHCT与COCT的关系是一对多的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJ0boDMr-1677480684227)(…/images/image-20220808153421787.png)]
系统设备表
SDT
由于在多道程序系统中, 进程数多于资源数, 会引起资源的竞争, 因此要有一套合理的分配原则, 主要考虑的因素有
设备分配的策略
设备分配原则
设备分配方式
静态分配
动态分配
设备分配算法
设备分配的安全性
安全分配方式
不安全分配方式
逻辑设备名到物理设备名的映射
为了缓和CPU的高速性与I/O设备低速性之间的矛盾, 引入了脱机输入/输出技术, 该技术利用专门的外围控制机, 将低速I/O设备上的数据传送到高速磁盘上, 或者相反
SPOOLing的意思是外部设备同时联机操作, 又称假脱机输入/输出操作, 是操作系统中采用的一项将独占设备改造成共享设备的技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UV9ZwaKA-1677480684227)(…/images/image-20220808161105011.png)]
输入井和输出井
输入缓冲区和输出缓冲区
输入进程和输出进程
SPOOLing系统的主要特点
SPOOLing如何节省时间