操作系统
计算机系统概述
操作系统的基本概念
操作系统的特征
-
并发
- 对于单处理机来说,宏观上程序是并发的,微观上程序是交替执行的
- 操作系统的并发是通过分时实现的
- 并行是指系统具有同时运行或操作的特性(硬件支持:多流水线或者多处理机)
-
共享
- 互斥共享方法
- 同时访问方式
-
虚拟
- 时分复用技术:处理器的分时共享
- 空分复用技术:虚拟存储器
-
异步
- 多道程序走走停停,进程以不可预知的速度向前进
操作系统的目标和功能
管理计算机系统资源
- 处理机管理
- 管理处理机的分配与运行,解决冲突问题,可以理解为对进程的管理
- 进程控制、进程同步、进程通信、死锁处理、处理机调度
- 存储器管理
- 内存分配、地址映射、内存保护与共享、内存扩充
- 文件管理
- 文件存储空间的管理、目录管理、文件读写管理和保护
- 设备管理
- 缓冲管理、设备分配、设备处理、虚拟设备
作为用户与计算机之间的接口
- 命令接口
- 联机控制方式:交互式命令接口,适用于分时或者实时系统,就像人与机器对话一样
- 脱机控制方式:又称批处理系统,提交一组作业,系统进行处理,用户不能干预作业的运行
- 程序接口
- 如图形用户界面(GUI)
操作系统发展历程
批处理阶段
单道批处理系统:内存中始终保存一道作业,作业成批进行
多道批处理系统:允许多个程序在CPU中交替运行,程序共享各种硬件和软件资源
分时操作系统
将处理器运行时间划分为时间片,将时间片分配给不同作业/用户从而占用处理机
实时操作系统
保证在规定时间内完成某项任务
分布式计算机系统
网络操作系统将多个计算机有机的结合在一起
操作系统的运行环境
处理器运行模式
两种指令:特权指令;非特权指令
特权指令包括:I/O指令、置中断指令、存取用于内存保护的寄存器指令、送程序字到程序状态字寄存器指令
非特权指令包括:访管指令(实现系统调用)
两种处理状态:核心态(管态);用户态
两种程序:内核程序;应用程序
用户态转向核心态 | 核心态转向用户态 |
---|---|
系统调用 | 中断返回指令 |
发生中断 | |
用户程序中产生了一个错误的状态 | |
用户程序中企图执行一条特权指令 |
内核
- 时钟管理
- 中断机制
- 原语:设备驱动、CPU切换、进程通信中的部分操作
- 系统控制的数据结构及处理:进程管理、存储器管理、设备管理
中断和异常的概念
“中断”是CPU从用户态进入核心态的唯―途径
- 中断(外中断)
- 可屏蔽中断INTR
- I/O中断、时钟中断
- 不可屏蔽中断NMI
- 紧急的硬件故障:内存故障、电源掉电
- 可屏蔽中断INTR
- 异常(内中断)
- 故障:由指令引起的
- 非法操作码、缺页故障、除数为0、运算溢出
- 自陷:实现安排的;用于在用户态调用内核程序
- 条件陷阱指令
- 终止:硬件故障
- 控制器出错、存储器校验错
- 故障:由指令引起的
外中断的处理过程
- 每条指令执行结束后,CPU检查是否有外部中断信号
- 若有外部中断信号,则需要保护被中断进程的CPU环境
- 根据中断信号类型转入相应的中断处理程序
- 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行
中断判优
- 硬件故障中断 高于 软件中断
- 非屏蔽中断 高于 可屏蔽中断
- DMA请求 高于 I/O设备传送的中断请求
- 高速设备 高于 低速设备
- 输入设备 高于 输出设备
- 实时设备 高于 普通设备
系统调用
系统调用发生在用户态,运行在核心态
系统调用分类
- 设备功能、文件管理、进程通信、内存管理、进程控制
操作系统结构
分层法、模块法、宏内核、微内核
操作系统引导
- 激活CPU,开始执行BIOS的执行
- 硬件自检
- 加载带有操作系统的硬盘
- 加载主引导记录MBR
- 扫描硬盘分区表,井加载硬盘活动分区
- 加载分区引导记录PBR
- 加载启动管理其
- 加载操作系统
虚拟机
- 第一类虚拟机管理程序
- 在逻辑上运行并具备多道程序功能
- 虚拟机管理程序向上层提供若干台虚拟机,这些虚拟机是裸机硬件的精确复制品
- 虚拟机上的操作以为自己运行在内核态
- 第二类虚拟机管理程序
- VMware
进程与线程
进程与线程
进程的概念和特征
- 进程的组成
- PCB:进程描述信息(PID UID)、进程控制和管理信息、资源分配清单、处理机相关信息
- PCB是进程存在的唯一标志
- 程序段:存放要执行的程序代码
- 数据段:存放程序运行过程中处理的各种数据
- PCB:进程描述信息(PID UID)、进程控制和管理信息、资源分配清单、处理机相关信息
- 动态性、并发性、独立性、异步性
进程的状态与转换
-
状态
- 运行态、就绪态、阻塞态、创建态、结束态
-
相互转换
- 就绪态—>运行态:处于就绪态的进程获得处理机进入运行态
- 运行态—>就绪态∶处于运行态的进程时间片用完后,让出处理机进入就绪态
- 运行态—>阻塞态:进程请求除处理机外的其他资源,此时运行态进入阻塞态(主动)
- 阻塞态—>就绪态:进程等待其他资源的获得,如IO资源、或者中断结束(被动)
- 创建态—>就绪态:系统完成创建进程相关的工作
- 运行态—>终止态:进程运行结束,或运行过程中遇到不可修复的错误
进程控制
用原语实现
步骤
进程的创建 | 进程的终止 | 进程阻塞 | 进程的唤醒 | 进程的切换 |
---|---|---|---|---|
分配进程标识号,申请PCB | 检索PCB,读取进程状态 | 找到对应的PCB | 找到对应的PCB | 保存处理机上下文,包括PC和其他寄存器 |
为进程分配资源 为程序和数据以及用户栈分配必要的内存空间 | 若进程处于运行态,终止运行,剥夺处理机 | 若进程处于运行态,保护现场,将其状态转换为阻塞态,停止运行 | 将其从等待队列中移出 置其状态为就绪态 | 更新PCB信息 |
初始化PCB | 终止进程之下的子进程 | 将PCB插入相应时间的等待队列 | 将PCB插入就绪队列 | 把进程的PCB移入相应的队列 |
插入就绪队列 | 该进程拥有的全部资源还给父进程或操作系统 | 选择另一个进程执行,更新其PCB | ||
将PCB从所在队列中删除 | 更新内存管理的数据结构 | |||
恢复处理机上下文 |
进程的通信
-
共享存储:通信进程之间存在一块可以被直接访问的共享空间
- 低级方式:基于数据结构共享
- 高级方式:基于存储区共享
-
消息传递:进程通过系统提供的发送消息和接收消息的两个原语进行数据交换
- 直接通信方式:发送进程直接发送消息给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息
- 间接通信方式:发送进程把消息发送给某个中间实体,接收进程从中间实体中获得消息。例如电子邮件系统
-
管道通信:发送进程以字符流形式将大量数据送入写管道,接收进程从管道中接收数据
- 当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走
- 当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
- 半双工通信,不可以同时读和写
线程和多线程模型
线程基本概念
- 目的:减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能
- 引入线程后,进程只作为系统资源的分配单元,线程作为处理机的分配单元
线程与进程的比较
-
调度
- 传统中进程是资源和独立调度的基本单位
- 引入线程后,线程是独立调度的基本单位
-
并发性
- 引入线程后,进程可以并发执行,多个线程之间也可以并发执行,提高了系统的吞吐量
-
拥有资源
-
独立性
- 每个进程都拥有独立的地址空间和资源
- 某进程的线程对其他进程不可见
- 同一进程中的不同线程共享进程的地址空间和资源
-
系统开销
- 对于进程,创建或撤销时,都需要系统为之分配或回收资源,如内存空间、IO设备等;进程切换时,涉及当前进程整个CPU环境的保存,以及新被调度的进程的CPU环境的设置
- 对于线程,切换时只需保存和设置少量寄存器的内容
-
支持多处理机系统
- 对于多线程进程,可将进程中的线程分配到多个处理机运行
-
通信
- 进程间通信需要进程同步和互斥手段的辅助,保证数据的一致
- 线程间通信可以直接读/写进程程序段来进行通信
线程属性
- 线程是一个轻量实体,拥有唯一的标识符和一个进程控制块
- 线程标识符TID、程序计数器PC、其他寄存器(状态寄存器和通用寄存器)、堆栈指针、运行状态、优先级
- 不同的线程可以执行相同的程序
- 同一进程的线程共享该进程拥有的全部资源
- 线程是处理机的独立调度单位
- 线程也有生命周期,阻塞、就绪、运行等状态
线程的实现方式
-
用户级线程:有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在
-
内核级线程:线程的管理工作全部由内核完成
- 内核级线程才是处理机分配的单位
多线程模型
-
多对一
- 线程管理是在用户空间进行的,效率比较高
- 一个线程在访问内核时阻塞,整个进程都会阻塞,多个线程不能并行运行在多处理机上
-
一对一
- 并发能力强
- 创建线程开销大,影响应用程序的性能
-
多对多
处理机调度
调度的概念
见p61图2.7
- 作业调度(高级调度)
- 从辅存中选择作业送入内存,每个作业只调入一次,调出一次
- 外存—>内存(面向作业)
- 中级调度(内存调度)
- 提高内存利用率和系统吞吐量,将暂时不能运行的进程调至外存,使其进入挂起态;或者将已经具备运行条件的进程调入内存,修改其状态为就绪态
- 外存—>内存(面向进程)
- 进程调度(低级调度)
- 按照某种策略或者方法从就绪队列中选取一个进程,分配处理机
- 内存—>CPU
进程的挂起态
- 暂时调到外存等待的进程状态为挂起状态(挂起态):就绪挂起、阻塞挂起
- 与“阻塞”的区别:挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中
调度的性能指标
-
CPU利用率
-
系统吞吐量:单位时间内CPU完成作业的数量,调度算法和方式会对吞吐量造成较大影响
-
周转时间=作业完成时间-作业提交时间
- 平均周转时间=总周转时间/N个作业
-
带权周转时间=作业周转时间/作业实际运行时间
- 平均带权周转时间=总带权周转时间/N个作业
-
等待时间:作业等待处理机的时间,衡量一个算法优劣,只需要简单的考察等待时间
-
响应时间:从用户提交请求到系统首次产生响应所用的时间
调度的实现
1.进程调度的时机
-
不能切换的情况
-
处理中断过程
-
进程在操作系统内核程序临界区的时候
-
其他需要完全屏蔽中断的原子操作过程
- 加锁、解锁、中断现场保护、恢复
-
-
可以切换的情况
-
发生引起调度条件且当前进程无法继续进行
-
中断处理结束或者自陷处理结束
-
2.进程调度的方式
- 非剥夺调度方式
- 剥夺调度方式
典型的调度算法
1.先来先服务算法(FCFS)
- 对长作业有利、对CPU繁忙型作业有利
- 对短作业不利、对IO繁忙型作业不利
- 不会导致饥饿
- 非抢占式算法
2.短作业优先算法(SJF)
- 平均等待时间、平均周转时间最短
- 对长作业不利
- 会导致饥饿
- 非抢占式算法
3.优先级调度算法
调度算法分为剥夺型/非剥夺型
进程优先级分为静态优先级/动态优先级
优先级设置原则:系统进程>用户进程;交互型进程>非交互型进程;I/O进程>计算型进程(CPU繁忙型)
- 会导致饥饿
- 抢占式/非抢占式算法
4.高响应比调度算法
响应比 = 等待时间 + 要求服务时间 要求服务时间 响应比=\frac{等待时间+要求服务时间}{要求服务时间} 响应比=要求服务时间等待时间+要求服务时间
- 等待时间相同情况下,有利于短作业进程
- 等待时间越长响应比越高,实现先来先服务
- 不会导致饥饿
- 非抢占式的算法
5.时间片轮转算法
- 不会导致饥饿
- 抢占式
6.多级反馈队列调度算法
- 终端型作业用户:短作业优先
- 短批处理作业用户∶周转时间较短
- 长批处理作业用户:讲过前面几个队列得到部分执行,不会长期得不到处理
- 不会导致饥饿
- 抢占式
同步与互斥
同步与互斥的基本概念
临界资源
- 访问过程
- 进入区∶检查进程是否可以进入临界区
- 临界区∶可以访问临界资源的代码
- 退出区∶将正在访问临界区的标志清除
- 剩余区︰代码中的其余部分
同步
是一种直接制约关系,为了完成某种过任务而建立的多个进程,相互合作
- 遵循的原则
- 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
- 忙则等待:已有进程进入临界区后,其他试图进入临界区的进程必须等待
- 有限等待:对于请求访问临界区的进程,在有限时间内进入临界区
- 让权等待:进程不能进入临界区的时候,应当立即释放处理机
互斥
是一种间接制约关系,当一个进程访问临界资源的时候,其他进程不能访问
实现临界区互斥的基本方法
软件实现方法
- 单标志法
- 设置
turn
,turn=0
允许P0进入;turn=1
允许P1进入 - 违背空闲让进,造成资源无法充分利用(P0进入后,P1不进,P0就进不了)
- 设置
- 双标志法先检查
- 设置
flag[]
,flag[0]=true
允许P0进入,flag[1]=true
允许P1进入 - 每个进程访问临界区资源前,先检查临界资源是否被访问
while(flag[j])
,如果空闲才能进入flag[i]=true
- 违背忙则等待,两个进程可能同时进入临界区
- 设置
- 双标志法后检查
- 先设置自己标志
flag[i]=true
,表明自己想要进入,再检查对方标志while(flag[j])
,对方要进则等,不进则自己进入 - 双方互相谦让,导致饥饿现象
- 先设置自己标志
- 皮特森算法(Peterson’s Algorithm)
- 先设置自己标志
flag[i]=true
,表明自己想要进入,同时让对方先进turn=j
,再检查临界资源是否被访问while(flag[j]&&turn==j)
- 先设置自己标志
硬件实现方法
- 中断屏蔽法
- 原理:CPU只有在发生中断时引起中断切换
- 关中断;临界区;开中断
- 缺点:限制了处理机交替执行程序的能力
- 硬件指令法
- TestAndSet指令
while TestAndSet(&lock)
- Swap指令
Swap(&lock, &key)
- TestAndSet指令
信号量
-
整形信号量
-
wait(P):资源-1
-
signal(V):资源+1
-
违背让权等待,会导致进程处于“忙等”状态
-
-
记录型信号量
- 再增加一个进程链表L,用于链接所有等待该资源的进程
1.利用信号量实现同步
- 设置同步信号量,初始值为0
- 在“前操作”之后执行V操作
- 在“后操作”之前执行P操作
2.利用信号量实现互斥
- 设置互斥信号量,初值为1(资源数)
- 临界区之前对信号量执行P操作
- 临界区之后对信号量执行V操作
N N N个进程共享某一临界资源时,互斥信号量的取值范围为 − ( N − 1 ) ≤ m u t e x ≤ 1 -(N-1)\leq mutex\leq 1 −(N−1)≤mutex≤1
m u t e x > 0 mutex>0 mutex>0,表示可用资源数量; m u t e x < 0 mutex<0 mutex<0,表示因申请该资源而阻塞的进程数目
死锁
死锁的概念
死锁的定义:多个进程因为竞争资源造成的一种僵局
死锁产生的必要条件
- 互斥条件:进程对分配的资源进行排他性使用
- 不可剥夺条件∶进程获得资源在未使用完之前,不能被其他进程强行夺走
- 请求并保持条件:进程已经保持了至少一个资源,提出新的资源请求,而该资源被其他进程占有,此时该进程被阻塞,但对自己已经获得的资源保持不放
- 循环等待条件
死锁的处理策略
- 死锁预防
- 避免死锁
- 死锁的检测及解除
死锁预防
- 破坏互斥条件
- 破坏不剥夺条件
- 当一个已保持了某些不可剥夺资源的进程请求新的资源而得不到满足时,必须释放已保持的所有资源
- 用于状态易于保存和恢复的数据(CPU的寄存器及内存资源)
- 破坏请求并保存条件
- 一次性申请完所需要的全部资源
- 资源被严重浪费,甚至可能导致进程饥饿
- 破坏循环等待条件
- 采用顺序资源分配法,给资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源一次性申请完
死锁避免
-
系统安全状态:按照某种方式分配资源后,如果会导致死锁,那么就是不安全状态,反之就是安全状态
-
银行家算法
- N e e d = M a x − A l l o c a t i o n Need=Max-Allocation Need=Max−Allocation
死锁的检测及解除
资源分配图
见p140图2.15
死锁定理
- 在资源分配图中找到分配满足的进程,然后消去其请求边与分配边
- 如果最后所有边都可以被消去,则不存在死锁
死锁解除
- 资源剥夺法∶挂起某些死锁进程,抢占资源,将这些资源分配给其他死锁进程,但是要防止挂起时间过长
- 撤销进程法:强制撤销部分甚至全部死锁进程,并且剥夺他们的资源
- 进程回退法:让一个或者多个进程回退到足以回避死锁的地步
内存管理
内存管理概念
内存管理的基本原理和要求
1.程序的装入和链接
步骤:编译;链接;装入
链接的类型
- 静态链接:程序运行之前,将库函数连接成一个完整的可执行程序
- 装入时动态链接:将用户源程序编译后得到目标模块,装入内存时,采用边装入边链接的方式
- 运行时动态链接:对于某些目标模块的链接,程序需要时才会对其链接
装入的方式
- 绝对装入
- 装入时按照实际的内存地址,将程序和数据装入内存
- 可重定位装入(静态重定位)
- 此时采用的是模块与模块的相对地址,然后将程序和数据装入内存
- 地址变换通常是在装入时一次完成的,又被称为静态重定位
- 动态运行时装入(动态重定位)
- 把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,当程序真正执行时才进行转换
2.逻辑地址与物理地址
地址重定位:逻辑地址转换成物理地址的过程
3.进程的内存映像
- 只读代码段
.init
:程序初始化时调用的_init函数.test
:用户程序的机器代码.rodata
:只读数据
- 读写数据段
.data
:已初始化的全局变量和静态变量.bss
:未初始化的、初始化为0的全局变量和静态变量
- 进程控制块PCB
- 堆:存放动态分配的变量。通过调用malloc函数动态地向高地址分配空间
- 栈:实现函数调用。从用户空间的最大地址向低地址空间
连续分配管理方式
1.单一连续分配
- 无须进行内存保护,不会出现越界异常
- 只适用于单用户,单任务的操作系统
- 无外部碎片,采用覆盖技术
- 存在内部碎片,存储器利用率低
2.固定分区分配
- 适用于多道程序的存储,无外部碎片
- 主存利用率低,存在内部碎片
- 不能实现多进程共享一个主存区
3.动态分区分配
- 存在外部碎片
- 采用紧凑技术可以缓解这种缺陷
动态分配算法
- 首次适应算法:从链首顺序查找
- 邻近适应算法:从上次查找结束的位置顺序查找
- 最佳适应算法:按容量递增的次序形成链,找到能满足需求且最小的分配
- 最坏适应算法:按容量递减的次序形成链,找到第一个分配
基本分页存储管理
- 分页管理不会产生外部碎片
1.基本地址变换机构 见p168 图3.9
逻辑地址=页号+页内偏移量
物理地址=物理内存块号+页内偏移量
2.具有快表的地址变换机构
快表命中,一次访存;快表未命中,两次访存
3.两级页表
逻辑地址=一级页号+二级页号+页内偏移量
N N N级页表访问一个逻辑地址需要 N + 1 N+1 N+1次访存
基本分段存储管理
- 按照用户进程中的自然段划分逻辑空间
- 逻辑地址=段号+段内偏移量
- 段表中:段号;段长;本段在主存中的地址
段页式管理
- 作业的地址空间首先被分成若干逻辑段,每段有自己的段号,接着每个段分成若干大小固定的页
- 对内存空间的管理仍然和分页存储管理—样
- 逻辑地址=段号+页号+页内偏移量
- 系统为每个进程建立了一张段表,每个分段有一个页表;一个进程中,段表只能有一个,页表可以有多个
- 访存次数
- 第1次:查段表
- 第2次:查页表
- 第3次:访问目标单元
虚拟内存管理
虚拟内存的基本概念
虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
虚拟内存的实际容量= min(内存和外存容量之和,CPU寻址范围)
1.局部性原理
时间局部性
- 指令执行后,不久后可能被再次执行;数据被访问后,不久后可能被再次访问
- 原因:存在大量的循环操作
空间局部性
- 一旦程序访问了某个存储单元,不久后附近的存储单元也将被访问
- 原因:数据一般也是以向量、数组、表等形式簇聚存储的
2.虚拟内存技术的实现
实现方式:请求分页存储管理;请求分段存储管理;请求段页式存储管理
硬件支持:一定容量的内存和外存;页表机制(或者段表机制);中断机构;地址变换机构
请求分页管理方式
1.页表机制
页表项:
- 页号
- 物理块号
- 状态位:当前页是否已经调入内存
- 访问字段:记录本页在一段时间内被访问的次数
- 修改位:记录本页是否被修改过
- 外存地址:指出该页在外存上的位置(通常是物理块号)
2.缺页中断机构
- 指令执行期间产生中断,而不是指令执行之后产生中断和处理中断
- 一条指令在执行期间,可能产生多次缺页中断
3.地址变换机构
检索快表,找到访问页,修改页表项中的访问位(修改位),利用页表项中给出的物理块号和页内地址形成物理地址
若未找到该页的页表项,去内存中寻找页表,看该页是否已经调入内存,没有调入则产生缺页中断,请求从外存把该页调入内存
页框分配
- 给一个进程分配的物理页框的集合就是这个进程的驻留集
分配策略
固定分配 与 可变分配:区别在于进程运行期间,驻留集大小是否可变
局部置换 与 全局置换:区别在于发生缺页时,是否只能从进程自己的页面中选择一个换出
- 固定分配局部置换
- 进程运行前就分配固定数量物理块,缺页时只能换出进程自己的某一页
- 可变分配全局置换
- 只要缺页就分配新物理块,可能来自空闲物理块,也可能需换出别的进程页面
- 可变分配局部置换
- 缺页率高的进程,多分配一些物理块;缺页率低的进程,回收一些物理块,直到缺页率合适
页面置换算法
最佳置换算法(OPT)
- 选择永不使用或者最长时间内不再访问的页面进行淘汰,但是现实中是无法预知的
先进先出页面置换算法(FIFO)
- 优先淘汰最早进入的页面
- Belady异常:增大分配的物理块数但是故障数不减反增
最近最久未使用置换算法(LRU)
- 选择最近最长时间没有被访问的页面进行淘汰
- LRU是堆栈类算法,需要寄存器和栈的硬件支持,实现复杂
时钟置换算法(CLOCK)
- 简单型:每帧设置一位访问位,首次装入或被访问时,置1;指针指向该页时,若为0,则换出,若为1,则置为0并保留;依次指向下一位
- 改进型:在访问位A的基础上增加修改位M
- 寻找A=0,M=0的一类页面,扫描期间不改变A
- 寻找A=0,M=1的二类页面,扫描期间,扫描过的页面的A都置0
- 返回到开始位置,所有帧的A都置0,重复上述操作
抖动
- 刚换出的页面又要换入内存
- 分配的物理页帧数不足
- 置换算法不当
工作集
- 某段时间内,进程要访问的页面集合
文件管理
文件系统基础
文件的基本概念
结构
- 数据项:最低级的数据组织形式
- 基本数据项:用于描述—个对象的某种属性的一个值
- 组合数据项:由多个基本数据项组成
- 记录:组数据项的集合,用于描述一个对象在某方面的属性
- 文件:创建者所定义的一组相关信息的集合
- 有结构文件:相似的记录组成(记录式文件)
- 无结构文件:字符流组成(流式文件)
文件控制块和索引节点
文件控制块
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项;一个目录也是一个文件
- 基本信息:文件名;文件的物理位置;文件的逻辑结构;文件的物理结构
- 存取控制信息:文件主、核准用户、一般用户的存取权限
- 使用信息:文件建立时间;上次修改时间
文件的操作
文件的基本操作
- 创建文件
- 为新文件分配必要的外存空间
- 在目录中创建条目
- 写文件
- 执行系统调用。系统维护一个写位置的指针,当发生写操作的时候更新写指针
- 读文件
- 执行系统调用。系统维护一个读位置的指针,党发生读操作的时候更新读指针
- 文件重定位(文件寻址)
- 删除文件
- 截断文件
- 允许文件所有属性不变,并删除文件内容,即将其长度设为0并释放其空间
文件的打开与关闭
Open请求
- 首次使用文件,会调用open请求指明文件的属性(包括其物理位置),从外存复制到内存“打开文件表”的一个表目中,并将该表目的编号(索引)返回给用户
- 调用open请求(创建、只读、读写、添加等)得到允许,进程就可以打开文件,open会返回一个指向打开文件表中的一个条目的指针
- 通过使用该指针进行I/O操作,简化步骤并节省资源
文件关联信息
- 文件指针:系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对于打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存
- 文件打开计数:文件关闭时,必须重用其打开文件表条目,否则表内空间会不够用,计数器为0,关闭文件,删除该条目
- 文件磁盘位置:该信息存储在内存,以免每个操作都要从磁盘中读取
- 访问权限∶每个进程打开文件都需要一个访问模式(创建、只读、读写、添加等)
文件保护
- 口令保护:为文件设置一个“口令”,用户想要访问文件时需要提供口令,由系统验证口令是否正确
- 实现开销小,但“口令”一般存放在FCB或索引结点中,因此不太安全
- 加密保护
- 安全性高
- 访问控制:用一个访问控制表(ACL)记录各个用户对文件的访问权限
- 对文件的访问类型可以分为:读/写/执行/添加/删除/列表清单等
- 实现灵活,可以实现复杂的文件保护功能
文件的逻辑结构
- 无结构文件
- 结构文件
- 顺序文件
- 链式存储:只能依次查找
- 顺序存储
- 可变长
- 定长:可随机存取
- 索引文件
- 定长记录文件
- 变长记录文件
- 索引顺序文件
- 直接文件或散列文件
- 顺序文件
文件的物理结构
连续分配
- 实现简单,存取速度快
- 反复增删文件后,会产生外部碎片
链接分配
- 采用离散分配方式,提高了磁盘空间利用率,消除了外部碎片
- 隐式链接
- 磁盘块分布在磁盘的任何地方,除最后一个盘块,其他盘块都有指向下一个盘块的指针
- 增加了内部碎片
- 不能直接访问
- 磁盘块分布在磁盘的任何地方,除最后一个盘块,其他盘块都有指向下一个盘块的指针
- 显式链接
- 把用于链接文件各物理块的指针从每个物理块的末尾提取出来,显示的存放在内存的文件分配表(FAT)中。整个磁盘设置一张
- 显著的提高检索速度,减少了访问磁盘次数
- 把用于链接文件各物理块的指针从每个物理块的末尾提取出来,显示的存放在内存的文件分配表(FAT)中。整个磁盘设置一张
索引分配
- 索引分配解决了链接分配不能直接访问的问题
- m m m级索引要访问外存 m + 1 m+1 m+1次
混合索引分配
- 直接地址
- 一级间接地址
- 二级间接地址
目录
目录结构
- 单级目录结构
- 两级目录结构
- 树形目录结构
- 无环图目录结构
文件共享
基于索引节点的共享方式(硬链接)
- 文件目录中只设置文件名及指向相应索引结点的指针,在索引结点中还有一个链接计数count,用于表示链接到本索引节点上的用户目录项的数目
- 硬链接是多个指针指向一个索引结点,count!=0,索引节点就不能删除
- 查找速度快
利用符号链实现文件共享(软链接)
- B用户共享A用户的文件F时候,系统创建一个LINK类型的新文件,也取名F,然后将文件F写入用户B的目录中,但新文件中只含有被链接文件F的路径名
- 软链接就是把到达共享文件的路径记录下来,当要访问文件时,根据路径寻找文件
- 会增加时间开销并且增加了启动磁盘的频率,同时也会耗费一定的硬盘空间
文件系统
文件系统结构
- 应用程序
- 逻辑文件系统
- 用于管理元数据信息(文件系统的所有结构,除了文件内容)
- 管理目录结构
- 负责文件保护
- 文件组织模块
- 组织文件及其逻辑块和物理块
- 将逻辑地址转化为物理地址
- 基本文件系统
- 向对应的设备驱动程序发送通用命令,以读取和写入磁盘磁盘的物理块
- I/O控制
- 包括设备驱动程序和中断处理程序,在内存和磁盘系统间传输信息
文件系统布局
在磁盘中的结构
MBR——分区表——————————————磁盘分区————————————————
————————引导块——超级块——空闲空间管理——i结点——根目录——文件和目录——
- MBR(主引导记录)
- 位于磁盘的0号扇区
- 当计算机启动时,BIOS读入并执行MBR
- 引导块
- 每个磁盘分区都从一个引导块开始
- MBR执行引导块中的程序后,就启动了该分区中的操作系统
- 超级块
- 包含文件系统的所有关键信息
- 分区的块的数量、块的大小、空闲块的数量和指针、空闲的FCB数量、FCB指针
- 包含文件系统的所有关键信息
- 空闲块的信息
- 使用位示图或指针链接的形式给出
在内存中的结构
- 安装表
- 目录结构的缓存
- 包含最近访问目录的信息
- 包括一个指向分区表的指针
- 整个系统的打开文件表
- 包含每个打开文件的FCB副本,及其他信息
- 每个进程的打开文件表
- 包含一个指向整个系统打开文件表中的适当条目的指针,及其他信息
外存空间空闲管理
在一个文件卷中,文件数据信息的空间(文件区)和FCB的空间(目录区)是分离的
空闲表法
-
属于连续分配方式。
-
系统为空闲区建立一张空闲盘块表,包括每个空闲区第一个盘块号、空闲盘块数等信息
空闲链表法
空闲盘块链:以盘块为单位拉成一条链
空闲盘区链:以空闲盘区为单位拉成一条链
位示图法
-
一般从1开始编号
-
计算盘块的分配与回收
成组链接法
-
UNIX使用
-
把顺序的n个空闲盘块号保存在第一个成组链块中,其最后一个空闲盘块用于保存另一组空闲盘块号,如此继续
输入/输出(I/O)管理
I/O管理概述
I/O设备
设备的分类
按传输速率划分:低速设备(键鼠)、中速设备(激光打印机)、高速设备(磁盘机、光盘机)
按信息交换的单位划分:块设备(磁盘)、字符设备(打印机)
I/O接口:即设备控制器,位于CPU与设备之间
组成
- 设备控制器与CPU的接口
- 数据线,连接数据寄存器与控制/状态寄存器
- 地址线
- 控制线
- 设备控制器与设备接口
- 有一个或多个设备接口,每个接口中都存在数据、控制和状态三种类型的信号
- I/O逻辑
- 用于实现对设备的控制
功能:接收和识别CPU发来的命令、数据交换、标识和报告设备的状态、地址识别、数据缓冲、差错控制
I/O端口:即设备控制器中可被CPU直接访存的寄存器
- 数据寄存器
- 实现CPU和外设之间的设备缓冲
- 状态寄存器
- 控制寄存器
- 由CPU写入
I/O端口的编址方式
- 独立编址
- 需要设置专门的指令来操作控制器
- 统一编址(内存映射I/O)
- 可以采用对内存进行操作的指令来对控制器进行操作
I/O控制方式
程序直接控制方式
- 计算机从外部设备读取的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O设备控制器的数据寄存器中
- CPU高速性和I/O设备的低速性的矛盾(降低了CPU的利用率),CPU和I/O设备只能串行工作
- 读写单位:字
中断驱动方式
- 允许I/O设备主动打断CPU的运行并请求服务,进而解放CPU,使其向I/O控制器发送读命令后可以继续做其他有用的工作
- 数据的传输必须要经过CPU,消耗CPU的时间
- 读写单位:字
DMA方式
-
在I/O设备和内存之间开辟直接的数据交换通路,彻底解放CPU
- 设备直接送入内存
- 只有当一个或多个数据块开始和结束的时候,CPU才会进行干预
-
读写单位∶数据块
-
在DMA中,设置如下4类寄存器
- 命令/状态寄存器(CR):接收CPU发送的I/O命令、有关控制信息、设备状态
- 内存地址寄存器(MAR):在输入时,存放由设备到内存的其实目标地址,在输出时,存放由内存到设备的内存源地址
- 数据寄存器(DR):暂存数据
- 数据计数器(DC):存放本次要传送的字(节)数
通道控制方式
- 设置一个专门负责输入/输出的处理机,实现对一组数块的读写以及相关控制和管理为单位干预
- 分类:字节多路通道(低速)、数组多路通道(中速)、数据选择通道(高速)
- 读写单位:一组数据块
- 与DMA的区别
- DMA需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的
- DMA控制器对应一台设备与内存传递数据,通道可以控制多台设备与内存的数据交换
I/O软件层次结构
- 用户层I/O软件
- 实现与用户交互的接口,用户可以直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作
printf()
- 设备独立性软件
- 用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放,同时为设备管理与数据传送提供必要的存储空间
write()
- 设备独立性也称设备无关性,主要功能有:
- 执行所有设备的公有操作(设备的分配与回收,逻辑设备名映射为物理设备名,对设备进行保护,进制用户直接访问设备),屏蔽设备之间数据交换的速度差异等
- 向用户层(文件层)提供统一接口
- 设备驱动程序
- 与硬件直接相关,负责实现系统对设备发出的操作命令,驱动IO设备工作的驱动程序
- 中断处理程序
- 用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回被中断进程
- 硬件
设备独立性软件
高速缓存与缓冲区
磁盘高速缓存
- 利用内存中的存储空间来暂存从磁盘中读出的一系列盘块的信息
- 磁盘高速缓存,逻辑上属于磁盘,物理上属于驻留在内存中的盘块
缓冲区
- 在关键位置,采用硬件缓冲器
- 采用缓冲区(位于内存区域)
分类
T:数据写入缓冲区的时间
M:缓冲区数据传入用户区的时间(CPU区)
C:CPU处理数据的时间
- 单缓冲
- m a x ( C , T ) + M max(C,T)+M max(C,T)+M
——T—— ——T——
——M——
——C——
- 双缓冲
- m a x ( C + M , T ) max(C+M,T) max(C+M,T)
——T—— ————T————
——M——
——C——
- 循环缓冲
- 缓冲池
- 三队列:空缓冲队列,装满输入数据的缓冲队列,装满输出数据的缓冲队列
- 四缓冲区:收容输入数据的工作缓冲区,提取输入数据的工作缓冲区,收容输出数据的工作缓冲区,提取输出数据的工作缓冲区
- 管道通信中的“管道”其实就是缓冲区。要实现数据的双向传输,必须设置两个管道
设备分配与回收
设备类型分类
- 独占式使用设备:设备只能互斥使用(打印机)
- 分时共享使用设备:通过分时共享来提高设备的利用率
- SPOOLing方式使用设备:用空间换时间,实现了虚拟设备技术,对I/O设备进行批处理
设备分配的数据结构
- 设备控制表(DCT):一个设备控制表就表征一个设备,每个DCT有指向COCT的指针
- 控制器控制表(COCT):每个COCT对应一个DCT,每个COCT有指向CHCT的指针
- 通道控制表(CHCT): 与COCT是一对多的关系
- 系统设备表(SDT):整个系统只有一个SDT,记录已经连接到系统中的所有物理设备的情况
设备分配的策略
分配方式
- 静态:系统一次性的把设备分配给相应作业,直到作业结束
- 没有死锁问题
- 降低了设备使用率
- 动态:进程执行过程中根据执行需要进行分配
- 分配算法不当可能导致死锁
- 独占设备一般使用静态分配,共享设备一般使用动态分配
设备分配的步骤
1.根据进程请求的物理设备名查找SDT;
2.根据SDT找到DCT并分配设备;
3.根据DCT找到COCT并分配控制器;
4.根据COCT找到CHCT并分配通道
逻辑设备名到物理设备名的映射
目的:提高设备分配的灵活性和利用率、实现IO重定向、引入设备独立性
采用两种方式设置逻辑设备表
- 整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复
- 每个用户一张LUT:各个用户的逻辑设备名可重复
SPOOLing技术(假脱机技术)
目的:缓解CPU与I/O的速度差异矛盾
输入井和输出井
- 在磁盘上开辟出的两个存储区域
- 输入井用来收容I/O设备的数据;输出井用来收容用户程序的数据
输入缓冲区和输出缓冲区
- 在内存中开辟的两个缓冲区
- 输入缓冲区用来暂存由输入设备送来的数据,再传送到输入井;输出缓冲区暂存从输出井送来的数据,再传送到输出设备
输入进程和输出进程
- 输入进程:输入机-输入缓冲区-输入井,当CPU需要数据时,直接将输入井中的数据送入内存
- 输出进程:先从内存输入到输出井中,输出井-输出缓冲区-输出设备
磁盘和固态硬盘
磁盘
磁盘地址:柱面号-盘面号-扇区号(块号)
磁盘的管理
磁盘初始化
- 低级格式化∶磁盘分扇区,为每个扇区采用特别的数据结构(头、数据区域、尾部组成),头部含有一些磁盘控制器所使用的信息
- 格式化处理∶磁盘分区,对物理分区进行逻辑格式化(创建文件管理系统),操作系统将初始的文件系统数据结构存储到磁盘上,包括空闲空间、已分配的空间、一个初始为空的目录
引导块
- 计算机启动时运行自举程序,初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统
- 自举程序通常存放在ROM中。通常只在ROM中保留很小的自举块,完整的自举程序保存在启动块上
- 拥有启动分区的磁盘称为启动磁盘或系统磁盘
坏块
- 对于简单的磁盘,坏块可以手动处理,在FAT表上表明,程序不会使用
- 对于复杂的磁盘,控制器维护一个磁盘坏块链表,同时将一些块作为备用,用于替代坏块
磁盘调度算法
寻道时间 T s T_s Ts:将磁头移动到指定磁道所需要的时间(跨越 n n n条磁道+启动振臂 s s s)
T s = m ∗ n + s T_s=m*n+s Ts=m∗n+s
延迟时间 T r T_r Tr:磁头定位到某一磁道扇区所需要的时间(磁盘转速 r r r)
T r = 1 2 r T_r=\frac{1}{2r} Tr=2r1
传输时间 T t T_t Tt:从磁盘读出或向磁盘写入数据经过时间(每次所读写的字节数 b b b、一个磁道上的字节数 N N N)
T t = b r N T_t=\frac{b}{rN} Tt=rNb
- 先来先服务算法(FCFS)
- 最短寻找时间有限算法(SSTF)
- 选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道
- 扫描算法(SCAN)
- 循环扫描算法(C-SCAN)
- LOOK算法
- C-LOOK算法
固态硬盘
- 固态硬盘(SSD)是一种基于闪存技术的存储器
- 以页为单位读写,以块为单位擦除
名可重复
SPOOLing技术(假脱机技术)
目的:缓解CPU与I/O的速度差异矛盾
输入井和输出井
- 在磁盘上开辟出的两个存储区域
- 输入井用来收容I/O设备的数据;输出井用来收容用户程序的数据
输入缓冲区和输出缓冲区
- 在内存中开辟的两个缓冲区
- 输入缓冲区用来暂存由输入设备送来的数据,再传送到输入井;输出缓冲区暂存从输出井送来的数据,再传送到输出设备
输入进程和输出进程
- 输入进程:输入机-输入缓冲区-输入井,当CPU需要数据时,直接将输入井中的数据送入内存
- 输出进程:先从内存输入到输出井中,输出井-输出缓冲区-输出设备
磁盘和固态硬盘
磁盘
磁盘地址:柱面号-盘面号-扇区号(块号)
磁盘的管理
磁盘初始化
- 低级格式化∶磁盘分扇区,为每个扇区采用特别的数据结构(头、数据区域、尾部组成),头部含有一些磁盘控制器所使用的信息
- 格式化处理∶磁盘分区,对物理分区进行逻辑格式化(创建文件管理系统),操作系统将初始的文件系统数据结构存储到磁盘上,包括空闲空间、已分配的空间、一个初始为空的目录
引导块
- 计算机启动时运行自举程序,初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统
- 自举程序通常存放在ROM中。通常只在ROM中保留很小的自举块,完整的自举程序保存在启动块上
- 拥有启动分区的磁盘称为启动磁盘或系统磁盘
坏块
- 对于简单的磁盘,坏块可以手动处理,在FAT表上表明,程序不会使用
- 对于复杂的磁盘,控制器维护一个磁盘坏块链表,同时将一些块作为备用,用于替代坏块
磁盘调度算法
寻道时间 T s T_s Ts:将磁头移动到指定磁道所需要的时间(跨越 n n n条磁道+启动振臂 s s s)
T s = m ∗ n + s T_s=m*n+s Ts=m∗n+s
延迟时间 T r T_r Tr:磁头定位到某一磁道扇区所需要的时间(磁盘转速 r r r)
T r = 1 2 r T_r=\frac{1}{2r} Tr=2r1
传输时间 T t T_t Tt:从磁盘读出或向磁盘写入数据经过时间(每次所读写的字节数 b b b、一个磁道上的字节数 N N N)
T t = b r N T_t=\frac{b}{rN} Tt=rNb
- 先来先服务算法(FCFS)
- 最短寻找时间有限算法(SSTF)
- 选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道
- 扫描算法(SCAN)
- 循环扫描算法(C-SCAN)
- LOOK算法
- C-LOOK算法
固态硬盘
- 固态硬盘(SSD)是一种基于闪存技术的存储器
- 以页为单位读写,以块为单位擦除