Linux:文件与fd(未被打开的文件)

在这里插入图片描述
hello,各位小伙伴,本篇文章跟大家一起学习《Linux:文件与fd(未被打开的文件)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 !
如果本篇文章对你有帮助,还请各位点点赞!!!

话不多说,开始正题:

文章目录

    • 未被打开的文件
      • 认识磁盘结构
      • 引入文件系统
      • `Group`:
      • `inode Bitmap`
      • `Super Block`
      • 深入理解文件系统
      • `inode`和`block`到底是怎么映射的
      • 怎么拿到`inode`,我们访问用的文件名是什么
      • 如何确定分区的?

未被打开的文件

上篇文章讲述的是被打开的文件,被打开的文件是将文件放到内存中,那么未被打开的文件放在哪里呢?
答案是:放在磁盘中

那么文件最终的目的其实就是访问它,访问前得打开文件,打开文件得找到文件,就要通过路径来找,也就是说:每个文件都有自己的路径,所以我们需要一个磁盘级别的文件系统,打开文件之后就是内存级别文件系统的事情了,就是上篇文章

对于路径,我们平时买东西一般都会放在菜鸟驿站,当包裹送到就会把包裹放在哪里类似于12-4-1363这种取件码然你去取,其实12-4-1363就是路径,能够让你找到你的包裹,那么驿站就是磁盘,存放未被打开的文件的地方

那是不是只需要维护取件码,驿站就能够顺利运行了呢?
肯定没那么简单,要是17号柜子满了,12却是空空如也……一系列问题都需要进行维护

认识磁盘结构

要想真正理解文件,那么磁盘的存储结构必须得了解,我们无法想象出一个没有见过的结构
在这里插入图片描述
磁盘也是只认识二进制,磁铁也只有N和S,我们可以把磁盘认为是由许多个很小的磁铁构建而成,所以我们可以约定N是1,S是0

在这里插入图片描述
上图就是磁盘的物理结构,主轴马达会旋转,磁头会左右摇摆读取数据

下图是磁盘的存储结构:
在这里插入图片描述

  • 一个磁片两个面都可以存储数据,每一面都有磁头(header),所以读写哪一个磁头,就是读写哪一面
  • 磁头摆动其实就是定位柱面(磁道)(cylinder)
  • 磁盘旋转本质就是定位扇区(sector)
  • 扇区:是磁盘存储数据的基本单位,512字节,块设备
    所以要想修改数据,就必须将512字节的数据全部修改,整个扇区进行修改
  • 这种定位方法叫做CHS地址定位法
  • 细节:传动臂上的磁头是共进退的(这点⽐较重要,后⾯会说明)
  • 磁盘容量=磁头数×磁道(柱⾯)数×每道扇区数×每扇区字节数

对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。
但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量为256* 1024* 63* 512B=8064MB(1MB=1048576B)(若按1MB=1000000B来算就是8.4GB)

想必大家都见过磁带吧,原本是一卷一卷的,但是我们可以把它拉直,就可以看成是线性结构,我们磁盘也可以抽象成线性结构
在这里插入图片描述
这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA
在这里插入图片描述
但是无论如何怎么抽象,最终从磁盘中获取数据还得是从CHS这种方法获取,后面我会讲LBA转换成CHS,下面先讲解LBA的真实运作:

⼀个细节:传动臂上的磁头是共进退的
在这里插入图片描述

柱面是一个逻辑上的概念,其实就是每一面上,相同半径的磁道逻辑上构成柱面。
所以,磁盘物理上分了很多面,但是在我们看来,逻辑上,磁盘整体是由“柱面”卷起来的。

我们将这些柱面展开:
在这里插入图片描述
这不就是二维数组吗?所以对于我们磁盘中有n个柱面,其实就是由n个二维数组构成的

所以,寻址一个扇区:先找到哪一个柱面(Cylinder),在确定柱面内哪一个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。我们之前学过C/C++的数组,在我们看来,其实全部都是⼀维数组:
在这里插入图片描述
所以,每一个扇区都有一个下标,我们叫做LBA(Logical BlockAddress)地址,其实就是线性地址。

所以只要掌握了如何将LBA转换成CHS,操作系统就根本不需要理会CHS,只需要知道LBA就可以了,操作系统只需要知道磁盘的总容量和每个扇区的大小,就能够知道每个扇区的下标

CHS转成LBA:

  • 磁头数 * 每磁道扇区数 = 单个柱面的扇区总数
  • LBA = 柱面号C * 单个柱面的扇区总数 + 磁头号H * 每磁道扇区数 + 扇区号 S-1
    即:LBA=柱面号C*(磁头数 * 每磁道扇区数) + 磁头号H * 每磁道扇区数 + 扇区号S-1
  • 扇区号通常是从1开始的,而在LBA中,地址是从0开始的柱面和磁道都是从0开始编号的
  • 总柱面,磁道个数,扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。

