81-82-83-84-85-86 - 文件系统设计与实现

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)深入浅出操作系统 - 目录

文章目录

  • 1. 问题
    • 1.1 硬盘上最最最简单的文件系统支持方式
    • 1.2 改进思路
    • 1.3 更多细节问题
    • 1.4 文件系统概要设计
    • 1.5 硬盘数据逻辑示意图
    • 1.6 硬盘数据物理组织示意
  • 2. 问题
    • 2.1 硬盘基础概念
    • 2.2 课程中的解决方案
    • 2.3 数据结构设计
    • 2.4 格式化的关键
    • 2.5 编程实验:文件系统的初步实现
  • 3. 问题
    • 3.1 根目录的本质
    • 3.2 根目录逻辑结构
    • 3.3 文件实现的基础:扇区管理
    • 3.4 扇区申请
    • 3.5 一些注意事项
    • 3.6 访问数据扇区对应的分配表项
    • 3.7 核心数据结构及数量关系
    • 3.8 需要实现的部分扇区管理函数
    • 3.9 编程实验:扇区管理函数的实现
  • 4. 问题
    • 4.1 根目录本质回顾
    • 4.2 根目录中创建文件的流程
      • 4.2.1 在根目录中创建文件
      • 4.2.2 CheckStorage() - 写入数据前的检查
      • 4.2.3 在根目录中写入新文件信息
      • 4.2.4 编程实验:在根目录中创建文件
      • 4.2.5 思考
    • 4.3 根目录中查找文件的流程
      • 4.3.1 文件查找的本质
      • 4.3.2 FindFileEntry() - 文件查找的核心
      • 4.3.3 在扇区中查找FileEntry
      • 4.3.4 编程实验:在根目录中查找文件
      • 4.3.5 思考
    • 4.4 在根目录中删除文件
      • 4.4.1 实现思路
      • 4.4.2 根目录中删除文件的流程
      • 4.4.3 关键细节
      • 4.4.4 数据链表中的字节删除
      • 4.4.5 数据链表容量调整
      • 4.4.6 编程实验:在根目录中删除文件
      • 4.4.7 思考
    • 4.5 重命名根目录中的文件
      • 4.5.1 解决方案
      • 4.5.2 根目录中重命名文件的流程
      • 4.5.3 文件重命名
      • 4.5.4 FileEntry写回硬盘
      • 4.5.5 编程实验:在根目录中重命名文件
      • 4.5.6 思考
    • 4.6 读写已经存在的文件
      • 4.6.1 文件读写的常规流程
      • 4.6.2 需要深入思考的问题
      • 4.6.3 文件描述符数据结构设计
      • 4.6.4 文件打开与关闭函数的实现
      • 4.6.5 写文件时需要考虑的问题
      • 4.6.6 文件数据写入函数
      • 4.6.7 编程实验:文件数据写入
      • 4.6.8 思考
    • 4.7 从文件中读取数据
      • 4.7.1 读文件时需要考虑的问题
      • 4.7.2 文件数据读取函数
      • 4.7.3 编程实验:文件数据读取
      • 4.7.4 文件系统中的辅助函数
      • 4.7.5 数据擦除函数的定义与实现
      • 4.7.6 文件读写指针移动函数
      • 4.7.7 FSeek & FTell
      • 4.7.8 编程实验:辅助函数的实现
      • 4.7.9 扩展思考
  • 5. 系列完结

1. 问题

  • 能够读写硬盘扇区是否就可以创建文件?
  • 对硬盘而言只有扇区的概念,没有文件的概念,文件是操作系统中的概念。
  • 文件是 有逻辑关联的数据集合,并且 数据之间有存储上的先后关系
  • 那么,硬盘和文件是如何联系在一起的呢?

1.1 硬盘上最最最简单的文件系统支持方式

  • 一个扇区就是一个文件,则:
    • 文件名就是逻辑扇区号(LBA)
    • 扇区第0字节存储文件长度
    • 文件大小最多511字节

在这里插入图片描述

  • 缺陷:
    • 文件数量太多:用不上那么多文件
    • 文件名不友好:使用不方便
    • 文件容量太小:完全不够用
  • 启示
    • 文件中有一个逻辑上的“指针”,用于标识读写位置
    • 文件背后有一个“缓冲区”,方便指定位置数据读写

