[操作系统] 文件系统的实现(一)

《ORANGE’S:一个操作系统的实现》读书笔记(二十六)文件系统(一) 很久以前,硬盘控制器和硬盘本身是分离的,直到有一天,西数(Western Digital)、康柏、CDC的一个事业部Imprimis(后来被希捷收购)等合作开发了一种新的接口标准,将硬盘控制器和硬盘合在一起,这一标准被称为IDE(Intergrated Drive Electronics)或者ATA(At Attachment,AT指的是IBM的PC/AT个人计算机)。近几年,一种新的标准出现了,它就是SATA(Serial ATA),或被称为“串口硬盘”,而且它正在逐渐取代原先的ATA。 阅读详情

文件系统的实现(一)



1. 文件系统布局

文件系统存放在磁盘上。多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record,MBR),用来引导计算机。在MBR的结尾是分区表。该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。在计算机被引导时,BIOS读入并执行MBR。MBR首先确定活动分区,读入第一个块,称为引导块并且执行。引导块中的程序将装载该分区中的操作系统。为统一起见,每个分区都从一个启动块开始。

除了从引导块开始,磁盘分区的布局是随着文件系统的不同而变化的。通常文件系统中都包含一个超级块,

超级块:包含文件系统的所有关键参数,在计算机启动时,或者在该文件系统首次使用时,把超级块读入内存。超级块中包含:确定文件系统类型的魔数、文件系统中数据块的数量以及其他重要管理信息

还有文件系统中的空闲空间管理,说明文件信息的i节点,根目录等。

文件系统布局

2. 文件的实现

文件存储的实现的关键问题是记录各个文件分别用到哪些磁盘块。

  1. 连续分配

    最简单的分配方案是把每个文件作为一连串连续数据块存储在磁盘上。所以,在块大小为1KB的磁盘上,50KB的文件要分配50个连续的块。块大小为2KB的磁盘,要分配25个连续的块。

    在这个方法中,每个文件都从一个新的块开始,所以每个文件的最后一块可能会浪费一些空间。

    优点:

    • 实现简单,只需记住第一块磁盘地址和文件块数。一个简单的加法就能求出其他块的编号。

    • 读操作性能较好,在单个操作中可以从磁盘上读出整个文件。只需要一次寻找(第一个块)之后不再需要寻道和旋转延迟。

    缺点:

    • 磁盘变得很零碎。当删除文件时,占用块被释放,留下很多空闲块。为了利用这些块(不能单纯的将后面的块移动,因为代价太高),所以需要维护一个空洞列表,当创建一个新文件时,需要挑选合适空洞,有必要知道文件最终大小。但是每次在程序执行前都需要询问最终文件大小。
  2. 链表分配(隐式链接)

    为每个文件构造磁盘块链表,每个块的第一个字作为指向下一块的指针,块的其他部分存放数据。

    链表分配

    优点:

    • 可以充分利用磁盘块(除了最后一块中的内部碎片)。在目录中只需存放第一块的磁盘地址,文件的其他块就可以从这个首块地址查找到。

    缺点:

    • 顺序读文件非常快,但是随即存取很缓慢,因为每次都要从头开始寻找。

    • 指针占去了一些字节,每个磁盘块存储数据字节数不再是2的整数次幂,因为许多程序以长度为2的整数次幂来读写磁盘块,所以读出完整的块就需要从两个磁盘块中获得信息,因此会降低系统运行效率。

  3. 在内存中采用表的链表分配(显式链接)

    如果取出每个磁盘块的指针字,把它放在内存的一个表中,就可以解决隐式链表的不足。如下图所示,文件A一次使用了磁盘块4、7、2、10和12,文件B依次使用了磁盘块6、3、11和14。利用图中的表从块4开始,可以找到文件A的全部磁盘块。这个表格被存放在内存中,称为文件分配表(File Allocation Table, FAT)。

    FAT

    优点:

    • 按照这种方式,整个块都可以存数据,长度依然是2的整数次幂。
    • 整个链表都存放在内存中,目录项只需要记录起始块号就可以找到文件的全部块。

    缺点:

    • 主要缺点是要把整个表放在内存中。对于200GB的磁盘和1KB大小的块,这张表需要2亿项,每一项对应于这2亿个磁盘块中的一个块。每项至少3个字节,即至少600MB内存。对于大磁盘不合适。
  4. i节点(索引分配)

    给每个文件赋予一个称为i节点的数据结构,其中列出了文件属性和文件块的磁盘地址。如果每个i节点只能存储固定数量的磁盘地址,当一个文件所含的磁盘块数目超出了i节点所能容纳的数目,所以最后一个磁盘块的地址不指向数据块,而是指向一个包含磁盘块地址的块的地址。

    如图所示,给定i节点就有可能找到文件的所有块。
    i节点

    优点:

    • 相对于在内存中采用表的方式而言,这种机制只有在对应文件打开时,其i节点才在内存中。如果每个i节点占有n个字节,最多k个文件同时打开,那么为了打开文件而保留i节点的数组所占据的全部内存为kn个字节。这个数组的大小与要打开的文件个数相关,而与磁盘大小无关(FAT与磁盘大小成正比)。

