文件系统之程序是怎么打开文件进行操作的

news2024/11/17 21:30:43

本篇文章自顶向下,从文件系统的上层出发讲到磁盘,帮助理解程序是如何打开文件并进行后序的读写操作的,读到后面,前面的一些疑惑就得到解决

介绍相关概念

注意,目录也是文件

文件描述符

每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包涵一个指针数组的struct_file*fd_array 每个元素都是一个指向打开文件的指针(fd)!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。
当我们使用系统调用open来打开文件时,我们会发现打开open函数会返回一个int类型的数据,在man手册中我们可以看到,这个int类型的数据叫做文件描述符,简称 fd。那么open函数是怎么做的呢?
OS会拿到open函数传入的实参pathname,然后根据路径名在文件系统中的目录项中查找该文件,如果找到了就返回 fd,没有找到就返回-1,并设置错误码。

在这里插入图片描述
在进程PCB中,会维护一个文件描述符表,该表可以想象为1个数组,fd是索引,该表存放的就是进程所打开的文件的文件描述符 fd,文件描述符一般会由OS选择表中最小的没有被使用的描述符作为当前要打开的文件的 fd。
fd 与 文件的 iNode 相关联,通过fd 就可以找到文件的iNode。

文件表

  • 文件表处于文件系统中间的位置,属于进程,被进程单独维护。
  • 在Linux系统中,文件表通常是由一个链表来维护的,每个文件表项都有一个指向下一个文件表项的指针。
  • 其上下层关系如下:
    • 下层 - iNode :

      • inode和文件数据块
      • 每个文件在磁盘上都有一个对应的inode,存储文件元信息
      • 文件数据存储在数据块中
      • inode包含了指向数据块的指针
    • 中层 - 文件表

      • 文件表跟踪每个进程打开的文件信息
      • 每打开一个文件,在文件表创建一个文件表项
      • 文件表项包含了文件描述符、打开模式、当前偏移等信息
      • 通过文件描述符可以找到对应的inode
    • 上层 - 虚拟文件系统(VFS)

      • VFS提供统一的文件系统操作接口给上层应用,如open
      • 接收应用层的操作请求,转换为对具体文件系统的调用
      • 调用文件表接口实现对打开文件状态的跟踪

iNode(index-node)

  • iNode在linux内核中是一个结构体,每一个文件对应一个iNode号,包含文件的各种属性信息,比如文件占用的逻辑块数量,文件实际数据块的指针数组(指向了文件数据实际在磁盘中存储的位置),文件的权限,文件的修改时间,文件大小等信息。我们要通过 fd 找到 iNode,再通过iNode中设置的文件数据存储的数据块的地址来找到文件数据实际存储在磁盘的哪个扇区(物理块)。
  • 要注意的是,iNode中所指向的数据块地址的字段不一定是直接指向数据实际存储的地址,iNode中存储的可能是间接地址。
  • 具体地说,inode中存储了12个指向数据块的直接指针(如果文件大小<=12个数据块,这些指针就足够了),还包括一个一级间接块指针、一个二级间接块指针和一个三级间接块指针。这些指针分别指向一级、二级、三级块指针数组,这些数组中存储了更多的数据块地址。如果inode中的数据块数组直接索引到数据,那么数据块数组的大小开多大就是一个问题。所以通过上面存储指针的方式,文件系统可以支持非常大的文件,同时减少了inode的空间占用,解决了inode的存储空间问题。
  • 同时,指针块不需要完全填满,可以按需分配,避免过多无用空间。
  • 通过直接指针和多级间接指针的组合,iNode可以支持对大文件的数据寻址,最大可以支持GB级的数据量。

磁盘抽象之文件系统

文件系统是OS的一个子集,用于管理文件。这里介绍一下文件系统的简单布局:在这里插入图片描述

