【操作系统】聊聊文件系统是如何工作的

文件系统其实是操作系统中存储的核心、计算、网络。除了使用寄存器、内存可以临时存储数据,使用磁盘持久化存储更重要。

  • 磁盘为系统提供了数据持久化功能。
  • 文件系统在磁盘的基础上,抽象出了一个管理文件的树状结构

索引节点和目录项

Linux中一切皆是文件,linunx为每个文件都分配了两个数据结构,索引节点(index node)和目录项 (directory entry)。记录文件的元信息和目录结构。

  • 索引节点:记录文件的元数据,主要包含文件大小、访问权限、修改日期、数据位置等。一个文件就对应一个索引节点。同样会被存储在磁盘中,占用磁盘空间。
  • 目录项:记录文件的名字、索引节点指针和其他目录项的关联关系。多个关联的目录项就构成了文件系统的目录结构。目录项是内核维护的内存数据结构,也叫目录项缓存。

索引节点是每个文件的唯一标识,而目录项维护的是文件系统的树状结构。说白了就是索引节点是对于文件来说的,目录项是对于文件系统来说的。对应关系就是一个索引节点对应多个目录项。比如通过软连接的方式,其实都指向同一个文件,只不过不同的目录,但是目录项都需要进行维护。前者是记录文件的元数据,后者是记录文件间的目录结构。

到这里就有一个问题,那就是文件的数据是如何存储的?

在这里插入图片描述
磁盘读写的最小单位是扇区,扇区只有512B,所以通过文件系统将多个连续的扇区组织成一个逻辑块。以逻辑块进行操作,常见的就是4KB。
在这里插入图片描述
目录项本身是一个内存缓存,而索引节点是存储在磁盘中的数据。为了提供读写速度,文件内容也会缓存在页缓存cache中。索引节点也会缓存到内存中,加速文件的访问。

磁盘在进行系统格式化时,分为三个存储区域 超级块,索引节点区和数据块区

  • 超级块:存储整个文件系统的状态
  • 索引节点区:存储索引节点
  • 数据块区:存储文件数据

虚拟文件系统

在平时的操作中,会有各种不同的数据文件格式,所以linux在用户进程和文件系统中间,引入了一层虚拟文件系统(virtual file system)
应用程序通过操作系统调用的时候就只需要操作虚拟文件系统就可以。VFS屏蔽了底层的细节。
在这里插入图片描述
而常见的三种文件系统大地如下:基本本机的磁盘、本机内存、远程的服务器的磁盘。

文件系统IO

将文件系统挂载到挂载点后,就可以通过挂载点进行操作文件了。vfs提供了一套标准化的接口供应用程序调用。
常见的IO分类如下

  • 缓冲与非缓冲IO (在于是否使用标准库缓存)
  • 直接和非直接IO (在于是否利用页缓存)
  • 阻塞与非阻塞IO (当前线程是否阻塞)
  • 同步与异步IO (是否等待响应结果)

Linux 一切皆文件”的深刻含义。无论是普通文件和块设备、还是网络套接字和管道等,它们都通过统一的 VFS 接口来访问。

性能观测

在这里插入图片描述
缓存
free 输出的cache是页缓存和可回收slab缓存的和。

root@qxlxi:/data# free -htotal        used        free      shared  buff/cache   available
Mem:          3.8Gi       1.1Gi       211Mi       1.1Gi       2.5Gi       1.4Gi
Swap:         1.9Gi       833Mi       1.1Giroot@qxlxi:/data# cat /proc/meminfo | grep -E "SReclaimable|Cached" 
Cached:          2388384 kB
SwapCached:         2888 kB
SReclaimable:     124936 kB

目录和各个文件系统索引节点的缓存情况

cat /proc/slabinfo | grep -E '^#|dentry|inode' 

在这里插入图片描述
slabtop ,来找到占用内存最多的缓存类型。

