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.mzph.cn/pingmian/68319.shtml

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

相关文章

自动驾驶中的多传感器时间同步

目录 前言 1.多传感器时间特点 2.统一时钟源 2.1 时钟源 2.2 PPSGPRMC 2.3 PTP 2.4 全域架构时间同步方案 3.时间戳误差 3.1 硬件同步 3.2 软件同步 3.2.3 其他方式 ① ROS 中的 message_filters 包 ② 双端队列 std::deque 参考: 前言 对多传感器数据…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络(CNN),最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站,所以突发奇想,在本地装个WordPress玩玩吧,就尝试着装了一下,因为之前电脑上就有MySQL,所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题,也就是启动过…

写一个存储“网站”的网站前的分析

要创建一个能够存储自己网站内容的“网站”,通常意味着你希望有一个可以存储网站数据、文件、内容等信息的系统。为了实现这一目标,可以考虑构建一个内容管理系统(CMS),这个系统能够帮助你存储和管理网站上的内容。 图片仅供参考 以下是如何实现一个可以存储自己网站内容…

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言: 本文内容基本来自江协,整理起来方便日后开发使用。MCU:STM32F103C8T6。 一、配置流程 1、开启GPIO,TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…

KIMI K1.5:用大语言模型扩展强化学习(论文翻译)

文章目录 KIMI K1.5技术报告摘要 1. 引言2. 方法:基于大语言模型的强化学习2.1 强化学习提示集整理2.2 长思维链监督微调2.3 强化学习2.3.1 问题设定2.3.2 策略优化2.3.3 长度惩罚2.3.4 采样策略2.3.5 训练方法的更多细节 2.4 长到短:短思维链模型的上下…

python:taichi 高性能可视化 Demo 展览

安装 pip install taichi taichi-1.7.3-cp39-cp39-win_amd64.whl (83.1 MB) 运行 cmd where ti D:\Python39\Scripts\ti.exe #-- taichi 高性能可视化 Demo 展览 ti gallery [Taichi] version 1.7.3, llvm 15.0.1, commit 5ec301be, win, python 3.9.13********************…

电脑无法开机,重装系统后没有驱动且驱动安装失败

电脑无法开机,重装系统后没有驱动且驱动安装失败 前几天电脑突然坏了,电脑卡住后,强制关机,再开机后开机马上就关机。尝试无数次开机后失败,进入BIOS界面,发现已经没有Windows系统了。重新安装系统后&…

2024年度总结——理想的风,吹进现实

2024年悄然过去,留下了太多美好的回忆,不得不感慨一声时间过得真快啊!旧年风雪尽,新岁星河明。写下这篇博客,记录我独一无二的2024年。这一年,理想的风终于吹进现实! 如果用一句话总结这一年&am…

Juc22_什么是中断、interrupt、isInterrupted、interrupted方法源码解析、如何使用中断标识停止线程

目录 ①. 什么是中断 ②. 源码解读(中断的相关API) ③. 如何使用中断标识停止线程 ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了 ②. 在Java中没有办法立即停止…

《用DOTS解决实际需求》集锦

去年作者发布了一篇《DOTS-ECS系列课程》,深受同学们的好评!前期课程是基于0.51版本录制的,DOTS升级至1.0版本后,同学们纷纷希望能使用DOTS 1.0版本录制实战课程。 今年作者带着DOTS 1.0版本的实战课程回来啦!&#x…

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新校园网设计。 我是一个萌新小白,有误地方请大家指正,谢谢…

Crawl4AI 人工智能自动采集数据

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

KVM/ARM——基于ARM虚拟化扩展的VMM

1. 前言 ARM架构为了支持虚拟化做了些扩展,称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构,引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…

【go语言】数组和切片

一、数组 1.1 什么是数组 数组是一组数:数组需要是相同类型的数据的集合;数组是需要定义大小的;数组一旦定义了大小是不可以改变的。 1.2 数组的声明 数组和其他变量定义没有什么区别,唯一的就是这个是一组数,需要给…

node.js 07.npm下包慢的问题与nrm的使用

一.npm下包慢 因为npm i 默认从npm官网服务器进行下包,但是npm官网服务器是海外服务器所以响应很慢. 于是我们通过npm下包的时候通常用淘宝镜像进行下包,下面是切换到淘宝镜像地址下包的操作. 二.nrm的使用 nrm是一个管理切换npm下包地址的工具,可以快速切换下包的地址. 安…

Windows10官方系统下载与安装保姆级教程【U盘-官方ISO直装】

Windows 10 官方系统安装/重装 制作启动盘的U盘微软官网下载Win10安装包创建启动盘U盘 安装Win10 本文采用U盘安装Windows10官方系统。 制作启动盘的U盘 微软官网下载Win10安装包 微软官网下载Win10安装包链接:https://www.microsoft.com/zh-cn/software-downloa…

[MySQL]MySQL数据库的介绍和库相关操作

目录 一、数据库介绍 1.什么是数据库 2.为什么使用数据库 3.数据库的操作运行逻辑 4.MySQL架构 5.SQL语句的分类 二、数据库的操作 1.数据库的连接 2.数据库的操作 创建数据库 查看数据库 显示数据库的创建语句 删除数据库 修改数据库 3.字符集和校验集 查看系…

亚博microros小车-原生ubuntu支持系列:13 激光雷达避障

一 背景知识 小车发了了数据包含激光雷达数据,类型是sensor_msgs/msg/LaserScan bohubohu-TM1701:~$ ros2 node info /YB_Car_Node /YB_Car_Node Subscribers: /beep: std_msgs/msg/UInt16 /cmd_vel: geometry_msgs/msg/Twist /servo_s1: std_msgs/…

机器学习 ---逻辑回归

逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 baseline 模型,以方便后期更好的挖掘业务相关信息或提…