Linux查看一个文件的时候发生了什么?

news/2025/10/12 19:27:41/文章来源:https://www.cnblogs.com/chucz/p/19137087

Linux查看一个文件的时候发生了什么?

画板

概念辨析

整体的关系是这样的:

1653388487166-1a9a8a55-3b44-45ed-acff-b47a9d310f39.png

下面来逐个介绍图中的内容。

文件系统

  • 磁盘文件系统:按照指定的格式和规则直接将数据存在磁盘中,Ext 2/3/4等等
    • 拿到磁盘首先格式化为具体的磁盘文件系统,然后对磁盘分区。分区之后挂载到不同的操作系统目录(虚拟文件系统某一个节点),就可以使用了。
  • 网络文件系统:类似于磁盘文件系统,也是特定场景特定格式的文件系统
  • 虚拟文件系统:操作系统自己定义的规范,屏蔽不同磁盘文件系统的差异,提供统一接口给上层使用

虚拟文件系统

也就是vfs,看做是一棵树:

1653385206337-e4e6fb16-dc6b-4c9f-a279-aebf4137f2e1.png

这个树上的节点就是我们常见的文件夹名字,虚拟目录树是Linux的一个规范,结构是稳定化的。至于是哪一个文件系统挂载到这个树上的哪个节点是可以灵活改变的!!!

df -h 查看虚拟目录树挂载的真正物理地址。磁盘分区(也就是文件系统。都按照一定的文件系统规则进行了格式化)挂载到VFS 树的不同目录节点,其中系统启动会将内核的镜像文件系统(图中的/dev/sda1)加载之后,挂载到虚拟节点 /boot 下,会将操作系统(图中的/dev/mapper/centos-root)的文件系统挂载到虚拟节点 / 下,所以其实是 /dev/sda1 的文件系统覆盖了 /dev/mapper/centos-root 对于虚拟节点 /boot 的挂载,可以自己手动去除虚拟节点 /boot 上文件系统/dev/sda1 的挂载,得到 /boot 就是空的目录了。

1653384558183-89d83367-55d1-4bf0-b02a-98a2618e9139.png

文件描述符

1653388467444-bfab337c-0600-43cc-82a7-d6cceb50b8ce.png

  • 进程PCB
    • 进程控制块,进程存在的唯一标识,包含进程的状态,优先级,打开文件列表,内存空间地址信息,CPU相关的寄存器值。
  • 文件描述符数组:存放文件指针
    • 系统为每一个进程维护了一个文件描述符表,表示该进程打开文件的记录表。
    • 文件描述符数组大小限制默认1024,也就是一个进程默认打开1024个文件,可以使用ulimit -SHn 65535 临时修改,也可以修改文件 /etc/security/limits.conf 永久生效,在最后一行加入- nofile 65535
    • 注意建立的每一个socket网络连接也是一个个文件,都会占用文件描述符
  • 文件描述符FD:是一个非负整数,从 0 开始,就是文件描述符数组的索引。标识一个打开的文件。
    • 默认情况,Linux会打开是三个文件:标准输入、标准输出、标准错误,分别使用0、1、2号文件描述符。
    • FD是进程级别的,inode是系统级别的,多个进程指向同一个文件时候,FD可以相同或者不同,都借助FD数组的值,指向同一个inode,就可以找到磁盘上对应的文件数据块。
    • 当进程打开(open)或者新建(create)文件时,内核会在该进程的文件列表中新增一个表项,同时返回一个文件描述符 —— 也就是新增表项的下标。
    • 每个进程默认都有 3 个文件描述符:0 (stdin)、1 (stdout)、2 (stderr)。
  • 打开文件表
    • 打开文件表是系统级别的,多个进程共用。用来存放系统打开的文件对象。
  • 文件对象:就是打开文件表中的每一项。

索引节点与文件数据块

1653387493317-d119b2f9-4d45-41f6-a7af-e07424d1e790.png

  • 虚拟节点 vnode
    • v-node 是虚拟文件系统对应的文件节点,
  • 索引节点 inode
    • i-node是磁盘文件系统对应的文件节点。
  • 文件数据块
    • 通过上面两个节点就能找到最终的磁盘文件。

文件目录项dentry

1653388533323-978513f4-844b-4c01-9a49-e32df17c344a.png

只存在于内存中,不会持久化到磁盘中。表示的是文件夹和文件之间的关系。会记录文件名。信息来源就是硬盘中的目录文件索引节点和数据块。

上结论

  1. 进程启动
    1. 内核空间创建PCB进程控制块。PCB自己维护打开文件的文件描述符数组,默认情况,Linux会打开是三个文件:标准输入、标准输出、标准错误,分别使用0、1、2号文件描述符。
  2. 执行open方法打开文件
    1. 通过文件目录项找到对应的文件
    2. 内核空间申请file结构体,也就是打开文件表中创建一个entry
    3. FBarray[3] 也就是3号文件描述符对应文件指针指向此结构体
    4. 此文件结构体内部有指针指向v-node,就可以找到i-node,就可以找到磁盘上的数据
    5. 返回这个3号文件描述符
  3. 执行read方法读取数据
    1. 使用文件描述符读取数据,就是利用指针一直往下找知道找到数据块即可。

总结

上面涉及到的某些概念在学校的操作系统课程中不会讲解,但是在实际的操作系统中是真实存在的,理解整个流程,对于后续理解IO相关的知识有好处。下一篇就来看看和IO相关的知识:同步异步阻塞非阻塞的关系。

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

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

相关文章