root@qxlxi:/data# slabtopActive / Total Objects (% used)    : 834715 / 923987 (90.3%)Active / Total Slabs (% used)      : 33235 / 33235 (100.0%)Active / Total Caches (% used)     : 95 / 139 (68.3%)Active / Total Size (% used)       : 187562.83K / 214143.63K (87.6%)Minimum / Average / Maximum Object : 0.02K / 0.23K / 8.00KOBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
249756 232736  93%    0.10K   6404       39     25616K buffer_head
105960  99588  93%    0.13K   3532       30     14128K kernfs_node_cache
105315  74999  71%    0.19K   5015       21     20060K dentry86848  82365  94%    0.12K   2714       32     10856K kmalloc-12846987  45635  97%    0.20K   2473       19      9892K vm_area_struct43712  41460  94%    0.06K    683       64      2732K anon_vma_chain33379  25805  77%    1.07K   1151       29     36832K ext4_inode_cache29631  22854  77%    0.57K   2119       14     16952K radix_tree_node23584  21053  89%    0.12K    737       32      2948K kmalloc-rcl-12823322  22669  97%    0.09K    507       46      2028K anon_vma21760  18704  85%    0.25K   1360       16      5440K filp21476  20469  95%    0.59K   1652       13     13216K inode_cache16218  14656  90%    0.04K    159      102       636K ext4_extent_status11900  11621  97%    0.02K     70      170       280K numa_policy8704   8213  94%    0.06K    136       64       544K vmap_area7764   7317  94%    0.66K    647       12      5176K proc_inode_cache6272   6242  99%    0.12K    196       32       784K pid5202   5152  99%    0.08K    102       51       408K task_delay_info4816   4745  98%    0.50K    301       16      2408K kmalloc-5124590   4590 100%    0.05K     54       85       216K ftrace_event_field4200   4149  98%    0.19K    200       21       800K cred_jar4182   4182 100%    0.04K     41      102       164K pde_opener3760   3660  97%    0.25K    235       16       940K kmalloc-2563728   3178  85%    1.00K    233       16      3728K kmalloc-1k3366   2652  78%    0.70K    153       22      2448K shmem_inode_cache3344   3083  92%    0.81K    176       19      2816K sock_inode_cache3248   3188  98%    0.25K    203       16       812K skbuff_head_cache3080   3080 100%    0.07K     55       56       220K eventpoll_pwq2568   2473  96%    4.00K    321        8     10272K kmalloc-4k2368   2368 100%    0.06K     37       64       148K ext4_io_end2320   2278  98%    1.00K    145       16      2320K PING2080   2043  98%    0.12K     65       32       260K kmem_cache_node2064   1941  94%    0.50K    129       16      1032K kmem_cache1932   1932 100%    0.09K     42       46       168K trace_event_file

小结

本篇 我们介绍了文件系统中比较重要的概念,索引节点和目录项。一个是存储数据的元数据,另一个是为了文件系统的服务。进而为了将多个不同的文件格式统一,抽象除了VFS。 应用程序进行操作VFS就可以读写文件,接着介绍了查看索引节点和目录树缓存的方式。
而其中涉及的缓存 比如pagecache、索引节点缓存、目录树缓存本质都是为了加速读写文件的效率。

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

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

相关文章

HarmonyOS应用开发—资源分类与访问

应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表…

7.4.4 【MySQL】索引字符串值的前缀

我们知道一个字符串其实是由若干个字符组成,如果我们在 MySQL 中使用 utf8 字符集去存储字符串的话,编码一个字符需要占用 1~3 个字节。假设我们的字符串很长,那存储一个字符串就需要占用很大的存储空间。在我们需要为这个字符串列建立索引时…

一键集成prometheus监控微服务接口平均响应时长

一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter

UE5学习笔记(1)——从源码开始编译安装UE5

目录 0. 前期准备1. Git bash here2. 克隆官方源码。3. 选择安装分支4. 运行Setup.bat&#xff0c;下载依赖文件5. 运行GenerateProjectFiles.bat生成工程文件6. 生成完成&#xff0c;找到UE5.sln/UE4.sln7. 大功告成 0. 前期准备 0.1 在windows的话&#xff0c;建议装一个Git…

Markdown(MD)——Typora Markdown安装教程(2023九月亲测可用!!!)

目录 一、简介 1.Markdown简介 2.Markdown特点 3.Typora简介 二、安装教程 1.下载安装包 2.解压到文件夹 3.安装 4.破解 ​编辑5.激活 三、Markdown常用语法 1.常用语法 2.用于编辑LaTex公式 四、其他编辑器 一、简介 1.Markdown简介 Markdown 是一种轻量级标记语…

WPF——Control与Template理解