1.2 改进思路

  • 支持自定义文件名(仅限制文件名字符数量)
  • 使用硬盘固定位置 文件名扇区号映射
  • 将多个扇区组织在一起,共同存储属于同一文件的数据

在这里插入图片描述
如:DELPHI.TXT文件名和第35号扇区做映射

1.3 更多细节问题

  • 如何区分硬盘上的哪些扇区空闲,哪些扇区被文件使用?
  • 硬盘上的哪个位置记录文件名和扇区的映射关系?
  • 文件内容超过512字节时,如何增加扇区并维护前后关系?

1.4 文件系统概要设计

在这里插入图片描述

1.5 硬盘数据逻辑示意图

在这里插入图片描述

1.6 硬盘数据物理组织示意

在这里插入图片描述

2. 问题

  • 当目标文件需要保存的数据大于512字节时,如何获取更多的存储空间?
    • 选择一个(多个)空闲扇区分配给目标文件使用即可。
  • 如何高效的查询以及获取空闲扇区?
    • 将扇区分配表组织成不同的链表
    • 扇区分配表中的 每个链表 代表 一个文件
    • 未使用的扇区也组织成一个链表(即:空闲链表,每次从头部取扇区,O(1))
    • 文件管理的过程可看作扇区在不同链表中移动的过程

2.1 硬盘基础概念

  • 硬盘分区
    • 对硬盘进行分割,分割成不同的硬盘区域
  • 格式化
    • 格式化是指对硬盘分区进行的一种初始化操作(设置扇区分配表的初始状态,比如说:在扇区分配表中将所有的扇区标记为空闲扇区)
    • 格式化会使得硬盘分区中的所有文件被清除

2.2 课程中的解决方案

  • 将整个硬盘当作唯一分区使用
  • 对硬盘分区进行格式化
    • 建立 引导区根目录区扇区分配表
  • 根目录的本质就是一个文件
    • 目录(文件夹)本质 就是 文件

2.3 数据结构设计

在这里插入图片描述

2.4 格式化的关键

  • 计算扇区分配表的大小(map size):

在这里插入图片描述

  • 构建空闲扇区链表:
    • 将扇区分配表中的所有成员全部组织到空闲链表中

在这里插入图片描述

2.5 编程实验:文件系统的初步实现

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 81

  1. qt上结果如下:

在这里插入图片描述
在这里插入图片描述

  1. 将qt下格式化的“hd.img”放入到D.T.OS路径下,结果如下:

在这里插入图片描述
在这里插入图片描述

3. 问题

  • 如何在根目录区中创建文件?