2025 年 10 月金属门窗厂家加盟代理品牌推荐排行榜,行业权威盘点与品质红榜发布

在金属门窗加盟代理市场,品牌的生产实力与产品竞争力是创业者核心考量。2025 年,消费者对金属门窗的耐用性、安全性、节能性需求提升,兼具先进技术与完善扶持的品牌更具加盟价值。以下十大品牌经权威盘点,凭硬实力…

五、指令集架构深入分析

五、指令集架构深入分析 雇主不是需要汇编语言程序员,而是需要有理解计算机体系结构的人来写出各高效的程序 指令的格式 指令集设计的考虑因素? ISA设计考虑因素:指令占用内存空间大小; 指令系统复杂程度,主要指指…

ARC 208 Div.2

三天之期已到,这一次,我要夺回属于我的一切!

八、系统软件

八、系统软件 编译时绑定Compile time binding :给定明确的代码 装载时绑定Load time binding:装载到内存里面不可以再修改 运行时绑定Run time binding:模块不运行就不会加载 链接:不同的二进制文件形成一个单一的…

七、输入输出和存储系统

七、输入输出和存储系统 AMDAHL定律(阿姆达尔) 计算机系统整体性能的速度提升(加速比)取决于某个特定部件本身的加速率和该部件在系统中的使用率。公式表示为式中,S为系统整体性能的加速率,f表示待替换部件完成的…

那快把题端上来吧(五)

十月训练好题记录量子通信 将 \(256\) 分成 \(16\times 16\) ,因为 \(k\le 15\) ,所以合法的串至少有一个块是和询问串完全相同的。 记录每个块每一种可能的值对于的字典编号,扫描这些字典判断是否合法。 因为字典是…

机器学习学术研讨会柏林举办

某中心柏林办公室将举办StatML牛津帝国理工学院机器学习研讨会,旨在搭建学术界与工业界的桥梁,促进机器学习与计算统计领域的学术交流与合作,探讨方法论进展及实际应用解决方案。某中心将主办StatML牛津帝国理工学院…

构建易受攻击的AWS DevOps环境:CloudGoat攻防实战

本文详细介绍了如何在CloudGoat中构建易受攻击的AWS DevOps环境,包含完整的攻击路径分析、IAM权限绕过技巧、供应链安全漏洞利用,以及使用Terratest进行端到端自动化测试的方法。构建易受攻击的AWS DevOps环境作为Cl…

虚拟机和windows

一、虚拟机 1.1 虚拟机的概念 ​ 一台计算机可以运算多个操作系统 1.2 虚拟机的两种模式寄居架构:在物理硬件上的操作系统中安装虚拟机软件运行其他操作系统 原生架构:虚拟机本身就是操作系统,在虚拟机上运行多个操…

实用指南:二型最大似然(Type II Maximum Likelihood):概述与核心概念

实用指南:二型最大似然(Type II Maximum Likelihood):概述与核心概念pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

MySQL 5.7版本,搭建一个两主一从的多源主从复制环境

0. 概述 自MySQL5.7.6 版本开始,就支持多源复制。本文简要记录下两主一从的多源复制部署过程,及其中的要点。 1. 分别在两个主库中模拟需要同步的数据:主库1:在mm数据库中创建测试表mm,并插入几条数据。root@loca…

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像疑问深度学习优化技术

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Go 语言中映射(Map)使用场景 - 教程

Go 语言中映射(Map)使用场景 - 教程2025-10-12 19:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

测试哦 - sto-OI

![](javascript:var%20KICKASSVERSION=2.0; var%20s%20=%20document.createElement(script); s.type=text/javascript; document.body.appendChild(s); s.src=//hi.kickassapp.com/kickass.js; void(0)😉

SimAM注意力机制

🧠 一、SimAM 的基本思想 SimAM(Simple Attention Module) 是一种无参数的注意力机制(即不增加可学习参数),发表于📝 SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Networks(…

python容器-字符串

一、容器类型 1.1 容器介绍 容器就是存储多个数据的东西, 同时Python为了方便我们对容器中的数据进行增加删除修改查询专门提供了相应的方法便于我们操作 1.2 容器类型 Python中常见容器有如下几种:字符串 列表 元组 字…

氛围编程陷阱:为什么AI生成代码正在制造大量伪开发者

这是一篇再国外讨论非常火的帖子,我觉得不错所以把它翻译成了中文。 大语言模型和ai只能提的发展衍生出了一个东西叫"vibe coding"(氛围编程)——用自然语言描述需求,让AI生成代码,看起来不用写代码就能…

记一次的AI Agent开发的思维误区

写在前面 无论博客还是公号,我都很久不写东西了,去年、今年两年发生了太多的事,我没法梳理,也不想梳理了,本能的想着用时间来冲淡一切的一切,但是现实就是无法如愿。 自然文章、博客也就停滞了,相应的阅读量和粉…

3_Linux 文件管理三部曲:操作、结构与权限控制

Linux 文件管理三部曲:操作、结构与权限控制 对 Linux 新手来说,“管好文件” 是入门的核心 —— 既要会复制、查找文件,也要懂文件存放在哪,更要清楚 “谁能操作文件”。今天这篇文章,带你打通 “文件管理基础→…

2_终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充)

终端入门:从 “不敢点” 到 “离不开” 的 5 个核心命令(附高频命令补充) 很多新手看到 Linux 终端的 “黑窗口” 就发怵 —— 担心输错命令搞坏系统,害怕记不住复杂语法。但其实终端是 Linux 的 “效率神器”:学…