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

news2024/11/26 23:26:26

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

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

索引节点和目录项

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 -h
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       1.1Gi       211Mi       1.1Gi       2.5Gi       1.4Gi
Swap:         1.9Gi       833Mi       1.1Gi

root@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# slabtop
 Active / 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.00K

  OBJS 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 dentry
 86848  82365  94%    0.12K   2714       32     10856K kmalloc-128
 46987  45635  97%    0.20K   2473       19      9892K vm_area_struct
 43712  41460  94%    0.06K    683       64      2732K anon_vma_chain
 33379  25805  77%    1.07K   1151       29     36832K ext4_inode_cache
 29631  22854  77%    0.57K   2119       14     16952K radix_tree_node
 23584  21053  89%    0.12K    737       32      2948K kmalloc-rcl-128
 23322  22669  97%    0.09K    507       46      2028K anon_vma
 21760  18704  85%    0.25K   1360       16      5440K filp
 21476  20469  95%    0.59K   1652       13     13216K inode_cache
 16218  14656  90%    0.04K    159      102       636K ext4_extent_status
 11900  11621  97%    0.02K     70      170       280K numa_policy
  8704   8213  94%    0.06K    136       64       544K vmap_area
  7764   7317  94%    0.66K    647       12      5176K proc_inode_cache
  6272   6242  99%    0.12K    196       32       784K pid
  5202   5152  99%    0.08K    102       51       408K task_delay_info
  4816   4745  98%    0.50K    301       16      2408K kmalloc-512
  4590   4590 100%    0.05K     54       85       216K ftrace_event_field
  4200   4149  98%    0.19K    200       21       800K cred_jar
  4182   4182 100%    0.04K     41      102       164K pde_opener
  3760   3660  97%    0.25K    235       16       940K kmalloc-256
  3728   3178  85%    1.00K    233       16      3728K kmalloc-1k
  3366   2652  78%    0.70K    153       22      2448K shmem_inode_cache
  3344   3083  92%    0.81K    176       19      2816K sock_inode_cache
  3248   3188  98%    0.25K    203       16       812K skbuff_head_cache
  3080   3080 100%    0.07K     55       56       220K eventpoll_pwq
  2568   2473  96%    4.00K    321        8     10272K kmalloc-4k
  2368   2368 100%    0.06K     37       64       148K ext4_io_end
  2320   2278  98%    1.00K    145       16      2320K PING
  2080   2043  98%    0.12K     65       32       260K kmem_cache_node
  2064   1941  94%    0.50K    129       16      1032K kmem_cache
  1932   1932 100%    0.09K     42       46       168K trace_event_file

小结

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

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

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

相关文章

HTTP请求、响应详解

目录 一、HTTP请求详解 1.1 认识请求“报头”(header) 1.2 认识请求“正文”(body) 1.2.1 application/x-www-form-urlencoded 1.2.2 multipart/form-data 1.2.3 application/json 二、HTTP响应详解 2.1 认识状态码 2.2 认识响…

Centos7配置国内yum源

目录 备份原系统中的repo文件配置国内开源镜像重新生成yum缓存 备份原系统中的repo文件 cd /etc/yum.repos.d/mkdir repo_bakmv *.repo repo_bak/配置国内开源镜像 到网易和阿里开源镜像站点下载系统对应版本的repo文件 curl -O http://mirrors.aliyun.com/repo/Centos-7.re…

com.google.gson.internal.LinkedTreeMap cannot be cast to XXX

起因是在对google商品做本地缓存时,上线后发现的bug 刚开始非常自信,debug没问题线上有问题,大概率就是混淆文件没有添加keep,于是本地添加对SDK中类的keep,本地打包release验证,不出意外还是崩溃 仔细看…

GEE:Bfast时间序列扰动检测