3. 目录的实现

在读文件前,必须打开文件。打开文件时,操作系统利用用户给出的路径名找到相应目录项。目录项中提供了查找文件磁盘块所需要的信息。目录系统的主要功能是把ASCII文件名映射成定位文件数据所需的信息。

与此相关的是文件属性的存放问题。每个文件系统都要维护文件所有者,创建时间等相关属性。

  1. 直接存放在目录项中

    很多系统直接将文件属性放到目录项中,目录中有一个固定大小的目录项列表,每个文件对应一项,其中包含一个文件名、一个文件属性结构以及用以说明磁盘块位置的一个或多个磁盘地址。

  2. 存放在i结点中

    对于采用i节点的系统,可以将文件属性放在i节点中。这种情况下,目录项只包括文件名和i节点号。

    属性存放

4. 实现可变长度文件名

大多数操作系统支持可变长度的文件名,做简单的方法是为每个文件名给予一个长度限制,如255字符。但对于很多短文件名的系统,会造成空间浪费。

  1. 使用大小不等的目录项

    这种方法中,每个目录项有一个固定部分,这个固定部分通常以目录项长度开始,然后是固定格式的数据,包括作者、创建时间、保护信息以及其他属性。这个固定长度的头的后面是实际文件名。如图所示,例如有3个文件project-budget、personnel和foo,每个文件名以一个特殊字符结束。为了使每个目录项从字边界开始,每个文件名被填充成整数个字。

    缺点:

    • 当移走文件后,引入了一个长度可变的空隙。与连续分配磁盘问题是一样的(造成多余碎片)。

    • 一个目录项可能会分布在多个页面上,读取文件名时可能发生故障。

  2. 目录项中不包含文件名

    使目录项自身有固定长度,而将文件名放置在目录后面的堆中。

    优点:

    • 当一个文件目录项被移走后,另一个文件的目录项总是可以适合这个空隙。
    • 文件名不需要从字的边界开始

    缺点:

    • 必须要对堆进行管理,处理文件名时页面故障依旧可能发生。

    文件名长度可变

5. 加快文件查找

当文件过多时,普通的线性查找速度很慢,可以采用两种方法优化。

  1. 散列表

    将文件名散列,优点是查找迅速,缺点是需要复杂管理。

  2. 高速缓存

    将查找结果存入高速缓存,在开始查找文件前,先查看文件名是否在高速缓存中。只适合查找主体的文件非常少的时候。

参考书目:现代操作系统第三版

操作系统实习一个简单文件系统的实现 众所周知计算机,主要是用来管理存储数据的,如何对数据能进行很好的管理也就成为了现在主要需要解决的问题,当然我们首先会想到用数据库对数据进行管理,但是对于小量的数据我们并不需要用数据库,由此我们用文件系统来管理一些小量的数据,如何用文件系统来好好的管理数据也就是这个程序的主要内容。 立即下载

相关推荐

操作系统课程设计_模拟文件系统

操作系统课程设计,一个模拟的文件系统的实现,可以读文件,写文件,创建文件,删除文件等,设计了inode节点。

操作系统:文件系统的实现

目录一、文件系统结构二、文件系统实现1.概述2.虚拟文件系统三、目录实现1.线性列表2.哈希表四、磁盘空间的分配方法1.连续分配2.链接分配3.索引分配五、磁盘空闲空间的管理1.位向量2.链表3.组4.计数六、文件系统的性能和效率七、文件系统的恢复 一、文件系统结构 磁盘的逻辑单元为块,内存和磁盘之间的I/O传输以块为单位执行。 磁盘的特点 可以原地重写,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置 可以直接访问磁盘上的任意一块。因此,可以方便地按顺序或随机访问文件 文件系统需要提供高效快捷磁

偶滴博客 7664

操作系统文件系统实验

操作系统的文件系统实验程序,实现文件管理的功能

逆向学习Windows篇:文件操作详解

本节课在线学习视频(网盘地址,保存后即可免费观看):​​在Windows系统中,文件操作是编程中的基础部分,涉及打开文件、读写文件、获取文件大小等。本文将详细介绍如何使用Windows API进行文件操作,包括打开文件、获取文件大小、读取文件内容等,并提供相应的代码示例。

Web安全工具库 1346