各个字段介绍

  • 磁盘被划分为一个或多个分区,每个分区中有一个独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record,MBR),用来引导计算机。该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。在计算机被引导时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区,读入它的第一个块,称为引导块(boot lock),并执行之。引导块中的程序将装载该分区中的操作系统。为统一起见,每个分区都从一个引导块开始。
  • 说人话就是:
    • 想象一下你的电脑是一辆车,启动电脑就像启动车辆一样需要一个启动过程。
    • MBR就像车钥匙,当你转动钥匙(加电启动)时,BIOS读入并执行MBR,它(MBR)包含了启动计算机最基本的程序(引导代码)。这些基本程序知道下一步应该去运行哪些程序,比如启动Windows或Linux系统的核心程序。
    • 类似钥匙会转动点火、启动发动机,MBR中的引导代码启动了计算机,将控制权转交给操作系统,使计算机能正常工作。
    • 另外在MBR的结尾是分区表,该表给出了硬盘的每个分区的起始和结束地址。记载了硬盘里面数据都存放在哪些区域,就像车里各个存放物品的地方一样。但现在新车型(新电脑)已经用更先进的分区方式了。这里不做介绍。
  • 超级块(Superblock)
    我们可以把文件系统想象成一个图书馆。
    超级块就像图书馆的目录,它记录了这个图书馆的全局信息:
  • 图书馆有多大,可以存放多少本书(文件系统的大小)
  • 书籍资源如何组织,按哪些规则排序(文件系统的结构和布局)
  • 书籍的总数和可用数(文件系统的空间使用情况)
  • 书籍增加或删除的基本规则(文件系统如何分配空间) 等等。
  • 所以:
    当你进入图书馆,首先需要查阅目录,了解这个图书馆的整体情况。
    同样,当操作系统访问文件系统时,首先需要读取超级块,以了解文件系统的全局信息。
    通过超级块,操作系统知道如何组织和管理文件系统,像添加删除文件,分配空间等。
    可以看出超级块非常重要,它为操作系统提供了打开并使用这个“文件系统图书馆”所需要的全部信息。
    所以简单来说,超级块就像图书馆的目录,记录了文件系统的全局信息,帮助操作系统理解和管理文件系统。
  • 空闲空间管理
    • 可以把文件系统比作一个储物柜,里面有许多不同大小的抽屉。
    • 这些抽屉可以用来存放文件。当需要存储新文件时,就需要找到大小合适的抽屉来存放。
      那么空闲空间管理就好比是一个记录,跟踪哪些抽屉是空的,大小是多少。
      当你要把新的文件放入柜子时,可以查看记录,很快找到合适大小的空抽屉来使用。
    • 如果没有空闲空间管理的记录,每次要放新文件时,你就需要一个一个抽屉打开查看能不能放得下,十分低效。
    • 同样,文件系统中也需要空闲空间管理来跟踪空闲的存储空间,以方便快速找到合适的空间存放新文件。
    • 一般来说,文件系统会以一定的粒度来划分空闲空间,并用位图等数据结构跟踪空闲块。
    • 所以简单来说,空闲空间管理就像储物柜的空位记录,它帮助文件系统快速高效地找到空闲空间以存储新文件。
  • i结点
    就是iNode结点,包含了各种文件相关属性信息(也称元数据)。
  • 根目录文件和目录
    • 在Windows里,C盘可以视为一个分区,C盘下的文件夹就相当于这个分区的目录。
      例如C盘下有一个Windows文件夹,这个Windows文件夹就是C盘根目录下的一个子目录。
      再比如在Windows文件夹里面,有个System32文件夹,那么这个System32就是Windows目录下的一个子目录。
    • 又如在System32文件夹里面,有个drivers文件夹,那么drivers文件夹就是System32的子目录。
      也就是说,C盘本身可以视为根目录,里面的Windows文件夹是C盘的一个子目录,System32是Windows目录的子目录,drivers是System32的子目录。
    • 通过这种目录树的逻辑组织,文件系统可以层层包含子目录和文件,就像文件夹套娃一样。
      我们通过从根目录开始,一级一级地打开子目录,就可以找到需要的文件,非常方便管理。
    • 所以在Windows的文件系统中,根目录代表一个磁盘分区,子目录代表当前目录下的子文件夹,它们一起构成了文件资源的目录树结构。
      • 另外,文件,emmm,就是文件,没什么解释的。

磁盘的寻址方式

磁盘是典型的块设备,硬盘分区被划分为一个个的block(块,也叫扇区)。一个block的大小是由格式化的时候确定的,并且不可以更改。
我们将磁盘分成一个个的扇区,如图中蓝色线条组成的三角形一样,又称物理块,我们磁盘的寻址一般以一个扇区(一个块)为单位进行寻址。

在这里插入图片描述

串起来

通过上面的基础知识铺垫,我们现在可以串一串程序究竟是怎么打开一个文件并在后序对文件进行操作的了。

  • 程序运行起来,调用语言相关文件打开函数,或直接使用系统调用。
  • 在打开文件时,VFS层(虚拟文件系统)根据文件路径在磁盘的目录树中找到iNode,如果找到该文件,那么为此文件分配一个文件描述符,维护在进程的文件描述符表中,在当前进程的文件表中创建文件表项,建立起 fd 与 iNode 的映射关系,并记录打开状态。
  • 如果使用的是系统调用则返回文件描述符,如果是语言封装的文件相关函数,那么返回语言规定的返回值,该返回值封装了 fd。比如c语言中的FILE*,该结构体指针就封装了 fd。
  • 打开文件后对文件读写时,通过文件描述符在文件表中查找记录,进行偏移定位,找到对应的iNode,通过提取iNode中具体的文件所在逻辑块位置,通过块位映射表(维护了逻辑块与物理块的映射关系,类似与虚拟内存的页表)最终转换为对具体物理块的操作。
  • 关闭文件时,文件表项被删除,资源释放。