LBA转成CHS:

  • 柱面号C=LBA//(磁头数*每磁道扇区数)【就是单个柱面的扇区总数】
  • 磁头号H=(LBA%(磁头数*每磁道扇区数))//每磁道扇区数
  • 扇区号S=(LBA%每磁道扇区数)+1
    “//”: 表示除取整

从此往后,我们对磁盘的认识就是以扇区为单位的一维数组

引入文件系统

一个扇区才512字节,这对于操作系统与磁盘进行IO来讲太小了,所以操作系统就设定以1kb、2kb、4kb、8kb……等为单位,Linux一般是4kb为单位,也就是8个扇区为单位,这8个扇区叫做数据块,那么转换为LBA—>块号*8 + [1,8]即可

所以对于操作系统来讲,磁盘就是以块为单位的一维数组,那么操作系统该如何管理磁盘呢?
先描述再组织!

对于磁盘来讲,成百上千GB大小确实不太好管理,但是我们能够将磁盘进行分区,区内还可以进行分组,组管好了区就管好了,区管好了磁盘就管好了,这就是分治思想:
在这里插入图片描述
在这里插入图片描述

Group

  • inode知识点:
  • 文件 = 内容 + 属性
  • 属性也是数据,结构体的方式构建出来,inode
  • 一个文件一个inode, inode->属性数据的集合
    在这里插入图片描述

但是在inode里并没有存放文件名这个属性!!(后续会讲)

对于OS,磁盘的基本单位就是块4kb,一个块有多少个inodeinode的大小一般是128字节)是可以算出来的,inode是不能够重复的(但有前提),我们可以在命令行中查看inode

ls -l -i

在这里插入图片描述
inode Table存放的就是inode属性集,那么内容是存放在哪里?—— data Block

data Block里面是以4kb为单位的块存放着数据,那么可以看出Linux下,文件属性和文件内容分开存储

有了inode怎么找data block?其实在inode里还有属性:
在这里插入图片描述

inode Bitmap

在一个group中,inode是如何分配的?又是怎么知道在inode Table中哪个位置可以使用?这就和inode Bitmap有关了,就是位图,想必大家对位图不陌生吧,0000 0000 0000 0001这就表示第0号已经被占用,0000 0000 0000 1001这就表示第0、3号已经被占用……

所以新建一个文件,首先就要分配inode,在位图里查找空位置,把01,然后填写inode的属性,所以我们只需要知道inode就可以找到文件

那么删除文件实际上就是找到位图上的位置,把10,所以理论上来讲,删除了一个文件,是可以被恢复的,就像我们的回收站一样,但是清空回收站之后再回复就有难度了,并且还不一定能够全部恢复,因为在操作的时候很有可能覆盖了原有数据,所以一不小心删除重要文件,最好不要动,怕覆盖原有文件数据

Super Block

Super Block超级块,分布在group前头,但并不是每一个group都有超级块

  • 超级块就是表示文件系统
  • 每个超级块都是一样的,所以若某个超级块挂掉了,可以迅速从其他超级块覆盖回去
  • 超级块穿插在分区之间,散落在不同的分组里面
  • 因为一旦超级块挂掉了,这个分区也就挂掉了,所以并不是所有group都有超级块

深入理解文件系统

在每一个group里面,inodedata block的个数都是固定的

总结起来,inodedata block之间的关系可以通过以下两种情况来描述:

  1. inode没用完,而data block用尽
  • 原因:当文件系统内存在大量的大文件时,每个文件可能需要大量的data block来存储数据,但每个文件只占用一个 inode。这样,虽然有足够的 inode,但是由于大文件占用了大量的 data block,导致 data block 被用尽,而 inode 仍然没有完全用完
  • 典型情况:块组中有少量的大文件,导致 data block 很快用完,但 inode 没有用完
  1. inode用完,而data block剩余
  • 原因:当文件系统中存在大量的小文件时,每个文件都需要一个 inode,但是这些小文件所占用的 data block 非常少。这样,虽然 inode 很快用尽,但每个小文件只占用少量的 data block,导致大量 data block 没有被使用
  • 典型情况:块组中有大量的小文件,每个文件只需要很少的 data block,导致 inode 很快用完,但 data block 仍然有剩余

总结:

  • inode 和 data block 是文件系统分配资源的两种基本单位,它们的使用情况受到文件大小和文件数量的影响
  • 大文件导致 data block 用尽,inode 没用完;小文件导致 inode 用尽,data block 剩余