3.1 根目录的本质

  • 根目录 在文件系统中是一个特殊的文件
  • 根目录中存储了 文件的基本信息(FileEntry
    • FileEntry包含了文件名,文件起始扇区,文件大小等信息

在这里插入图片描述

3.2 根目录逻辑结构

在这里插入图片描述

3.3 文件实现的基础:扇区管理

  • 如何 获取 / 归还 空闲扇区?
  • 如何 查找当前扇区的后续扇区
  • 如何为当前文件 增加 / 删除 一个扇区?
    ……

3.4 扇区申请

在这里插入图片描述

3.5 一些注意事项

  • 扇区操作是一种 外存操作,因此需要仔细计算目标位置
  • 扇区管理时 使用 相对扇区地址扇区读写时 使用 绝对地址
    在这里插入图片描述

●关系如下:
在这里插入图片描述

3.6 访问数据扇区对应的分配表项

  • 分配表项就是管理单元
    • 计算相对扇区地址:offset = si - mapSize - 2
      (注释:即扇区分配表中的第几个扇区)
    • 计算目标扇区:sctOff = offset / MAP_ITEM_CNT
      (注释:一个扇区包含MAP_ITEM_CNT个分配单元,这里的除法算完后即可得到目标在扇区分配表中是第几个扇区)
    • 计算目标扇区内偏移:idxOff = offset % MAP_ITEM_CNT
      (注释:得到扇区分配表中的第几个扇区之后,计算出在该扇区内的偏移,即在该扇区中偏移了几个分配单元)

在这里插入图片描述

3.7 核心数据结构及数量关系

在这里插入图片描述

3.8 需要实现的部分扇区管理函数

在这里插入图片描述

3.9 编程实验:扇区管理函数的实现

  1. 获取 / 归还空闲扇区

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 82 / 00获取归还空闲扇区

在这里插入图片描述
在这里插入图片描述

  1. NextSector测试

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 82 / 01testNextSector

在这里插入图片描述
在这里插入图片描述

  1. 所有扇区管理函数

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 82 / 02

4. 问题

  • 如何在根目录区中 创建文件
  • 申请扇区,写入文件信息数据(FileEntry)
  • 扇区申请成功后,还需要做哪些工作?

4.1 根目录本质回顾

根目录(文件) 中存储的是FileEntry类型 的值,每个FileEntry值表示一个硬盘上的文件。

在这里插入图片描述

4.2 根目录中创建文件的流程

在这里插入图片描述

4.2.1 在根目录中创建文件

在这里插入图片描述

4.2.2 CheckStorage() - 写入数据前的检查

在这里插入图片描述

4.2.3 在根目录中写入新文件信息

在这里插入图片描述

4.2.4 编程实验:在根目录中创建文件

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 83 / 00在根目录中创建文件

在这里插入图片描述

4.2.5 思考

  • 如何判断在根目录中是否存在指定文件?
  • 直接查找根目录的数据链表,如果文件存在,那么必然能够查找到对应的FileEntry。

4.3 根目录中查找文件的流程

在这里插入图片描述

4.3.1 文件查找的本质

  • 在数据链表中查找FileEntry值

在这里插入图片描述

4.3.2 FindFileEntry() - 文件查找的核心

在这里插入图片描述

4.3.3 在扇区中查找FileEntry

在这里插入图片描述

4.3.4 编程实验:在根目录中查找文件

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 83 / 01在根目录中查找文件

在这里插入图片描述

4.3.5 思考

  • 如何在根目录中删除文件?

4.4 在根目录中删除文件

4.4.1 实现思路

根据 文件名 在根目录的数据链表中查找FileEntry值
当查找成功时:从数据链表中删除FileEntry值

  • 关键问题:
    FileEntry值的实际位置是在硬盘上,那么如何从硬盘上抹除这个值呢?
  • 解决方案:
    1. 判断目标文件是否打开(只有关闭状态能被删除)
    2. 根据名字查找目标FileEntry的位置(如:FileEntry 2)
    3. 将数据链表中最后一个FileEntry值复制到FileEntry的位置
    4. lastBytes = lastBytes - sizeof(FileEntry)

在这里插入图片描述

4.4.2 根目录中删除文件的流程

在这里插入图片描述

4.4.3 关键细节

  • FileEntry移动时需要保留原inSctIdx和inSctOff的值
    在这里插入图片描述

  • 抹除最后一个FileEntry所占用的空间,即:修改lastBytes,使其减少64字节

  • 扩展问题:

    • 删除最后一个FileEntry之后,如果lastBytes的值为0,那么应该做什么样的操作?
    • 归还扇区的操作

4.4.4 数据链表中的字节删除

在这里插入图片描述

4.4.5 数据链表容量调整

在这里插入图片描述

4.4.6 编程实验:在根目录中删除文件

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 84 / 00在根目录中删除文件

在这里插入图片描述
在这里插入图片描述

4.4.7 思考

  • 如何重命名根目录中的文件?

4.5 重命名根目录中的文件

4.5.1 解决方案

  1. 判断目标文件是否已经打开(只有关闭状态能重命名)
  2. 根据名字查找目标FileEntry的位置(如:FileEntry 4)
  3. 查找新名字是否已经被占用
    • 如果没有占用,修改目标FileEntry的name成员
    • 如果已经占用,返回失败

4.5.2 根目录中重命名文件的流程

在这里插入图片描述

4.5.3 文件重命名

在这里插入图片描述

4.5.4 FileEntry写回硬盘

在这里插入图片描述

4.5.5 编程实验:在根目录中重命名文件

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 84 / 01在根目录中重命名文件

在这里插入图片描述
在这里插入图片描述

4.5.6 思考

  • 如何 读写 已经存在的文件?

4.6 读写已经存在的文件

4.6.1 文件读写的常规流程

在这里插入图片描述

4.6.2 需要深入思考的问题

  • 打开一个文件意味着什么?
  • 如何高效的标识已打开的文件?
  • 读写文件数据时必须操作硬盘吗?
  • 如何指定读写文件的位置?
  • ……

4.6.3 文件描述符数据结构设计

文件描述符 需要反映当前文件的状态,如:文件名,读写位置,文件长度,等。

4.6.4 文件打开与关闭函数的实现

  • FOpen:

在这里插入图片描述

  • FClose:

在这里插入图片描述

4.6.5 写文件时需要考虑的问题

  • 需要写入的数据量与文件读写指针的关系
    如:当缓冲区满时,需要如何处理?
  • 写入数据的同时,文件数据链表是否发生变化?
    如:对刚创建的文件写入数据时会发生什么?

4.6.6 文件数据写入函数

在这里插入图片描述

  • 缓冲区的准备

在这里插入图片描述

  • 缓冲区数据写入

在这里插入图片描述

4.6.7 编程实验:文件数据写入

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 85

在这里插入图片描述
在这里插入图片描述

4.6.8 思考

  • 如何从文件中读取数据?

4.7 从文件中读取数据

4.7.1 读文件时需要考虑的问题

  • 需要读取的数据量与文件读写指针的关系
    如:文件数据总量小于读取需求量,该如何处理?
  • 读取数据时,文件数据数据缓冲区如何变化?即:是否需要使用数据缓冲区?

4.7.2 文件数据读取函数

在这里插入图片描述

  • 缓冲区数据读取

在这里插入图片描述

  • 辅助函数的实现

在这里插入图片描述

4.7.3 编程实验:文件数据读取

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 86 / 00文件数据读取

在这里插入图片描述
在这里插入图片描述

4.7.4 文件系统中的辅助函数

在这里插入图片描述

4.7.5 数据擦除函数的定义与实现

在这里插入图片描述

4.7.6 文件读写指针移动函数

在这里插入图片描述

4.7.7 FSeek & FTell

在这里插入图片描述

4.7.8 编程实验:辅助函数的实现

【参看链接】:81-82-83-84-85-86 - 文件系统设计与实现 / 86 / 01辅助函数的实现

在这里插入图片描述
在这里插入图片描述

4.7.9 扩展思考

  • 有了文件系统后,内核可以发生怎样的变化?

5. 系列完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/9828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​2023年十大目标检测模型!

“目标检测是计算机视觉中最令人兴奋和具有挑战性的问题之一,深度学习已经成为解决该问题的强大工具。”—Dr. Liang-Chieh Chen目标检测是计算机视觉中的基础任务,它涉及在图像中识别和定位目标。深度学习已经革新了目标检测,使得在图像和视…

微服务架构-服务网关(Gateway)-路由功能详解

路由功能详解 这一节我们看一看Gateway中的路由是怎么工作的;GateWay网关的路由功能可不是简简单单的 “转发" 请求,在请求到达网关要流转到指定服务之间发生了很多事儿,它不光可以拒绝请求,甚至可以"篡改” 请求的参数…

Java 在线编程编译工具上线,直接运行Java代码

前言 大家好,我是小哈~ 周末没出去浪,花了点时间,在我的个人网站上线了一款小工具。啥工具呢?一款可以在线编译 Java 代码并运行输出结果的小工具。 大家都知道,甲骨文刷 Java 版本号非常积极,这不上个月…

web综合

一,基于域名访问www.openlab.com 在文件当中写入IP与域名的映射关系 在windows中写入 也可以在客户端的/etc/hosts下写入映射关系 创建目录 [rootserver ~]# mkdir -pv /www/openlab 将所需要的内容写入对应目录当中 [rootserver ~]# echo welcome to openlab ! &…

大一被忽悠进了培训班

大家好,我是帅地。 最近我的知识星球开始营业,不少大一大二的小伙伴也是纷纷加入了星球,并且咨询的问题也是五花八门,反正就是,各种迷茫,其中有一个学弟,才大一,就报考培训班&#…

2023/4/6总结

题解 Problem - A - Codeforces 1.这道题很简单,找出将当前数字放入字符串的最大值。 2.分情况讨论,有俩种情况,一种是大于等于数字d,那么这个数字d需要插入到最后字符串的位置。否则这个数字需要插入到第一次比它小的位置。 …

2023年4月的编程语言排行榜,有你中意的开发语言吗?

编程世界变幻莫测,编程语言也是层出不穷,每隔一段时间就有新的风口出现。2023年的风口非人工智能莫属,人工智能领域中不可获取的编程语言就是Python,作为在算法、数据方面有独特优势的编程语言,从去年开始就展现了它不…

算法学习|动态规划 LeetCode 392.判断子序列 、115.不同的子序列

动态规划一、判断子序列思路实现代码二、不同的子序列思路实现代码(还是蛮开心的) 一、判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相…

腾讯云8核16G18M轻量服务器CPU带宽流量性能测评

腾讯云轻量应用服务器8核16G18M带宽,18M公网带宽下载速度峰值可达2304KB/秒,相当于2.25M/s,系统盘为270GB SSD盘,3500GB月流量,折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…

【Pytorch】搭建网络模型的实战

【Pytorch】搭建网络模型的实战CIFAR10 model structure搭建网络使用Sequential进行搭建网络模型使用tensorboard查看网络结构对CIFAR10数据集进行分类,根据图片内容识别这是哪一类 CIFAR10 model structure 输入input:3通道的32 x 32 图片卷积操作的通道数不变 那…

应用信息资源管理(张士玉、董焱)——第一章 总论

第一章 总论 1.1 信息社会 1.1.1 信息社会的形成 信息社会是指以信息技术为基础,信息产业为支撑,信息化为主要特征的社会形态。其形成经历了以下几个阶段: 信息化初期:20世纪60年代至70年代,电子计算机的出现和发展…

人工智能会取代人工翻译吗?

当今社会正处于语言和技术高速发展的阶段,因此语言和技术的碰撞是不可避免的——甚至有些人说这种碰撞已经发生了,我们只是在等待尘埃落定。数字化、物联网、人工智能和机器学习,以及更进一步——智能手机、语音识别,以及互联网和…

机器视觉检测技术在工业零部件的应用

众所周知,在工业生产中,传统的检测技术需要大量的检测工作者,不仅影响生产效率,而且带来不可靠的因素。 视觉检测技术克服了传统检测技术的缺点,确保了检测的安全性。 可靠性和自动化程度高,已成为当前检测…

第六章 信息资源安全管理

信息资源安全管理内涵 信息在开发利用过程中面临的问题: 可用性;合法用户对信息的使用不会被不正当拒绝保密性也称机密性;保证机密信息不被窃取,或窃取者不能了解信息的真实含义认证性也称真实性;对信息的来源进行判断…

zabbix创建自定义监控模板

目录 第一章先行配置zabbix 第二章配置自定义 2.1.案列:自定义监控客户端服务器登录的人数需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 2.2.在 Web 页面创建自定义监控项模板 2.3.zabbix 自动发现与自动注册 总结 自定义监控…

Chat-GLM 详细部署(GPU显存>=12GB)

建议配置: ( Windows OS 11 部署 )CPU-i7 13700F ~ 13700KF RAM: 16GB DDR4 GPU: RTX3080(12G) 安装 conda: 1. 下载安装 miniconda3 : https://docs.conda.io/en/latest/miniconda.html conda是一个包和环境管理工具,它不仅能管理包,还能隔…

龙蜥 Anolis 8.x + Vmware的安装与网络配置 CentOS8 网络配置详细教程

前言 配置和安装可以看下面这两篇文章的 写的很详细https://cnxiaobai.com/articles/2021/04/21/1619011285612.htmlhttps://cnxiaobai.com/articles/2021/10/21/1634800698273.html#b3_solo_h3_1网络配置方面有不同的方面 我在下面进行了修改这个操作系统 很少资源 弄了好久才…

C++轻量级Web服务器TinyWebServer源码分析之threadpool篇

文章目录threadpool线程池篇简介一、线程池的创建与回收二、向请求队列添加请求任务三、worker函数内部访问run函数,完成线程处理四、run函数执行任务原文链接threadpool线程池篇简介 空间换时间,浪费服务器的硬件资源,换取运行效率. 池是一组资源的集合,这组资源…

天气预报查询 API + AI 等于王炸(一大波你未曾设想的天气预报查询 API 应用场景更新了)

前言 近年来,随着信息化进程的不断深入,人们对于信息的获取和处理需求越来越高。而其中,天气查询API是一个非常重要的服务,它能够帮助人们快速获取所在位置的天气情况,同时也为各类应用提供了必要的气象数据支持。 本…

vue3笔记

目录 1.vue3带来了什么 1.1源码的升级 1.2拥抱TypeScript 1.3新的特性 2.创建Vue3.0工程 2.1使用vue-cli创建 2.2使用vite创建 3.创建vue3.0工程 3.1 main.js 3.2 App.vue 4.安装开发者工具 5.常用的 Composition API 5.1拉开序幕的setup 6.ref函数 7.reactive函…