用通俗的语言解释上下层关系:

  • 把文件系统比作一个组织机构,不同层次负责不同的工作:
  • 底层员工(inode)负责文件存储和元信息。
  • 中间管理(文件表)负责跟踪当前正在处理的文件项目。
  • 高层主管(VFS)与外界交流,接受任务请求。
  • 当一个新任务来时,主管交给管理层处理,管理层创建一个项目跟踪记录。
  • 员工根据记录去实际操作和处理项目,完成时汇报管理层。
  • 管理层最后将项目记录删除,汇报主管任务完成。
  • 这样不同层级最终协同完成对文件操作的管理。

几个关于文件系统的疑问

我们删除文件,是直接对磁盘上的文件清理了吗?

不,我们只是对文件的iNode进行了处理。因为有文件系统这一层抽象,我们的计算机是通过文件系统来管理文件的,那么我们也就只需要在文件系统中要删除的文件所对应的iNode删掉就好,没有了索引,也就相当于不存在,下一次别的文件就可以直接覆盖磁盘上的这一块区域,也是效率上的提示。

我们常说的格式化,比如格式化硬盘,什么意思

实际上就是对硬盘进行初始化,加载文件系统,向该磁盘分区写入文件系统的管理属性信息。这里我们也可以看到,其实每个分区都会有一个单独的文件系统进行管理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman接口测试完整篇,全网唯一

前言 今天给大家分享的内容是接口测试必备的postman测试工具的使用&#xff1a;postman发送get与post请求&#xff0c;变量的设置与引用&#xff0c;文件的导入与导出&#xff0c;断言机制&#xff0c;参数化&#xff08;数据驱动&#xff09;&#xff0c;批量执行测试集&…

算法通关村 | 透彻理解动态规划