本文记录了 Google Earth Engine (GEE) 上 Bfast 时间序列检测的APP和gitHub链接。 文章目录 一、APP Bfast APP: [https://andreim.users.earthengine.app/view/bfastmonitor](https://andreim.users.earthengine.app/view/bfastmonitor)git…

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

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

5G先锋开道,护航出行安全

“道路千万条,安全第一条”。 交通作为城市生命线“主动脉”,承载着助推经济发展的重要使命。构建“预、防、治”全周期交通管理,推进城市精细化管理刻不容缓。 为全面加强交通安全监管体系,天津某交管局决策对新区街道4000多个路…

计算机二级-简单应用题

题目要求 编写代码,以实现如下功能: 键盘输入小明学习的课程名称及考分等信息,信息间采用空格分隔,每个课程一行,空行回车结束录入,示例格式如下: 数学 90 语文 95 英语 86 物理 84 生物 87 屏幕…

(二)随机变量的数字特征:探索概率分布的关键指标

文章目录 🍋1. 随机变量的数学期望🍋1.1 离散型随机变量的数学期望🍋1.2 连续型随机变量的数学期望 🍋2. 随机变量函数的数学期望🍋2.1 一维随机变量函数的数学期望🍋2.2 二维随机变量函数的数学期望 &…

机器学习算法基础--逻辑回归

目录 1.数据收集及处理 2.数据提取及可视化 3.逻辑回归训练样本并且测试 4.绘制散点决策边界 逻辑回归的方法已经在数学建模里面讲过了,这里就不多讲了。 本篇我们主要是利用逻辑回归的方法来求解分类问题。 1.数据获取及处理 import pandas as pd from sklearn…

蓝桥杯2023年第十四届省赛真题-像素放置

目录 蓝桥杯2023年第十四届省赛真题-像素放置 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 大家觉得写得可以的话,可以加入QQ群907575059. 蓝桥杯2023年第十四届省赛真题-像素放置 时间限制: 3s 内存限制: 320MB 提交:…

QT--day3

2> 完成文本编辑器的保存工作 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_fontbtn_cl…

uniapp 实现不同用户展示不同的tabbar(底部导航栏)

一、背景 最近在做一个uniapp开发的小程序遇到一个需求,希望不同用户登录后展示不同的tabbar页面,但是uniapp项目中的pages.json是只有一个list数组的,并且是不能写成动态效果,为了实现这个需求,便自定义了tabbar组件 …

一文读懂SSL、TLS和mTLS的通信安全协议

今天让我们深入探讨一下SSL、TLS和mTLS等一系列重要的通信安全协议。尽管从整体系统设计的角度来看,这个主题可能并不是至关重要,但仍然值得我们深入了解。 1. SSL协议 SSL,即安全套接字层(Secure Socket Layer),是一种通信协议,旨在加密和保护互联网通信的安全性。虽…

从业二十年的测试工程师今天给大家分享postman的使用技巧以及快捷键的精髓

一、Postman是什么 Postman是chrome的一款插件,用于做接口请求测试,无论是前端,后台还是测试人员,都可以用postman来测试接口,用起来非常方便。 二、Postman安装 官网下载(FQ) Download Postman | Get Started for Free 三、Postman常用功能 安装好之后,我们先打开…

React(react18)中组件通信03——简单使用 Context 深层传递参数

React(react18)中组件通信03——简单使用 Context 深层传递参数 1. 前言1.1 React中组件通信的其他方式1.2 引出 Context 2. 简单例子3. 语法说明3.1 createContext(defaultValue)3.2 value3.3 useContext(SomeContext) 4. 总结4.1 Context4.1.1 Context…

【Java 基础篇】Java transient 关键字详解:对象序列化与非序列化字段

在 Java 编程中,我们经常需要将对象序列化为字节流以便于存储或传输,或者将字节流反序列化为对象以恢复其状态。然而,并不是所有对象的所有属性都应该被序列化。有些属性可能包含敏感信息,或者它们只在内存中有意义。在这些情况下…

每日练习-7

目录 一、选择题 二、算法题 1、两种排序方法 2、求最小公倍数 一、选择题 1、 解析: 指针和引用是C中两种不同的变量类型,它们都可以用来访问或修改其他变量的值,但是它们有以下几个区别: 引用必须在定义时初始化&#xff0c…

Terminnal will be login out after 20 second

锐捷交换机,命令敲着敲着 ,就提示20秒后将中断 ,show ip ssh 查看也一下也没有什么特殊的。 于是查看了一下VTY下的配置 absolute-timeout 5 ,这句话是什么意思呢 ? 5分钟强制退出 ! 改进方法: (config)#…

为什么企业要选择使用报修工单管理系统?

报修管理系统是一种强大的工具,它为企业提供了一种方便、高效的方式来报告设备故障和异常情况,以便及时地反馈给相关的人员。这种系统不仅可以帮助企业更好地管理和跟踪设备的维护和维修工作情况,还可以对所有的维修信息进行统计和分析&#…

天视通等小众冷门摄像机接入安防监控系统EasyCVR平台的常见兼容问题及解决方法

众所周知,视频监控系统EasyCVR安防视频综合管理平台支持多类型设备、多协议方式接入,包括市场主流标准协议国标GB28181、RTMP、RTSP/Onvif协议等,以及厂家私有协议,如海康SDK、大华SDK、海康Ehome等。平台可兼容市面上绝大多数品牌…