这两种情况在实际的文件系统设计中都可能发生,尤其是在文件大小分布不均的情况下

关于inode

  1. inode以分区为单位,一套inode
  2. inode分配的时候,只需要确定起始inode即可
    举个例子:比如说在一个分区里,第0号group的起始start_inode为1,第2号group的起始start_inode是10000,第n号group……

所以,每一个inode的编号是固定的,这个起始start_inode是存放在GDT也就是Group Descriptor Table

关于block也是统一编号的,所以只需要知道起始块号就行了

inode怎么分配?该组的起始start inode加上inode Table的编号即可,这样就可以确定唯一性
block也是如此分配,所以blockinode具有全局唯一属性,在上述inode文件属性中指向block指针是可以跨组指向block,也就使得大文件可以被创建

总结出:对于blockinode都存放在GDT里,那么只需要将Super blockGDT管理好就能够将group管理好,怎么管理?
先描述再组织

就是以链表的形式进行管理,就转换为对链表的增删查改

inodeblock到底是怎么映射的

在这里插入图片描述
对于12个直接块指针,顾名思义,直接指向块号,但是12个显然不够,所以加入了一级间接块索引指针,二级间接块索引指针,三级……

一级间接块索引指针指向的块里面存放的是块号,然后再指向块,二级间接块索引指针就不用我多说了吧,指向的块存放的是一级间接块索引指针,对于三级间接块索引指针……

怎么拿到inode,我们访问用的文件名是什么

还记得上述讲到的细节吗?在inode属性里并没有维护着文件名

那么存放在哪里呢?对于文件分两种:普通文件和目录文件
对于目录文件也有自己的属性和内容,也就是说目录也有自己的inode

ls -lid

在这里插入图片描述
那对于目录的内容是啥?目录的内容当然是数据块
那里面就是文件名和inode的映射关系啦,噢,是不是有点恍然大悟,突然明白了为什么文件名不在inode属性当中

我们人类对于数字是不敏感的,但是名字可以,所以文件名那就是存放在目录里面,所以大家对于目录的权限应该有了新的认知,为什么没有读权限就不能读,为什么没有写权限就不能创建新文件,为什么没有执行权限就进不去

但是目录也是文件,也有文件名,也就要回溯到上级目录

找到文件名->首先要打开当前目录->当前目录inode编号,也是文件!!!也有文件名啊!->逆向的路径解析!

一直回溯到根目录,根目录是已经固定了的

这也就是为什么查找文件的时候需要完全路径,路径是谁提供的?当然是进程,每个进程都有维护着自己的CWD,就是为了方便查找文件,方便路径解析

但是这么一个一个目录解析路径本质上不就是不断的访问磁盘文件吗?这样不断地交互效率实在是低下,所以作为聪明的操作系统,Linux引入了缓存,用来缓存路径结构

以什么结构缓存?那当然是树结构,以根目录作为根节点,当你第一次访问该目录,就形成结构缓存该路径,当下次再访问的时候就直接访问缓存好的数据,所以这明显就是内存级别的数据结构,纯内存struct dentry

如何确定分区的?

对于系统有多个分区,每个分区都有许多目录,但是只有分区时无法直接访问的,必须要“挂载”到目录上,分区才能够通过路径的方式进行访问,这就使得每一个分区天然就有了基本的路径,所以路径的前缀就已经说明了你在哪一个分区里面

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流行的开源高性能数据同步工具 - Apache SeaTunnel 整体架构运行原理

概述 背景 数据集成在现代企业的数据治理和决策支持中扮演着至关重要的角色。随着数据源的多样化和数据量的迅速增长,企业需要具备强大的数据集成能力来高效地处理和分析数据。SeaTunnel通过其高度可扩展和灵活的架构,帮助企业快速实现多源数据的采集、…

使用eNSP配置GRE VPN实验

实验拓扑 实验需求 1.按照图示配置IP地址 2.在R1和R3上配置默认路由使公网区域互通 3.在R1和R3上配置GRE VPN,使两端私网能够互相访问,Tunne1口IP地址如图 4.在R1和R3上配置RIPv2来传递两端私网路由 实验步骤 GRE VPN配置方法: 发送端&#x…

C语言的灵魂——指针(1)

指针是C语言的灵魂,有了指针C语言才能完成一些复杂的程序;没了指针就相当于C语言最精髓的部分被去掉了,可见指针是多么重要。废话不多讲我们直接开始。 指针 一,内存和地址二,编址三,指针变量和地址1&#…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日,国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上,海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力,荣获了“数字安全产业贡献…