1. 斐波那契数列 1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;..... f(n) f(n-1) f(n-2) 代码实现 public static int count_2 0;public int fibonacci(int n){if (n < 2){count_2;return n;}int f1 1;int f2 2;i…

探索单链表数据结构:理解与实现

文章目录 &#x1f34b;引言&#x1f34b;什么是单链表&#xff1f;&#x1f34b;单链表的基本操作&#x1f34b;单链表的实现&#x1f34b;练习题&#x1f34b;总结 &#x1f34b;引言 在计算机科学和数据结构中&#xff0c;链表是一种基本且重要的数据结构&#xff0c;用于存…

基于springboot财务管理系统springboot006

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

【zabbix监控三】zabbix之部署代理服务器

一、部署代理服务器 分布式监控的作用 分担server的几种式压力解决多机房之间的网络延时问题 1、搭建proxy主机 192.168.88.50 关闭防火墙和安全机制&#xff0c;修改主机名 设置 zabbix 的下载源&#xff0c;按照 zabbix-proxy rpm -ivh \ https://mirrors.aliyun.com/zab…

01-Maven入门

1 Maven简介 1.1 Maven是什么 Maven 是一个用于构建和管理 Java 项目的工具。它提供了一种标准化的项目结构和构建流程&#xff0c;可以自动化地处理项目的依赖管理、编译、测试、打包和部署等任务。 Maven 使用一个基于 XML 的配置文件&#xff08;pom.xml&#xff09;来描…

【C++面向对象侯捷】12.虚函数与多态 | 13.委托相关设计【设计模式 经典做法,类与类之间关联起来,太妙了,不断的想,不断的写代码】

文章目录 12.虚函数与多态举例&#xff1a;委托 继承【观察者模式】13.委托相关设计Composite 组合模式Prototype 原型模式 12.虚函数与多态 纯虚函数 一定要 子类重新定义的 继承和复合 关系下的构造和析构 举例&#xff1a;委托 继承【观察者模式】 13.委托相关设计 问题…

建材行业微信小程序开发实战经验分享

随着互联网的迅猛发展&#xff0c;电子商务成为了人们日常购物的主要方式之一。而微信小程序的兴起更是为商家提供了一个全新的线上销售渠道。在建筑材料选购领域&#xff0c;开发一个微信小程序商城平台能够有效地提升用户的购物体验和商家的销售效益。 为了实现建筑材料选购平…

Android studio中如何下载sdk

打开 file -> settings 这个页面, 在要下载的 SDK 前面勾上, 然后点 apply 在 platforms 中就可以看到下载好的 SDK: Android SDK目录结构详细介绍可以参考这篇文章: 51CTO博客- Android SDK目录结构

OpenAI ChatGPT API 文档之 Embedding

译者注&#xff1a; Embedding 直接翻译为嵌入似乎不太恰当&#xff0c;于是问了一下 ChatGPT&#xff0c;它的回复如下&#xff1a; 在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称…

Python程序设计实例 |爬取网络中的小说

网络文学是新世纪我国流行文化中的重要领域&#xff0c;年轻人对网络小说更是有着广泛的喜爱。本文以抓取网络小说正文为例编写一个简单、实用的爬虫脚本。 01、分析网页 很多人在阅读网络小说时都喜欢本地阅读&#xff0c;换句话说就是把小说下载到手机或者其他移动设备上阅读…

TQ210-Bootloader-Uboot(LTS)

Bootloader的作用 Bootloader是位于计算机系统启动过程中的程序&#xff0c;它的主要作用是将操作系统从磁盘等外部存储介质加载到计算机内存中&#xff0c;并启动操作系统执行。Bootloader通常包括硬件初始化、自检、异常处理和启动操作系统等功能。它是计算机系统中非常重要…

Mac电脑系统怎么样才能干干净净地卸载应用程序?

Mac系统怎么样才能干干净净地卸载应用程序&#xff0c;不留下隐私数据和用户信息呢&#xff1f;如果有方法的话&#xff0c;那么该方法对于Mac电脑小白是否友好呢&#xff1f; CleanMyMac就是一款用于清理Mac系统下应用程序的一款清理工具&#xff0c;其内置了应用程序的安全卸…

第二证券:智能网联汽车产业迎催化 容量电价政策出台可期

昨日&#xff0c;A股延续调整态势&#xff0c;沪指失守3100点&#xff0c;深成指跌破10000点大关&#xff0c;创业板跌约1%再创阶段新低&#xff1b;两市成交额保持在地量水平&#xff0c;再创年内新低。到收盘&#xff0c;沪指跌0.77%报3084.7点&#xff0c;深成指跌0.9%报998…

速卖通新品如何推广,速卖通的推广渠道有哪些?——站斧浏览器

速卖通的推广渠道非常多样化&#xff0c;卖家可以根据自己的需求和预算选择合适的渠道来推广产品&#xff0c;提高曝光度和销售量&#xff0c;能够有效地提高产品的知名度和信任度。 速卖通新品如何推广&#xff1f; 速卖通上有数以百万计的卖家&#xff0c;每天都有大量的新…

批量寄件教程

快递行业的发展&#xff0c;和企业之间其实是正向的影响。为什么这么说呢&#xff1f;企业因公寄件&#xff0c;能为快递公司贡献一定寄件量&#xff0c;而快递行业的发展&#xff0c;不管是运输速度的提升&#xff0c;服务质量的提高&#xff0c;都能为企业的发展提供帮助&…

气膜建筑在施工工期方面的优势

充气膜建筑基础处理简单&#xff0c;迁移的损耗非常小&#xff0c;拆装方便&#xff0c;可快速安装&#xff0c;快速拆卸&#xff0c;可以很容易地建成季节性建筑&#xff0c;解决露天场馆因为“雨、晒、冷、雪”等导致部分时间不能营业的难题。 气膜建筑的柔性特点及其简约性使…

Stable Diffusion WebUI插件posex安装以及无法使用完美解决办法汇总

posex是一个很好用的3Dopenpose编辑器。 我们只需要去官网找到源码就可以查看其用法。 对于安装大家应该都知道怎么去安装。 1. 如何安装 (1)一体包安装方式 类似于秋叶一体包直接在webui界面搜索posex就可以直接install。 最新版本好像已经取消了。 (2)手动安装方式…

记一次MySQL安装过程中遇到的问题

由于太久没用MySQL&#xff0c;今天在重装MySQL时遇到一个问题&#xff0c;被卡了近2个小时。。。。。。 由于我本人原先安装过MySQL&#xff0c;所以在重装的时候必须要先卸载原先的MySQL。 下面先给出正确的卸载流程&#xff08;作者就是在卸载的时候操作失误导致安装过程被…

Python灰帽编程——定制EXP之RCE

文章目录 定制EXP之RCE1. 常见模块介绍1.1 base641.1.1 base64 编码1.1.2 base64 解码 1.2 string 2. 常规 EXP 编写2.1 phpstudy_2016-2018_rce2.1.1 漏洞利用脚本2.1.2 进阶脚本 2.2 SQL 注入 EXP2.2.1 布尔盲注2.2.2 延时注入 2.3 metinfo_5.0.4 EXP编写2.3.1 SQL注入漏洞 3…