2023-12-28-操作系统原理复习1.2万字,全面覆盖
操作系统原理复习(1.2万字,全面覆盖)
第一章、操作系统概述
- 操作系统的特性 : 并发性 ( 同时处理多个任务的能力 ), 共享性 (为多个并发任务提供资源共享), 不确定性 (具有处理随机事件的能力)。
- 操作系统功能 :
- 进程管理 : 处理机分配,处理机管理,CPU管理。具体为进程控制( 创建,暂停,唤醒,撤销 ),进程调度(调度策略,优先级),进程通信(进程间通信)。
- 存储管理/内存管理 : 为应用程序运行分配和管理所需的内存,支持多道程序设计。具体为内存分配,内存共享,内存保护,内存扩充,虚拟内存。
- 设备管理 :设备的分配和回收,设备的驱动机制/传输机制,为应用提供统一接口访问设备,高效存取/设备缓冲机制。
- 文件管理 :为用户提供统一的文件存取接口,高效组织存储空间,提高存取效率,实现信息共享和存取控制。具体为文件用户接口,存储空间管理,文件的操作,目录的操作,存取权限管理。 文件是设备的抽象 。
- 操作系统性能/评价指标 :
- 吞吐率 :在单位时间内处理信息的能力。
- 资源利用率 :设备(CPU)使用的频度。
- 响应能力 :从接受数据到输出结果的时间间隔。
- 可移植性 :改变硬件环境仍能正常工作的能力,即代码修改量。
- 可靠性 :发现、诊断和恢复系统故障的能力。
- 操作系统发展的四个典型阶段 :
- 手工操作系统(40年代-50年代初)
- 单道批处理系统(50年代)
- 多道批处理系统(60年代初)
- 分时操作系统(60年代-至今)
- 详细讲述了单道批处理系统,多道批处理系统和分时操作系统。
- 多道批处理系统和分时系统的比较
- 茶余饭后:
- 操作系统的逻辑结构 (OS的设计和实现思路)
整体式结构 (
单体式结构,宏内核结构):以
模块
为基本单位构建,每个模块具有特定的功能
层次式结构: 功能模块按
调用次序
排若干层,各层
单向
依赖或
单向
调用。
微内核结构(客户/服务器结构):操作系统=微内核+核外服务器
第二章、 操作系统依赖的基础硬件
- 计算机主要部件 :CPU,内设,外设
- 三总线 :地址总线,数据总线,控制总线
- CPU结构 :控制单元,运算单元,寄存器组
- CPU的态 (CPU的工作模式, 对资源和指令使用权限的描述 ):
核态
(Kernel mode):能够访问所有资源和执行指令,管理程序/OS内核
用户态
(User mode,
目态
):仅能访问部分资源,其他资源受限
管态
(Supervisor mode):介于核态和用户态之间
- 操作系统依赖的最基本硬件 :CPU,内存,中断,时钟。
- 存储体系
:寄存器,高速缓存(cashe),主存,磁盘。
- 中断基本概念:
中断定义 : 指CPU对突发的外部事件的反应过程或机制。 CPU收到 外部信号 (中断信号)后,停止当前工作,转去处理该 外部事件 ,处理完毕后回到原来工作的 中断处 (断点)继续原来的工作。
中断源
:引起系统中断的事件
中断类型 :
断点 : 程序中断的地方(将要执行的下一条指令的地址)
现场 : 程序正确运行所依赖的信息集合。(PSW
(
程序状态字
)、相关寄存器、
断点
)
现场的处理
:现场保护(进入
中断服务程序
之前:
CPU→
栈
),现场恢复(退出
中断服务程序
之后:
栈
→CPU)
中断响应过程 :识别中断源–保护断点–保护现场–进入中断服务程序–恢复现场–中断返回
- 基本输入输出系统 ( BIOS )。
- 实模式和保护模式
- 操作系统的启动 :
初始引导 :把 OS内核 装入内存并使之开始工作接管计算机系统,引导程序为MBR(Master Boot Record)
核心初始化 : OS内核初始化系统的核心数据。比如:各种寄存器的初始化,存储系统和页表初始化,核心进程构建。
系统初始化
:为用户使用系统作准备,使系统处于
待命状态
。主要工作:初始化文件系统,初始化网络系统,初始化控制台,初始化图形界面。
- MBR(主启动扇区) ,
- 存放引导代码。
- 占用512个字节(510字节+AA55h),最后两个字节是MBR结束标志。
- 提供BootLoader或启动管理。
- PBR :分区/次引导记录
- Linux操作系统的生成 :获取内核源码–配置内核–重新编译新内核–编译和安装模块–配置启动选项
第三章、用户界面
用户界面定义 : 操作系统提供给用户控制计算机的机制
(用户接口)
用户界面类型 :操作界面和系统调用 (System Call,系统功能调用,
程序界面
)
操作界面 :分为图形用户接口,操作命令,批处理与脚本程序
批处理与脚本程序 : 在控制台环境下自动处理一批
命令。
Windows:批处理程序(bat/PowerShell)。Linux:Shell脚本程序。
Bash主要功能之 重定向: 主要是标准输入/输出的重定向,在linux虚拟机上实践一下会好很多
Bash主要功能之 管道:
在虚拟机里实践一下
因为这个学期第一次os实验有4个,第二次os实验有7个
系统调用
(
System Call,System Service Call): 操作系统
内核
为应用程序提供的
服务/函数
。 特点:内核实现,存取核心资源或硬件,调用过程产生中断
第四章、进程管理
进程定义 : 进程是程序在某个
数据集合
上的
一次
运行
活动
。
进程是系统中 共享CPU的最小的并发单位 ,是 资源分配的基本单位。
进程的特征 :
动态性:进程是程序的一次执行过程,动态产生/消亡
并发性: 进程可以同其他进程一起向前推进
异步性:
进程按各自速度向前推进
独立性:进程是系统分配资源和调度CPU的单位
- 进程与程序的区别 :
- 动态与静态。 进程是动态的:程序的一次执行过程;程序是静态的:一组指令的有序集合
- 暂存与长存。进程是暂存的:在内存驻留。程序是长存的:在介质上长期保存。
- 程序和进程的对应。一个程序可能有多个进程。
- 进程的状态 :
运行状态(Running)。进程已经占有CPU,在CPU上运行。
就绪状态 (Ready)。具备运行条件但由于无CPU,暂时不能运行
阻塞状态(Block)。 因为等待某项
服务
完成或
信号
来到而不能运行的状态。例如等待:系统调用,I/O操作,合作进程的服务或信号…
- Linux进程状态 :可运行,睡眠,僵死,暂停。
进程控制块
(Process Control Block,PCB) : 描述进程的状态、资源、和相关进程的关系。
PCB是进程的标志,创建进程时创建PCB,进程撤销后PCB同时撤销。
- task_struct
:Linux 内核中表示进程和线程的关键数据结构,包含了各种信息,如状态、调度信息、文件描述符等。
- 进程控制 :在进程生存期间,对其全部行为的控制。有以下四个典型的进程控制。
进程创建: 创建一个具有指定标识(ID)的进程。
进程撤销: 撤销一个指定的进程,收回进程所占有的资源,撤销该进程的
PCB。 进程撤销的时机/事件:正常结束,异常结束,外界干预。
进程阻塞: 停止进程执行,变为阻塞。 阻塞进程的时机/事件:请求系统服务,启动某种操作,新数据尚未到达,无新工作可做。
进程唤醒: 唤醒处于阻塞队列当中的某个进程。引起唤醒的时机/事件:系统服务由不满足到满足,I/O完成,新数据到达,提出新请求。
- 原语 : 由若干指令构成的具有特定功能的函数。具有原子性,其操作不可分割。
- Linux进程控制 :
- 创建进程–fork()
关于fork的返回值:pid = 0(在子进程中),pid>0(在父进程中,为子进程id),pid= -1(出错)
在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。可以通过fork返回的值来判断当前进程是子进程还是父进程。
exec函数族:
功能:在子进程空间运行指定的“
可执行程序
”
步骤:根据
文件名
找到相应的
可执行程序,
可执行程序的内容填入子进程的地址空间。
返回:exec调用成功:进入新进程且不再返回。exec调用失败:继续从调用点向下执行。
进程的阻塞–wait(int &status)函数
进程的终结–exit(int &status)函数
进程的休眠–sleep(int nSecond)
线程的定义 :线程是进程内创建的 可运行模块
/
指令 序列,能执行 指定的任务 。
进程内可以定义多个线程,线程和进程可以并发运行。
线程是 CPU调度和派发的基本单位。
- 线程的意义 :
线程提高了系统的并发性能。线程的并发粒度比进程更细,更充分地发挥
CPU
的性能。
线程的应用成本更低,更灵活 。进程为
线程
提供
资源
和
地址空间
。线程的创建,撤销和管理
成本更低;
线程间通信
更容易,更灵活。
大多数操作系统都采用了线程技术。Windows/Linux/
鸿蒙
/
麒麟
/…
- 创建线程–CreateThread(TaskFunction)
函数
- 线程的应用场景 :
多个功能需要并发的地方
需要改善窗口交互性的地方
需要改善程序结构的地方
多核
CPU
上的应用,充分发挥多核性能
- 现代操作系统线程模型:
进程
=
资源集 + 线程组:
线程的状态变迁:
- Linux线程和分类
- 内核线程/Kernel Thread
- 用户线程/User Thread
- 进程VS线程
- 进程互斥的定义: 多哥进程共享具有独占性的资源时,必须确保各进程互斥地存取资源,即确保没有任何两个进程同时存取资源。进程内设定特定区域,所有进程互斥地访问这些区域。
- 临界资源 :一次只允许一个进程独占访问(使用)的资源。比如上面的共享变量i
- 临界区: 进程中访问临界资源的程序段。
- 进程的同步关系:
‘’‘’
- 临界区和临界资源的共享特点 : 临界资源的访问具有排他性,并发进程不能同时进入“临界区”
- 访问临界区的方法:
- 硬件方法:
- 软件方法:锁机制和信号量机制。
- 临界区访问的四个原则 :
- 空闲让进 :当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立刻进入自己的临界区,以有效利用临界资源。
- 忙则等待 :当已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待 :对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入”死等“状态。
- 让权等待 :当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入”忙等“状态。
- 信号灯机制 :
P操作( 荷兰语:
P
asseren
通过 )原理:
V操作(荷兰语: V
rijgeven
释放 )
- Windows同步机制:
第五章、 资源分配与调度( 死锁 )
死锁的定义 : 两个或多个进程
无限期地
等待永远不会发生的条件的一种系统
状态。
每个进程都永远阻塞。
死锁的另一个定义 : 在两个或多个进程中,
每个
进程都
已持有
某种资源,但又
继续申请
其它进程
已持有的某种资源
。
死锁的起因 :
- 系统资源有限。资源数目不足以满足所有进程的需要,引起进程对资源的竞争而产生死锁。
- 并发进程的推进顺序不当。进程在运行过程中,请求和释放资源的顺序不当,导致进程产生死锁。
- 关于死锁的一些结论 :
- 陷入死锁的进程至少是2个(反证:若仅有一个进程死锁)
- 参与死锁的进程至少有2个已经占有资源。
- 参与死锁的所有进程都在等待资源
- 参与死锁的进程是当前系统中所有进程的子集
- 死锁会浪费大量系统资源,甚至导致系统崩溃。
- 死锁的必要条件 :
互斥条件: 资源具有独占性,进程
互斥
使用资源。
不剥夺条件: 资源被访问完之前
(
即在
释放
前
)
不能被其他进程
剥夺
。
部分分配条件: 进程所需资源逐步分配,需要时临时申请(
等待分配
)。
环路条件: 多个进程构成环路:环中 每个进程
已占用的资源 被 前一进 程申请,而自己所需 新资源 又被环中 后一进程 所占用。对于哲学家就餐问题来说,限定最多四个人同时吃饭,就是破坏环路条件。
- 解决死锁的策略 :
预防死锁:通过设置某些限制条件,破坏死锁四个必要条件中的一个或多个,来防止死锁。
避免死锁: 在资源的分配过程中,用某种方法分析该次分配是否可能导致死锁?若会则不分配;若不会就分配。
检测和恢复死锁: 允许死锁发生,但可通过
检测机制
及时检测出死锁状态,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁
清除
,将进程从死锁状态解脱出来。
预先静态分配法: 进程运行前将所需全部资源
一次性
分配给它。因此进程在运行过程中不再提出资源请求,从而避免出现阻塞或者死锁。破坏了
部分分配条件
。
有序资源分配法:
第六章、 处理机调度(进程调度)
调度定义: 在队列中按
某种策略
选择
最合适的
对象(执行相应操作)
讲的非常详细。
调度分类 :
长程调度(宏观调度
/
作业调度)。作业:磁盘–>内存。
中程调度(交换调度)。进程:就绪(内存)–>交换空间。
短程调度(进程调度)。进程:就绪(内存)–>CPU。
I/O调度(设备调度)。进程:阻塞(设备)–>就绪。
- 进程调度的目标(两个量化的衡量指标):
周转时间
/
平均周转时间
带权周转时间
/
平均带权周转时间
先来先服务调度
(First Come First Serve):按照作业进入系统的时间先后次序来挑选作业。先进入系统的作业优先被运行。
特点:只考虑作业
等候时间
,不考虑
作业大小(
运行时间)
。晚来的作业会等待较长时间,
不利于晚来但是很短的作业。
短作业优先调度算法
(
Short Job First):参考
运行时间
,选取
时间最短
的作业投入运行。
特点:忽视了作业等待时间,早来的长作业会长时间等待(资源“饥饿”)。
响应比高者优先调度算法
:调度作业时计算
作业列表
中每个作业的
响应比
,选择
响应比最高的作业
优先投入运行。
特点:
响应比
= 1 +
等待时间
/
运行时间,
有利于短作业,有利于等候已久的作业,兼顾长作业。每次调度时重新计算和比较剩余作业的响应比。
优先数调度算法
:
根据进程优先数,把
CPU
分配给最高的进程。
进程优先数
=
静态优先数
动态优先数。
静态优先数: 进程创建时确定,在整个进程运行期间不再改变。
动态优先数:动态优先数在进程运行期间可以改变。
循环轮转调度法
(ROUND-ROBIN): 把所有就绪进程按 先进先出 的原则排成队列。 新来
进程 加到队列 末尾 。进程以 时间片 q为单位轮流使用CPU。刚刚运行了一个 时间片 的进程排到队列 末尾 ,等候下一轮调度。 队列逻辑上是环形的。
调度方式:
当一进程正在
CPU
上运行时,若有
更高优先级的进程
进入
就绪
,系统如何对待新进程(分配
CPU
)?
非抢占方式:让正在运行的进程
继续运行
,直到该进程完成或发生某事件而进入“完成”或“阻塞”状态时,才把CPU
分配给新来的更高优先级的进程。
抢占方式: 让正在运行的进程
立即暂停
,立即把
CPU分配给新来的优先级更高的进程。
二者对比:
- Linux进程优先级
task_struct-> counter : 进程在
当前一轮调度
中还能连续运行的时间片数量。counter越大,优先级越高,可获得越多CPU时间
新一轮调度开始时:counter = priority
时钟中断服务程序:counter - -
特定情形:counter = counter
- △
所有进程的counter都减到0后:重新开始新一轮调度
task_struct->rt_priority:
实时进程特有的优先级: rt_priority+1000
task_struct->policy:
进程的调度策略,用来区分实时进程和普通进程SCHED_OTHER(
0
)
||
SCHED_FIFO(
1
)
||
SCHED_RR(
2
)
schedule( )函数: 在
可运行队列中
查找
最高优先数进程并把
CPU
切换
给它。
第七章、主存管理
存储器功能需求 : 容量足够大,速度足够快,信息永久保存
三级存储体系 :内存–辅存–cache 。用辅存支援内存,提高容量。用cache支援内存,提升效率。
地址映射 (地址重定位,地址重映射):把程序中的地址
(
虚拟地址
,
虚地址
,
逻辑地址
,
相对地址
)
变换成真实的内存地址
(实地址
,
物理地址
,
绝对地址
)
的过程。
固定地址映射 : 编程或编译时
确定逻辑地址和物理地址映射关系。
特点:程序加载时必须加载到指定的内存区域。容易产生地址冲突,运行失败。
不能适应多道程序环境
静态地址映射 :程序 装入时 由操作系统完成逻辑地址到物理地址的映射。保证程序在 运行之前
所有地址都绑定到主存。
映射方式:物理地址(MA)= 装入地址(BA)+ 虚拟地址(VA)
特点: 程序运行之前确定映射关系。程序占用
连续的
内存空间。程序装入后
不能移动,
如果移动必须放回原来位置。
动态地址映射 :在程序
执行过程中
把逻辑地址转换为物理地址。
映射方式:物理地址
MA =
装入基址
BA +
虚拟地址
VA
装入基址:基址寄存器
BAR
实现动态地址映射的思路:
特点: 程序占用的内存空间可动态变化(若程序移动及时更新
基址
BA
)
程序不要求占用连续的内存空间(需要记录每段放置的
基址
BA
)
便于多个进程共享代码(共享代码作为
独立的一段
存放)
缺点: 硬件支持(
MMU
:内存管理单元)。软件复杂。
存储扩充:
借助辅存在逻辑上扩充内存,解决内存不足
存储保护 : 保证内存中的多道程序只能在给定区域活动,并且互不干扰。防止访问越界,防止访问越权。
单一存储管理 :用户区
不分区
,完全被一个程序占用。
分区存储管理 : 把
用户区
分为
若干
大小不等的
分区
,供不同程序使用。
有
固定分区
(系统初始化时分区)和
动态分区
(程序装入时临时分区)两种。
- 固定分区 :
特点:运行时分区的
大小
和
位置
不变,分区大小不同,适应不同程序需求。
缺点: 浪费内存,大程序可能无法运行,程序过多无法运行。
因此 程序的
装入数量和顺序要与
分区的数量、大小顺序尽量保持一致。
动态分区:
分区的选择(放置策略)
空闲区表: 描述内存
空闲区
的位置和大小的数据结构
首次适应法 :
空闲区表
按
首址递增
排序,尽可能先利用
低地址空间
最佳适应法 : 空闲区表
按
大小递增
排序,尽量先选中满足要求的
最小
空闲区
最坏适应法 : 空闲区表
按
大小递减
排序,尽量先使用
最大的
空闲区,仅作
一次查找
就可找到所要分区。
- 碎片问题
:
- 覆盖技术(overlay)
目的: 在
较小
的内存空间中运行
较大
的程序
覆盖的缺点:编程复杂(程序员划分程序模块并确定关系),程序执行时间长(从外存装入内存耗时)
- 对换技术(Swapping)
原理: 内存不够时把进程写到磁盘(
换出
/
Swap Out
)。
当进程要运行时重新写回内存(
换入
/
Swap In
)。
优点: 增加进程并发数;不考虑程序结构。
缺点: 换入和换出增加
CPU开销;对换单位太大(整个进程)
需要考虑的问题:程序换入时的地址重定位,减少对换传送的信息量,外存对换空间的管理方法
采用交换技术的OS:UNIX,Linux,Windows
- 页式内存管理,不罗列了,ppt没讲清,不如看
关键摘要:
地址映射 : 虚拟地址(页式地址)
→
物理地址
页表的建立:
缺页中断 : 当程序要访问的
目标页面
不在内存时,程序将被迫
临时中断。
缺页中断的处理:
立即将所缺
页面
装入内存。页面从
硬盘
拷贝到内存,其中的I/O操作耗时较长。
因此,缺页中断降低了程序实时性。
修改位即所谓的“ 脏位 ”。
访问指令的执行过程:
缺页(中断)率f =
缺页次数
/
访问页面总次数
命中率 = 1 - f
页面抖动 : 页面在内存和辅存间频繁交换的现象。“抖动”会导致系统效率下降。
淘汰策略 :
一个好的淘汰策略, 页面抖动较少,具有较低的缺页率(高命中率)
- 最佳算法(OPT算法,Optimal): 淘汰
不再需要
或
最远将来
才会用到的页面。
特点:理论上最佳,实践中该算法
无法实现
。
- 先进先出淘汰算法(FIFO算法):淘汰在内存中
停留时间最长
的页面
优点: 实现简单:页面按进入内存的时间排序,淘汰队头页面。同时,进程按
顺序访问
地址空间时
抖动较少,缺页率较低
。
异常现象:对于一些特定的访问序列,分配页框越多,缺页率越高!
- 最久未使用淘汰算法(LRU,Least Recently Used): 淘汰
最长时间未被使用
的页面。
- 最不经常使用算法(LFU,Least Frequently Used): 选择到当前时间为止
被访问次数最少
的页面, 每页设置 访问计数器 ,每当页面被访问时,该页面的访问计数器加1; 发生缺页中断时,淘汰计数值最小的页面
,并将所有计数清零。
实现方式 : 对每个⻚⾯设置⼀个访问计数器,每当⼀个⻚⾯被访问时,该⻚⾯的访问计数器就 累加 1。在发⽣缺⻚中断时,淘汰计数器值最⼩的那个⻚⾯
- 影响缺页次数的因素:
- 淘汰算法
- 分配给进程的页框数:页框越少,越容易缺页
- 页本身的大小:页面越小,越容易缺页
- 程序的编制方法:程序的局部性
页面的大小选择:
快表机制(cache,联想存储器,TLB)
特点: 快表是普通页表(慢表)的
部分内容
的
复制
地址映射时
优先
访问快表,若在快表中找到所需数据,则称为“
命中
” 没有命中时,需要访问慢表,同时
更新
快表
合理的页面调度策略能使快表具有
较高
命中率
- 二级页表 ,ppt讲的不够好,看
关键摘要:
段式存储管理 :把进程按 逻辑意义 划分为多个 段 ,每段有 段名 ,长度不定。进程由 多段 组成
段表 (SMT,Segment Memory Table):记录每段在内存中映射的位置
段式系统的虚拟地址 : 段式虚拟地址
VA
包含
段号
S
和
段内偏移W
段式地址映射过程:
逻辑地址
VA
分离出
(
S
,
W
);
以
S为索引查询段表,检索段号
S
,查询该段
基地址
B
和
长度
L
。
物理地址MA = B + W
段式管理与页式管理的对比 :
段页式存储管理: 在段式存储管理中结合页式存储管理技术
段页式地址 : 段号
S
、页号
P
和页内位移
W
段页式地址的映射机构: 同时采用
段表
和
页表
实现地址映射
系统为每个进程建立一个
段表
, 每个段建立一个
页表
;
段表给出每段的
页表基地址
及
页表长度
,
页表给出段内每页对应的
页框
。
- 实模式阶段: 计算机加电前一段时间处于实模式。
- 实模式内存空间: 20位物理地址,1MB内存空间。分段机制:段地址(16位) :偏移地址(16位)
第八章、设备管理(输入/输出管理)
- 设备类型和特征
按交互对象分类
人机交互:显示设备、键盘、鼠标、打印机
与
CPU
交互:磁盘、磁带、传感器、控制器
计算机间交互:网卡、调制解调器
按交互方向分类
输入设备:键盘、扫描仪
输出设备:显示设备、打印机
双向设备:输入
/
输出:硬盘、软盘、网卡
按外设特性分类
使用特征:存储设备、输入设备、输出设备
数据传输率:低速
(
键盘
)
、中速
(
打印机
)
、高速
(
网卡、磁盘
)
按信息组织特征分类
字符设备:传输的基本单位是
字符
。例:键盘、串口
块设备: 传输的基本单位是
块
。例:硬盘,磁盘
网络设备:采用
socket套接字接口访问,在全局空间有唯一名字,如
eth0
、
eth1
- 设备管理功能
状态追踪:记录设备的基本属性
设备分配: 按一定策略安全地分配和管理各种设备。
设备映射: 逻辑设备到物理设备的转换(逻辑名到物理名的转换)
I/O缓冲区管理: 开辟和管理
I/O
缓冲区,提高读写效率。
设备驱动:对物理设备进行I/O操作, 把应用对设备的读/写请求转换为对设备I/O操作。
- 缓冲技术作用
连接不同数据传输速度的设备
。如CPU(设备驱动)与设备(控制器)之间传输数据,
改进:内存中增加缓冲区
协调数据记录大小的不一致。
进程之间
或
CPU与设备之间
的数据记录大小不一致
正确执行应用程序的语义拷贝。
- Linux缓冲机制应用:
提前读:进程读时,其所需数据已被
提前读
到了
缓冲区
中,不需要启动外设去执行读操作。
延后写:进程写时,数据先存在缓冲区,等到
特定事件发生
或
足够时间
后(
已延迟
),再启动外设完成写入。
- 缓冲的组成 :
Cache: 高速缓冲寄存器
【
CPU ↔
内存】
设备内部缓冲区:外设或
I/O
接口的内部缓冲区
【端口】
内存缓冲区:应用广泛,
使用灵活
【
CPU ↔
接口
/外设】,
应用开辟
|
内核开辟
辅存缓冲区:
开辟在辅存上
【 暂存内存数据,
SWAP
】
- 缓冲的实现
单缓冲:缓冲区仅有1个单元
双缓冲:缓冲区有2个单元
环形缓冲: 在双缓冲的基础上增加了更多的单元,并让首尾两个单元在逻辑上相连。
缓冲池: 多个缓冲区,可供若干个进程共享,可以支持输入,也可以支持输出,
提高缓冲区利用率,减少内存浪费
设备文件: 硬件设备作为
文件
看待,使用
文件操作接口
来完成设备的打开、关闭、读写和
I/O控制等操作。仅字符设备和块设备通过
设备文件
访问,创建设备文件:
mknod。
主设备号:
标识该设备种类,标识驱动程序主,设备号的范围:
1-255,
Linux
内核支持
动态分配主设备号
次设备号 :
标识同一设备驱动程序的不同硬件设备
设备分类:
独占设备: 不可抢占设备
(普通外设或资源),
使用时
独占
,
释放后
才能被其它进程申请到。先申请,后使用
(主动)
共享设备: 可抢占设备
(
CPU,内存,硬盘),
允许多个作业或进程
同时
使用。不申请,直接用
(被动
主动) 3. 虚拟设备: 借助虚拟技术,在共享设备上模拟独占设备。
- 设备分配方法 :
独享分配: 针对独占设备。
共享分配:针对共享设备, 典型共享设备:硬盘。
虚拟分配:
虚拟技术: 在一类物理设备上模拟另一类物理设备的技术,通常借助
辅存部分区域
模拟独占设备,将独占设备转化为共享设备。
虚拟设备: 用来模拟独占设备的
辅存区域
称为
虚拟设备,
具有独占设备的逻辑特点
输入井: 模拟输入设备的辅存区域
输出井:模拟输出设备的辅存区域
SPOOLing
系统:
预输入程序: 控制信息从独占设备输入到辅存,模拟脱机输入的卫星机。
输入表: 独占设备
↔
虚拟设备
缓输出程序: 控制信息从辅存输出到独占设备,模拟脱机输出的卫星机;
输出表: 独占设备
↔
虚拟设备
井管理程序: 控制用户程序和辅存之间的信息交换
第九章、文件系统
文件 :文件是计算机系统存放信息的一种形式,由若干信息项有序构成。文件具有唯一的文件名,用户 通过
读写指针
来存取文件的信息项。
文件分类:
- 按文件的用途:系统文件,库文件,用户文件。
- 按文件的操作权限:只读文件,只写文件,可执行文件,可读可写文件,不保护文件
- 按文件的存储时间:临时文件,永久文件
- 文件系统 :管理文件的机构。
实现文件的创建、撤消、读写、修改、复制和存取控制等,方便用户以
文件名
存取文件
管理文件
存储设备
的空间和存取。高效利用存储空间和高效存取文件
- 文件的逻辑结构 :
记录式文件:信息项是
记录
,记录包含若干成员。例如:学生花名册
.txt,记录姓名,学号,性别,成绩。
特点: 文件头部保存
记录长
和
记录数
信息,浪费存储空间
分类:定长记录文件,不定长文件
- 流式文件:信息项是字节
特点: 文件长度就是字节的数量,文件无需额外说明信息或控制信息
- 文件的存取方法 :
顺序存取: 按从前到后的顺序
依次
对文件
信息项
进行读
/写,直到定位到目标信息项为止。
随机存取
/直接访问:直接
定位
到文件目标信息项进行读
/写。适合
流式文件
或
定长记录文件
。
文件的物理结构: 文件在存储设备上的存储结构,
强调合理利用储存空间,缩短I/O时间
连续文件: 指文件存放在
连续的存储块
中。文件的存储块顺序与逻辑块顺序一致且连续。
文件目录记录
文件长度
(
块数
)
和
首个存储块号
特点: 文件建立时给出文件
最大长度
和
文件起始位置
。支持顺序存取和随机存取。其中顺序存取速度快
(
寻道次数和寻道时间最少
)
缺点:文件不易动态增长,预留空间容易造成浪费,造成外部碎片问题
- 串联文件:存放在
离散的存储块
中,每个存储块包含一个
链接指针
记录下一个存储块位置。文件目录记录文件
首个存储块号
特点:串联文件可以显著消除存储碎片,创建文件时无需知道文件长度,文件动态增长时可动态分配存储块, 支持文件增、删、改等操作。
缺点: 随机访问效率极低
(仅适合顺序访问方式),并且如果某个
链接指针损坏
,文件后面将无法访问。
FAT文件系统:
- 索引文件:文件存放在不连续的存储块中,系统建立 索引表
记录文件
逻辑块
和
存储块
的对应关系。
索引文件 = 索引表 + 数据区
特点: 读取索引文件时应先读取
索引表,
索引表本身占据额外的存储区域
/缺点,
支持顺序和随机存取,支持文件动态增长、插入、删除等。实例:
ext
系列文件系统
(
inode
索引节点文件
)
- 磁盘空闲存储块管理方法:
- 空闲文件目录:
空闲文件: 连续的空闲存储块
组成的特殊文件。存储设备上所有的空闲文件就代表了存储设备上的全部空闲空间。
空闲文件目录:为所有空闲文件建立的目录,记录空闲文件的首块号和存储块数
(
或其他方式
)
- 空闲块链: 把所有空闲存储块用
链表
链接在一起。
当
申请
空闲块时,从链表
头部
摘取空闲块。
当
回收
存储块时,把空闲块加在链表
尾部。
- 位示图: 一块特殊内存区域,
每一位
(bit)
对应一个
存储块
,值1
表示存储块
空闲
,
0
表示
已占用。
- 文件目录:
文件目录功能: 实现“
按名存取
” :系统根据文件名能找到指定文件。文件目录记录文件的
文件名
、
存放地址
以及
属性。
目录文件:
目录文件是文件目录的实现,由
文件目录项
构成
文件目录项 (
directory entry):描述文件基本信息、使用信息和存取控制信息等。
基本信息:文件名、存储位置
(
存储块号
)
等
使用信息:属性、大小、建立时间、修改时间等
存取控制信息:文件存取权限
- 目录结构 :
- 单机目录: 最简单的目录结构,全部文件都登记在同一目录中。
特点:简单、易于理解和实现
缺点:查找速度慢,不允许重名,不便于文件共享
- 二级目录: 第一级称为主目录
(MFD)
,第二级称为子目录或用户目
(UFD)。每个用户有一个子目录
(
用户目录
)
优点:解决文件重名的问题,不同用户可以使用相同的名字
- 树形目录: 多级目录结构,二级目录结构的扩充,目录结构如同倒置的树,树根是主目录
(根目录),枝结点是子目录,树叶描述文件。
文件全名 : 从根目录到文件为止整个通路上所有目录、子目录和文件的名字用
”/”
顺序连接构成的字符串称为
文件全名。
路径名 :文件全名中由目录和子目录组成的部分。每个文件都有唯一的路径名
绝对路径名: 从
根目录
直到文件的路径
相对路径名:从
指定目录
到文件的路径
文件属性: 指定文件的类型、操作特性和存取保护等信息,一般存放在文件的(
目录 /文件
)中。比如 MS-DOS的文件目录项, 文件属性
(特指读 写/隐藏等属性)占1个字节
其他资料:
68747470:733a2f2f626c6f672e6373646e2e6e65742f6b6a6e7364672f:61727469636c652f64657461696c732f313335323134363430