启蒙篇
文件的由来
- 磁盘上保存的是一对十六进制的数据,如何切分数据形成不同的文件,也就是如何确定一个文件的起始和终止位置?
- 将相关数据打包在一起形成一个文件,比如从什么位置开始到什么位置结束,是一张图片、一段文字、一个视频
- 还需要为每一个打包文件配置一个 FCB,类似PCB
- FCB保存在磁盘,记录文件的名字、文件的起始位置、文件的终止位置等信息
- 通过文件的名字 匹配 FCB中符合的文件,通过名字作为检索,查询文件的相关信息,比如文件的存储位置
目录的由来
- 每个文件 都有 与之对应的FCB
- 将FCB的集合重新打包成一个文件,形成目录文件(其他文件的档案袋),其他文件叫做普通文件,比如 图片、视频、文档
- 操作系统启动的时候,将目录文件读取到内存,就可以使用户看到文件结构
文件管理逻辑图
- 文件系统由文件和目录两个部分组成
- 文件:逻辑结构 数据怎么组织?如何打包?
- 目录:物理结构 组织好的数据如何保存?
- 数据 打包 形成文件
- FCB 打包 形成目录
- 物理结构:组织好的数据如何存储?
闲聊文件系统
- 操作系统、文件系统和存储器都有很多类型
- 通常讲win、linux具有那种文件系统的方法和原理
- 操作系统:unix 、 linux 、 windows 、 android 、 ios 、macos
- 文件系统:ext 、NTFS(win) 、APFS(MAC)、 FAT 、YFFS、JFFS
- 存储器:硬盘类 、光盘类 、磁带类、flash类 (固态硬盘、U盘、云盘)
- 文件系统的基本构成 = 文件 + 目录;使得磁盘数据保存、管理、搜索更加便捷化和人性化
基础篇
文件的逻辑结构和物理结构
- 逻辑结构:文件是由不同的十六进制数据组成的,每个数据都有指定的位置,如果数据的位置打乱了,就不可以表示先前的数据,文件就没有意义。比如删除文件的一部分,使文件损坏。
- 物理结构:将磁盘进行切割,分成很多块,每一块散列存储在磁盘
- 使用的时候,将物理结构按照逻辑顺序拼接在一起就形成了正确的逻辑结构,就可以还原原本的文件
文件系统的逻辑结构(数据是如何组织起来的)
文件的逻辑结构
- 有结构文件:记录式文件:格式多样化(描述信息,比如位置信息等等)、内容多样化(字体的颜色大小)、便于搜索查询
- 有结构文件 比如excel,即使只记录一个字母,但是需要记录大量的相关信息,因此文件会很大
- 无结构文件:流式文件 ,比如txt,仅仅可以按照顺序简单记录每一个字符;
- *并不是所有文件的所有内容都是可视化的
- 流式文件特征:1,简单顺序,以字节为单位记录每一个数据;2,由于没有结构,搜索的时候只可以穷举搜索,适用性很差;3,适用于对基本信息单位操作(修改操作)不多的文件,比如源代码、目标代码文件、图片
有结构文件的数据组织:
- 1,数据项:最低级的数据组织形式,文件的细胞,每个的数据项的长度不一样。数据项是最小单元,word的数据单元是单个字,excel的数据单元是单个表格
- 2,记录:一组有意义的数据项的组合,关键字,唯一标识一个记录,每个记录的长度都可能不一样
- 3,文件:文件系统中最大的数据单位
- 知识点准备
- 1,抽象化 ,以记录为最小单位
- 2,抽象化后的定长记录(不够标准定长的数据就补长)和变长记录(每个记录的长度不一样)的表示
- 3,定长(直接访问或者顺序访问)和变长记录(顺序访问)方式的查询(变长需要有一个字节来记录数据的长度)
顺序文件
- 分为1,串结构(时间排序,往表格里面输入的先后顺序)定长和变长 ;2,顺序结构(关键字排序,按照成绩排序)分为定长和变长
- 特点:1,对顺序文件的记录做增加删除比较困难,需要移动和重新排序;2,只有顺序文件可以保存在磁带上;3,定长记录的顺序文件比变长记录的顺序文件查找快
索引文件
- 原因,变长文件查询比较麻烦,只可以使用顺序查找的方式进行查询。对变长记录的顺序文件进行改进,使其可以直接访问/顺序访问(索引表)
- 索引表 是定长的,利用直接访问的优势
- 索引表:索引号(排序的位号) 、 记录长度(配合第三个参数) 和记录指针 索引表是附文件,将索引表拼接在主文件(变长顺序存储)的前面,就形成了索引文件
- 特点:1,通过索引表查询记录很快;2,索引表会导致文件大小的增加,因为拼接了索引表
索引顺序文件
- 分组 ,索引表记录键值和逻辑地址,逻辑地址是指向不同分组的第一个逻辑地址
- N个记录分为根号N 组,平均查询根号N次
- 增加索引表多占了空间,但是提高了存取速度
- 组间索引 组内顺序
- 同组无序,组间有序
Hash文件
- 直接文件 = 散列文件 = HASH文件 = 哈希文件
- 散列文件存取文件的速度很快,但是会引发冲突 -> 数据结构 Hash查找
- Hash(记录) = 记录应该保存的位置(物理位置)
- 好的hash函数会减少冲突的次数,但是冲突不会避免
目录文件的逻辑结构(PCB是如何组织起来的?)
文件控制FCB
- FCB保存在磁盘上 ,记录文件的相关信息
- FCB 记录 文件名、逻辑结构、物理结构、文件类型(目录类型还是普通文件)、文件大小、磁盘位置(物理位置)、控制信号(文件保护,文件的权限)、计数信息(文件共享)
- 多个FCB排列组合变成了目录结构
- FCB数量有限,文件的数量有限
索引节点inode
- 过程:将FCB分解,目录文件只保留文件的名字,除了文件名字之外的信息打包形成的块,简称inode
- 拆解的原因:原版的FCB太大,导致目录文件的很大,电脑查询文件的时候,需要将目录文件调入内存,导致内存的消耗变大。其次,读取大的目录文件的时候,磁盘访问次数也会变多,导致文件查询速度很慢,瘦身之后的FCB就克服了这个缺点
- 节点表 记录所有inode,查询的时候,需要通过文件名字查询FCB,找到对应的inode,再到节点表查询inode里面查询物理位置
- 节点表保存在磁盘,瘦身版FCB(文件名+inode号)时读入内存,不用的时候存储在磁盘
- 索引节点:编号递增且唯一。每个索引节点唯一关联一个目录文件或者普通文件(inode代替先前的原版PCB成为文件的档案袋)
- inode数量有限,操作系统安装的时候就已经确定了
- 这种方式适用于Unix系统
目录结构
单级目录结构
- FCB连续,每个FCB对应一个文件,没有文件夹的概念
- 目录基本操作
- 1,检索文件
- 2,创建文件,先申请FCB,再分配内存空间
- 3,删除文件,先回收磁盘块,再删除FCB
- 4,移动文件,(没有目录层级的概念,复制剪贴)
- 特点
- 1,实现按名存取,但是不可以重名
- 2,检索文件很慢
- 3,不适用于多用户操作系统,(用户空间隔离,彼此文件不可见)
- 4,没有文件夹
两级目录结构
- 针对单级目录的优化
- 实现了多用户,但是灵活性不够,不可以对文件进行分类管理
- 相关FCB都相联,比如不同用户的FCB相联,同一用户的不同文件的FCB相联
- 区分了用户,但是用户进入自己的文件夹下,和单级目录结构一致,只有文件,没有层级结构
多级目录结构
- 改进两级目录,解决不可以对文件进行分类的问题
- 特点
- 1,更好的对文件进行分类管理,树形目录层次清晰、分类清晰
- 2,磁盘启动次数多 因为按照树形结构,从上到下,每一级分别读入内存进行查询(按块读取)(一块就启动一次)
无环图目录结构
- 树形目录结构 + 有向边 = 无环图目录
- 被多条有向边指向的目录文件,就是被共享的文件
- 设计的目的是为了共享
- 有向边 由硬链接/软连接 实现
文件共享
- 文件共享 的原因:1,单机 节约空间,只保留一个副本(缺点,牵一发动全身,个人修改对别人影响很大);2,联网 互联网发展的必然性 C/S 模型 ,不同用户访问同一文件
硬链接共享
- 云盘共享数据 ,接收别人共享的文件,保存到我的云盘,本质是添加inode号,使得多个用户关联同一份文件,inode号指向文件
- 需要添加计数信息参数,删除文件,就是删除关联inode的信息,同时减少计数
- 只有当文件的计数为0,代表这个文件不再被使用,删除文件,回收inode
- inode通过物理地址直接找到文件的存储位置,速度很快
软连接共享
- link类型文件,文件内 存有共享文件的路径,因此会增加磁盘访问的次数
- 可能引起错误(新的文件和旧的文件同名的时候)
- linux的软连接模式 和 windows的创建快捷方式相似
- 软连接,通过文件的层级目录找到文件,仅仅依靠目录层级和文件的名字作为索引
文件保护
- 文件保护是通过索引节点inode和文件控制块FCB一起使用实现的
- 文件保护的原因 ,防止共享文件被未经过批准的用户随意修改和破坏
- 文件保护的方式
- 1,口令:FCB添加口令,口令匹配才可以通过,防止随意存取
- 2,加密:对文件的数据进行加密,即使获取文件,也无法解密数据;缺点:需要使用对应的加解密文件,需要耗费时间
- 3,访问控制:不同角色拥有不同的权限,设置访问控制表。这个一般Unix使用比较多,对文件分为拥有者、组、其他,分别对应读、写、执行三种权限
- 口令和访问控制,都是在FCB的控制信息里面添加内容
文件系统的物理结构
文件的实现(物理结构)
文件物理结构学习逻辑图
- 文件保存到磁盘 -> 最小单位为块(4kb、1kb)块设备
- 问题
- 1,存在哪?文件的分配方式
- 2,哪可存?磁盘存储空间的管理
文件的分配方式
- 连续分配
- 思想:文件分配一组连续的磁盘块
- 特点:
- 1,顺序访问 直接访问(起始地址 + 每一块的大小 * 数据块数)
- 2,外部碎片多,内部碎片少
- 3,适合长度固定的文件的(比如图片、视频)
- 磁盘块的顺序很重要,需要从指定位置读取指定大小的文件内容;存文件的时候,也需要顺序存放
- FCB表格 : 文件的名字、存储的起始位置、文件的长度
- 链接分配 分为 隐式链接分配 和 显式链接分配;解决内部碎片的问题
- 隐式链接分配
- 思想:顺藤摸瓜 / 做记号; 像链表一样,把不连续的空间碎片,链接在一起;每一个块的后面记录下一个存储的位置信息
- 特点:可以顺序访问,不可以直接访问;稳定性不好(如果中间数据损坏,就无法衔接下一个文件,造成文件的损坏)
- FCB里边的物理结构,会确定文件的类型是连续分配、隐式链接分配、显式链接分配等,按照对应的规则,读取目录文件
- FCB 隐式链接分配的目录文件记录 文件的名字、起始位置和结束位置
- 因为有链接的存在,假设链接占据2b,每个块存储(4kb - 2b)大小的内存
- 显式链接分配
- 解决隐式链接分配不稳定的问题(中间断裂)
- 思想:先存再读,整个磁盘设置一张表,记录每个磁盘块的分配情况,该表叫做FAT
- 查询FAT,防止中间层数据断裂
- 特点:FAT表占用空间比较大,磁盘无所谓,但是内存卡会浪费很大的空间
单级索引分配
- 思想:为每个文件都建立一个索引表,记录该文件的磁盘块分配顺序
- 将索引表记录在一个磁盘块,FCB的索引填写 索引表的存储磁盘号
- 索引表:文件的名字、索引(索引表记录磁盘块的分配顺序,索引记录索引表所在的磁盘位置)
- 文件读取的时候,现根据文件的名字,读取索引表的;将索引表读入内存之后,根据索引表依次读取文件
- FCB的物理结构会记录 模式 单级索引
- 特点:可以直接访问,但是索引表占据了磁盘的空间,文件很大,需要的索引表也会很多
多级索引分配
- 解决索引块长度不一致,使索引表变成一个变长文件,不利于直接访问的问题,再次构建索引表
- 8M文件占据多少空间? 8Mb + 3* 4kb
混合索引
- 直接索引、单级索引、二级索引、三级索引等同时使用
- 条件:盘块4kb大小、盘块号4B大小
- 问:混合索引最大支持的文件大小?4TB + 4GB + 4MB + 4kb
- 3GB文件实际需要占用多大的空间? 好复杂
- 一个盘块可存 4kb/4B = 1k 个盘块号
- 直接索引:4kb
- 单级索引:1k * 4kb = 4MB
- 二级索引:1k *1k * 4kb = 4GB
- 三级索引:1k * 1k *1k *4kb = 4TB
- 文件的索引顺序 依次是 直接、单级、二级、三级
存储空间管理
空闲表法
- 解决哪里可以存?
- 空闲盘块表:序号 、 第一个空闲的盘块号、 空闲数量;主要用于连续分配
- 分配:分配算法,如首次适应、最佳适应、最坏适应、邻临适应、循环首次适应
- 回收:合并问题,(删除)
- 存在哪里?
空闲链表法
- 空闲盘块链:盘块号+下一节点指针
- 空闲盘区链:首个盘块号 盘区大小 下一个盘区指针
- 数据结构里面的链表,还是单链表
位示图法
- 由0和1 组成,1代表存储数据,0代表没有存储数据
成组链表法
- 一组一组形成链表,就是成组链表法
- 并不详细 回收和分配
目录的实现(物理结构)
线性链表
- 目录文件 依次查询(线性链表)
- 例题
- 有一个文件系统,根目录常驻内存,如图所示,文件目录采用链接结构,每个目录下最多放80个目录或者文件(称为下级文件),每个磁盘块最多放10个文件目录项,如果下级目录是目录文件,则上级目录指向该目录文件的第一块磁盘。假设目录结构中第一块文件按照从左向右的顺序排列,... 表示有其他文件或者目录
- 问题:k文件 最少 或者 最多 查询几次磁盘
- 文件 文件夹 都是文件
- 最多查询 8 次,采用链接表的方式存储,需要根据头结点 到 尾节点 依次查询
- 每次 读取数据 都需要启动磁盘
哈希表
- 考的少
- 利用文件的名字进行哈希运算,得到文件的存储位置
层次结构
为什么要分层?
- 每一层各司其职(下层为上层服务)
- 高内聚 低耦合
- 利于修改代码。推行版本的更新 和 便于移植
具体内容
- 从下往上
- 设备(硬件):磁盘、flash、光盘等等
- 设备管理模块(软件):驱动程序 (读写控制磁盘等)
- 物理文件系统:存在哪里?物理结构,文件的分配方式
- 辅助分配模块:哪里可存?磁盘存储空间管理
- 逻辑文件系统:文件以及目录的逻辑构成
- 存取控制模块:文件的保护
- 文件目录系统:根据文件的名字来搜索FCB
- 用户接口:GUI、命令行、系统调用(API)
- 用户 普通用户 程序员
磁盘的组织和管理
磁盘的结构
- 扇区,一圈扇区围成的同心圆环叫一条磁道
- 圆环就是磁道从外往里命名
- 盘面 圆形的物理结构
- 多个圆形的盘面 相垂直的部分 构成 柱面,柱面号 和 磁道号 一致
- 约靠近扇区的圆心,扇区的密度越大
- 通过柱面号 盘面号和扇区号唯一确定一个扇区
磁盘的读写
- 相关概念:
- n:跨越的磁道数
- m:磁盘的固定参数,是常数;移动一条磁道的耗时
- s:磁臂启动时间,也是常数
- r:转速;单位 转/秒
- b:扇区字节数
- N:一条磁道字节数
磁盘的一次读写时间 大概值(期望数值/平均数值)
- 一次读写时间:期望值/平均值 Ta = 需找时间 Ts + 延迟时间 Tr + 传输时间Tt
- 寻找时间:磁头跳转磁道的时间,也就是寻找柱面号 (也是磁道号,多块盘的磁道组织在一起构成柱面);m 磁盘的固定参数,是常数,平均移动一条磁道的耗时;s 磁臂启动时间,也是常数,需要给磁臂充电,然后才有能量进行磁道之间的切换
- 延迟时间:磁道确定之后,磁头还需要等待目标扇区的到来,扇区旋转;期望值,Tr = 1/2r
- 延迟时间推导:转速 一般是固定的,一般是7200转/分钟 7200/60=120转/s 每转一圈 1/r 秒,每个扇区用 1/r(x+1)秒;磁头移动之后,定位的第一个扇区是随机的,计为A,该磁道的每一个扇区都可能是目标扇区,成为目标扇区的几率是 p = 1/(x+1) 则,Tr = 1/2r
- 传输时间:传输时间是在延迟时间的基础上来看的,Tt = b / rN
- 磁头掠过所有的扇区,怎么只读一个扇区?磁头电子开关,如果不开启,读取的数据是无效的
- 减少Ts:优化寻道顺序 -> 磁盘的调度算法
- 减少Tr:盘面错位编号 和 扇区交替编号 ;增大转速
- 减少Tt:增大转速,如果磁盘确定,则无法优化
磁盘调度算法
FCFS算法
- 先到先服务
SSTF算法 最短寻找时间优先算法:磁头优先向最近的请求磁道移动
- 坏处 容易造成两边的饥饿
- 只有左边完成之后,才会到右边
SCAN算法 = 电梯算法
- 根据初 ,优先向当前磁头位置最近的磁道移动,直到遇到边界才可以折返
- 如果没有指出方向,按照 从小 到 大的次序访问,即一般向右访问
- 利于两端的磁道的访问请求(折返,相当于接替访问两次)
进化版-> LOOK算法 到最远请求则折返
- 题目中,没有特别说明是普通SCAN,则默认是改进型SCAN算法(即LOOK算法)
- 区别在于,不直到遇到边界才折返
CSCAN算法和CLOOK算法 循环扫描算法,从头跑,不折返
- CSCAN算法 根据初始磁头方向,确定一个单方向,优先向偏离磁头当前位最近的磁道移动,直到遇到边界才重头跑(不是往返跑)
- 克服了SCAN算法,利于两端磁道请求的问题
- CSCAN算法
- CLOOK算法
减少延迟时间
- 交叉编译:同盘扇区交叉编号;不同盘面错位命名
- 扇区 = 头 + 数据 + 尾;如果按照顺序进行编号,处理第一个头尾的过程中,因为磁盘的转动,会错过第二个扇区,如果想读取第二个扇区的数据,需要循环一周,浪费时间,因此采用交叉编号
- 通过交叉编号,可以很好衔接 同盘面同磁盘的连续扇区
系统安装的过程
- 低级格式化 -> 扇区 = 头 + 数据 + 尾
- 磁盘分区(多个柱面构成一个分区);主分区 C;逻辑分区:D E
- 第一个0开始的分区 不会分给C盘,而是装载了MBR,主要引导程序和分区表;分区表记录每一个逻辑分区和主分区 的
- 首先将安装系统的主分区标记位活动分区,在主分区安装OS 同时安装FS,
磁盘的管理
- 系统安装过程
- 1,低级格式化 -> 把盘面分成扇区,(分成柱面号、盘面号和扇区号),每个扇区都有头和尾确定扇区的开始和结束
- 2,磁盘分区,(多个柱面构成一个分区),主分区 装入引导程序 和 分区表(分区表记录不同C盘、D盘等分区的信息),确定活动分区,也就是操作系统安装的盘
- 3,主分区安装OS操作系统,同时安装文件系统,每个分区可以安装不同的文件系统