文章目录 一、前言二、控件三、模板3.1 DataTemplate3.2 ControlTemplate3.3 ContentPresenter 四、结语 一、前言 最近又翻看了下刘铁猛的《深入浅出WPF》&#xff0c;发现对模板章节中的部分内容有了更深的体会&#xff0c;所以写篇文扯扯。 文章标题是Control与Template&a…

企业级数据仓库-理论知识

D3 AM 大数据中间件 Hive&#xff1a;将SQL转化成分布式Map/Reduce进行运算&#xff0c;也支持转换成Spark,需要单独安装Hive集群才能访问Spark,支持60%的SQL&#xff0c;延迟比较大。SparkSQL:属于Spark生态圈&#xff0c;Hive on Sqark。HBase: NoSQL,高并发读&#xff0c;适…

c语言进阶部分详解(指针进阶1)

大家好&#xff01;指针的初阶内容我已经写好&#xff0c;可移步至我的文章&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述&#xff0c;直接带大家进入进阶内容&#xff1a; 目录 一.字符指针 1.讲解…

Mac 安装软件各种报错解决方案

Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx"&#xff0c;因为它不是从App Store下载三. 无法打开"xxx"&#xff0c;因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录 一、什么是ClickHouse&#xff1f;OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…

C语言——通讯录管理系统

通讯录管理系统项目简介 功能说明 控制台黑窗口实现程序需要满足以下几个功能 程序开始运行时首先显示选择菜单界面&#xff0c;根据用户输入确定实现何种功能 程序界面 代码实现 多文件实现 和之前写的实战项目类似&#xff0c;这里同样采用多文件实现的方式 多文件写代码…

各种电机驱动原理

步进电机 步进电机参考资料 野火官方文档 步进电机驱动原理 上面参考文档中有的内容就不写了&#xff0c;写一下我自己的总结吧。 说明&#xff1a; 电机驱动器输入信号有电机转动方向信号DIR&#xff0c;电机转速信号PWM&#xff0c;电机使能信号EN&#xff1b;电机驱动器…

S7-1200PLC和LED电子看板通信(TCP/IP)

S7-200SMART PLC和LED电子看板通信应用,请查看下面文章链接: SMART 200 PLC UDP通讯应用LED看板_RXXW_Dor的博客-CSDN博客开放式用户通信 (OUC) 库:数据解析:https://rxxw-control.blog.csdn.net/article/details/121424897这篇博客我们主要介绍S7-1200PLC和LED电子看板通…

servlet 引用src目录下子目录的class文件方法

1、MyServlet class文件所处的目录结构如下&#xff1a; 2、如果在url里直接引用是不行的&#xff0c;http://localhost:9092/GetRequest_Web_exploded/MyServlet 3、需要在web.xml映射后才行&#xff1a; MyServlet com.example.MyServlet <servlet-mapping><ser…

HI_NAS linux 记录

dev/root 100% 占用解决记录 通过下面的命令查看各文件夹 大小 sudo du --max-depth1 -h # 统计当前文件夹下各个文件夹的大小显示为M 最终发现Var/log 占用很大空间 发现下面两个 log 占用空间很大&#xff0c;直接 rm-rf 即可 HI NAS python3 记录 # 安装pip3 sudo apt u…

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中&#xff0c;系统默认集成了很多netlink实例&#xff0c;比如日志上报、路由系统等&#xff0c;netlink消息是双向的&a…

【golang】调度系列之P

调度系列 调度系列之goroutine 调度系列之m 在前面两篇中&#xff0c;分别介绍了G和M&#xff0c;当然介绍的不够全面&#xff08;在写后面的文章时我也在不断地完善前面的文章&#xff0c;后面可能也会有更加汇总的文章来统筹介绍GMP&#xff09;。但是&#xff0c;抛开技术细…

移动端APP测试-如何指定测试策略、测试标准?

制定项目的测试策略是一个重要的步骤&#xff0c;可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等&#xff0c;从而提高测试效率和质量。本篇是一些经验总结&#xff0c;理论分享。并不是绝对正确的&#xff0c;也欢迎大家一起讨论。 文章目录 一、测…

使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Mac 错误zsh: command not found: brew解决方法

打开iterm或其他shell终端&#xff0c;执行命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择下载brew的源&#xff0c;输入1~6任意都行 根据提示输入Y及开机密码 最后执行&#xff1a;source ~/.z…