操作系统——简单文件系统模拟实验

在内存中模拟一个FAT格式的文件系统,完成文件的创建和索引功能,实现以下命令接口: (1)新建文件,格式:mkfile filename filecontent filename:文件名 filecontent:文件内容(字符) 实现按FAT格式写FAT表和目录表,以及文件内容。 (2)列出文件,格式:dir 列出目录里所有的文件信息和虚拟磁盘信息。 (3)显示文件内容,格式:type filename filename:文件名 在目录项中查找文件名所在块号,并把文件内容打印在屏幕上。 (4)删除文件:del f

操作系统课程设计模拟文件系统Java

一个操作系统课程设计,使用java语言模拟磁盘文件系统实现,实现了FAT算法

Windows文件下载执行的15种姿势

当我们通过Web渗透获取了一个Shell,而且目标主机是Windows,我们该怎么去下载后门文件到目标主机上执行呢?一般来说,实现Windows文件下载执行的方式不外乎以下几种方式。第一...

2万+

深入解析CycloneDDS跨域通信中的XML配置文件优化策略

本文深入解析了CycloneDDS跨域通信中XML配置文件的优化策略,重点介绍了网络接口配置、多播设置、性能调优参数及复杂场景下的配置案例。通过实战技巧和调试方法,帮助开发者在SoC环境中实现高效稳定的跨域通信,提升系统性能。

soda5的博客 688

文件系统模拟实验

java语言实现文件模拟实验,本章主要叙述对文件模拟实验的测试过程,主要选用一些功能测试用例,实现对文件系统目录和文件的管理,通过测试,对文件的功能和内部的一些执行有了更多的认识。文件系统;算法;模拟;

ERXIANQIAO1的博客 1644

stm32教程之三重ADC交错采样

ps:本文基于stm32F407ZGT6单片机 stm32F4单片机单通道采集的最大采样率为2.4M,所以有时会难以满足较高频率的采样,于是查阅芯片手册,发现stm32F4支持多重ADC采集,利用每个通道的转换时间,错位采样,从而提高采样率,最大把采样率开到2.4*3=7.2M. (去年初学ADC时研究的,基于cube和HAL库的三重ADC交错采样参考资料不多,我也是研究了一段时间,写下这篇博客希望可以帮助到更多人。) 示意图如下: 以下是官方例子的说明, In this ex...

weixin_52178036的博客 8873

PX4|Gazebo模型加载失败排查指南:从环境变量到资源路径的全面解析

本文针对PX4与Gazebo联合仿真中常见的'Unable to get model name'错误,提供了从环境变量配置、资源路径排查到网络访问问题的全面解决方案。详细解析了GZ_SIM_RESOURCE_PATH等关键变量的作用与设置方法,并给出了离线模型库部署等一劳永逸的修复指南,帮助开发者彻底解决无人机模型加载失败问题。

weixin_29243063的博客 1228

操作系统(十一)文件系统实现

操作系统 文件系统实现文件系统实现1.文件系统结构2。文件系统实现虚拟文件系统 VFS目录实现4.分配方法连续分配 文件系统实现 1.文件系统结构 分层设计的文件系统 应用程序:利用系统调用的请求文件操作 open() read() 逻辑文件系统:管理元数据,管理目录结构。元数据包括文件系统的所有结构数据,而不包括内容数据。逻辑文件系统通过给定的文件符号名,来管理目录结构,通过文件控制块(FCB),来维护文件结构。 文件组织模块:指导文件的逻辑块和物理块。将逻辑块地址转换为物理块地址。 基本文件系统:只需要

greatcoder的博客 2657

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战中文教程,旨在帮助用户从零开始掌握这一先进的仿真框架。内容涵盖从环境安装、运行第一个“Hello World”仿真,到深入理解实体、组件、想定编辑器等核心概念,并进阶探讨动力学建模、传感器仿真与红蓝对抗想定构建。最后,指南还提供了效能分析与实战排错技巧,帮助用户将仿真结果转化为有价值的量化数据,适用于军事、航空航天等领域的复杂系统行为模拟研究。

weixin_29294395的博客 355

操作系统文件系统C语言实现的部分函数(一)