Couchbase UI: Server

在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址&#xff1…

解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题

操作系统:CentOS 9 Zabbix版本:Zabbix7.2 问题描述:主机图形中文字符乱码 解决方案: # 安装字体配置和中文语言包 sudo yum install -y fontconfig langpacks-zh_CN.noarch # 检查是否已有中文字体: fc-list :lan…

git gui 笔记

这里写目录标题 1. [下载安装git](https://blog.csdn.net/jiesunliu3215/article/details/111559125)2. [下载Git Gui](https://git-scm.com/downloads)3. 上传下载代码4. 创建版本5. 版本切换-checkout参考狂神说 git教程 -讲的是真的好gitee的git帮助 其他 1. 下载安装git 2…

HTML-新浪新闻-实现标题-排版

标题排版 图片标签&#xff1a;<img> src&#xff1a;指定图片的url&#xff08;绝对路径/相对路径&#xff09; width&#xff1a;图片的宽度&#xff08;像素/相对于父元素的百分比&#xff09; heigth&#xff1a;图片的高度&#xff08;像素/相对于父元素的百分比&a…

【太阳——几何计算】

题目 代码 #include <bits/stdc.h> using namespace std; using PII pair<int, int>; using ll long long; const int N 1e5 10; set<PII> s; bool st[N]; struct node {int x, y, id; } arr[2 * N]; int main() {int n, X, Y;cin >> n >> …

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…

面向长文本的多模型协作摘要架构:多LLM文本摘要方法

多LLM摘要框架在每轮对话中包含两个基本步骤:生成和评估。这些步骤在多LLM分散式摘要和集中式摘要中有所不同。在两种策略中,k个不同的LLM都会生成多样化的文本摘要。然而在评估阶段,多LLM集中式摘要方法使用单个LLM来评估摘要并选择最佳摘要,而分散式多LLM摘要则使用k个LLM进行…

docker 部署 java 项目详解

在平常的开发工作中&#xff0c;我们经常需要部署项目&#xff0c;开发测试完成后&#xff0c;最关键的一步就是部署。今天我们以若依项目为例&#xff0c;总结下部署项目的整体流程。简单来说&#xff0c;第一步&#xff1a;安装项目所需的中间件&#xff1b;第二步&#xff1…

Crawl4AI 人工智能自动采集数据

文章目录 1 使用 Crawl 的步骤2 AI 智能体应用实例3 结语 Crawl是一款免费的开源工具&#xff0c;利用AI技术简化网络爬取和数据提取&#xff0c;提高信息收集与分析的效率。它智能识别网页内容&#xff0c;并将数据转换为易于处理的格式&#xff0c;功能全面且操作简便。 定位…

使用vitepress搭建自己的博客项目

一、介绍can-vitepress-blog 什么是CAN BLOG CAN BLOG是基于vitepress二开的个人博客系统&#xff0c;他能够方便使用者快速构建自己的博客文章&#xff0c;无需繁琐的配置和复杂的代码编写。 CAN BLOG以antdv为UI设计基础&#xff0c;简洁大方&#xff0c;界面友好&#xf…

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中&#xff0c;可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计&#xff0c;本文从excel函数到数据透视表的方法&#xff0c;从简单需求到复杂需求&#xff0c;采用不同的方法进行讲解&#xff0c;尤其是通过数据透视表的强大功能大…

低代码系统-产品架构案例介绍、得帆云(八)

产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台&#xff0c;区别于阿里云、腾讯云 Dehoop 指…

mybatis(78/134)

前天学了很多&#xff0c;关于java的反射机制&#xff0c;其实跳过了new对象&#xff0c;然后底层生成了字节码&#xff0c;创建了对应的编码。手搓了一遍源码&#xff0c;还是比较复杂的。 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE …

1.23 补题 寒假训练营

E 一起走很长的路&#xff01; 输入描述 第一行输入两个整数 n,q&#xff08;1≤n,q≤210^5&#xff09;&#xff0c;代表多米诺骨牌的个数和询问次数。 第二行输入 n 个整数 a1,a2,…,an​&#xff08;1≤ai≤10^9&#xff09;&#xff0c;表示多米诺骨牌的重量。 此后输入…

从入门到精通:RabbitMQ的深度探索与实战应用

目录 一、RabbitMQ 初相识 二、基础概念速览 &#xff08;一&#xff09;消息队列是什么 &#xff08;二&#xff09;RabbitMQ 核心组件 三、RabbitMQ 基本使用 &#xff08;一&#xff09;安装与环境搭建 &#xff08;二&#xff09;简单示例 &#xff08;三&#xff09;…