void startsys() { int i; FILE *fp; char str[9]; myvhard = (unsigned char *)malloc(SIZE*sizeof(char)); /*申请 1M空间*/ if((fp=fopen("myfsys.dat","rb")) == NULL) { printf("myfsys文件系统不存在,现在开始创建文件系统\n...

qq_36639952的博客 1515

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5247

YoloV10改进策略:卷积篇|基于PConv的二次创新|附结构图|性能和精度得到大幅度提高(独家原创)

在PConv的基础上做了二次创新,创新后的模型不仅在精度和速度上有了质的提升,还可以支持Stride为2的降采样。改进方法简单高效,需要发论文的同学不要错过!

m0_47867638的博客 1094

《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(上一)

文章目录相关查阅博客链接本书中错误勘误闲聊时刻部分缩写熟知实现文件系统的原理inode构建原理目录构建原理超级块构建思路创建文件系统编写完的super_block.h编写完的inode.h编写完的dir.h编写完的fs.h编写完的fs.c修改后的ide.h修改后的makefile修改后的init.cmake all 验证成果第一个make all阶段(第一次给分区装载文件系统)第二个make all阶段(第二次给分区装载文件系统+挂载)创建文件系统的debug心路历程 相关查阅博客链接 linux 中“

Love 6's Private Blog 2138

《QGIS快速入门与应用基础》223:纸张大小与方向(A4/A3/自定义)

本文详细介绍了QGIS布局页面设置的核心操作,重点讲解了纸张大小与方向的设置方法。文章首先指出页面设置是地图排版的基础前提,强调合理设置可避免导出打印时出现尺寸不符等问题。随后详细说明了三种打开页面设置面板的方式,并重点解析了纸张设置的要点:标准预设纸张(A4/A3等)适用于大多数场景,提供国内常用规格对照表;自定义纸张则需谨慎使用,需注意单位选择和尺寸限制。通过界面标注图和操作步骤示意图,帮助用户掌握正确的设置方法,确保最终出图符合规范要求。文章特别提醒新手要优先使用标准预设纸张,避免常见错误,为后续地图

LuckyHanMo的博客 343

《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(下一)

文章目录相关查阅博客链接本书中错误勘误实现文件删除编写完的inode.c(inode_delete函数)编写完的dir.c(delete_dir_entry函数)编写完的fs.c(sys_unlink函数)修改完的main.cmake all 验证成果实现创建目录编写完的fs.c(sys_mkdir)修改完的main.cmake all 验证成果 相关查阅博客链接 本书中错误勘误 这个地方我思考了很久 我觉得应该而且是必须要这么做的 需要加两行代码 这个问题就是dir.c中的函数delete_dir

Love 6's Private Blog 1155

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 467

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《操作系统真象还原》第十四章 ---- 实现文件系统 任务繁多 饭得一口口吃路得一步步走啊(中一)

文章目录相关查阅博客链接本书中错误勘误部分缩写熟知闲聊时刻实现文件的打开与关闭修改完的file.c(file_open)修改完的fs.c(sys_open)修改完的file.c(file_close)修改完的fs.c(fd_local2global)修改完的fs.c(sys_close)修改完的main.cmake all 验证成果实现文件写入编写后的file.c(file_write)编写后的fs.c(sys_write)编写后的syscall.c(write函数)编写后的stdio.c(prinf函数)

Love 6's Private Blog 1172

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

操作系统4.3.4 虚拟文件系统

操作系统4.3.4 虚拟文件系统

2301_79690805的博客 232

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

操作系统引导的那点事

系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一。按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后。具体的引导工作,是由BIOS完成的。BIOS维持一个可用于引导计算机的硬件设备列表,比如本地硬盘、本地光驱、网络、USB接口设备等,然后做一个排序。BIOS会试图从整个序列的第一个设备开始,检查其状态和引导能力。比如针对光驱,则首先会判断光驱...

weixin_30872337的博客 124

万春 读《Orange’S 一个操作系统的实现》有感

万春 读《Orange’S  一个操作系统的实现》有感 本文由 “碟中碟”虚拟光驱软件开发者——万春  提供       我经常遇到一些朋友,他们熟悉8086汇编语言,并且喜欢汇编语言.(很多这样的朋友)他们在日常使用汇编语言上,一般是反汇编研究别人的二进制代码进行 逆向工程,或者动态跟踪破解软件,脱壳或者外挂反外挂等。这样使用汇编当然没有错,但是这些在日常工作或者爱好中,很多是熟能生巧...

weixin_34273046的博客 89

一次操作系统之旅

前言 题目取的有些诗意了,实际上这篇文章是我读完于渊的《一个操作系统的实现》后对该书的总结和评价。本人非科班出身(通信专业),对操作系统底层的工作原理一直有种执念,偶然的机会看到了这本书,花了两个月时间从头到尾读了一遍,我把书中的源码读完理解之后重写了一遍。如果你也想实现一个小的操作系统却又不知从何下手,这本书确实是一个不错的选择。 这本书完全是从零开始搭建了一个可以通过软盘/硬盘引导的微内核操作...

weixin_43381862的博客 209
上一篇: [LeetCode] 50. Pow(x, n)
下一篇: [操作系统] 文件系统的实现(二)
LLLZHLIU
博客等级 码龄10年 19粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值