23 | 基础篇:Linux 文件系统是怎么工作的?
索引节点和目录项
- 索引节点,简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
- 目录项,简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。
![](/assets/blank.gif)
- 超级块,存储整个文件系统的状态。
- 索引节点区,用来存储索引节点。
- 数据块区,则用来存储文件数据。
虚拟文件系统
![](/assets/blank.gif)
文件系统可以分为三类
- 第一类是基于磁盘的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中。常见的 Ext4、XFS、OverlayFS 等,都是这类文件系统。
- 第二类是基于内存的文件系统,也就是我们常说的虚拟文件系统。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。我们经常用到的 /proc 文件系统,其实就是一种最常见的虚拟文件系统。此外,/sys 文件系统也属于这一类,主要向用户空间导出层次化的内核对象。
- 第三类是网络文件系统,也就是用来访问其他计算机数据的文件系统,比如 NFS、SMB、iSCSI 等。
文件系统 I/O
int open(const char *pathname, int flags, mode_t mode);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
是否利用标准库缓存
- 缓冲 I/O,是指利用标准库缓存来加速文件的访问,而标准库内部再通过系统调度访问文件。
- 非缓冲 I/O,是指直接通过系统调用来访问文件,不再经过标准库缓存。
是否利用操作系统的页缓存
- 直接 I/O,是指跳过操作系统的页缓存,直接跟文件系统交互来访问文件。
- 非直接 I/O 正好相反,文件读写时,先要经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。
应用程序是否阻塞自身运行
- 所谓阻塞 I/O,是指应用程序执行 I/O 操作后,如果没有获得响应,就会阻塞当前线程,自然就不能执行其他任务。
- 所谓非阻塞 I/O,是指应用程序执行 I/O 操作后,不会阻塞当前的线程,可以继续执行其他的任务,随后再通过轮询或者事件通知的形式,获取调用的结果。
是否等待响应结果
- 所谓同步 I/O,是指应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应。
- 所谓异步 I/O,是指应用程序执行 I/O 操作后,不用等待完成和完成后的响应,而是继续执行就可以。等到这次 I/O 完成后,响应会用事件通知的方式,告诉应用程序。
性能观测
容量
$ df /dev/sda1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 30308240 3167020 27124836 11% /
$ df -h /dev/sda1
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 29G 3.1G 26G 11% /
$ df -i /dev/sda1
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 3870720 157460 3713260 5% /
缓存
$ cat /proc/meminfo | grep -E "SReclaimable|Cached"
Cached: 748316 kB
SwapCached: 0 kB
SReclaimable: 179508 kB
$ cat /proc/slabinfo | grep -E '^#|dentry|inode'
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
xfs_inode 0 0 960 17 4 : tunables 0 0 0 : slabdata 0 0 0
...
ext4_inode_cache 32104 34590 1088 15 4 : tunables 0 0 0 : slabdata 2306 2306 0hugetlbfs_inode_cache 13 13 624 13 2 : tunables 0 0 0 : slabdata 1 1 0
sock_inode_cache 1190 1242 704 23 4 : tunables 0 0 0 : slabdata 54 54 0
shmem_inode_cache 1622 2139 712 23 4 : tunables 0 0 0 : slabdata 93 93 0
proc_inode_cache 3560 4080 680 12 2 : tunables 0 0 0 : slabdata 340 340 0
inode_cache 25172 25818 608 13 2 : tunables 0 0 0 : slabdata 1986 1986 0
dentry 76050 121296 192 21 1 : tunables 0 0 0 : slabdata 5776 5776 0
slabtop
# 按下 c 按照缓存大小排序,按下 a 按照活跃对象数排序
$ slabtop
Active / Total Objects (% used) : 277970 / 358914 (77.4%)
Active / Total Slabs (% used) : 12414 / 12414 (100.0%)
Active / Total Caches (% used) : 83 / 135 (61.5%)
Active / Total Size (% used) : 57816.88K / 73307.70K (78.9%)
Minimum / Average / Maximum Object : 0.01K / 0.20K / 22.88K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
69804 23094 0% 0.19K 3324 21 13296K dentry
16380 15854 0% 0.59K 1260 13 10080K inode_cache
58260 55397 0% 0.13K 1942 30 7768K kernfs_node_cache 485 413 0% 5.69K 97 5 3104K task_struct 1472 1397 0% 2.00K 92 16 2944K kmalloc-2048
小结
思考
23 | 基础篇:Linux 文件系统是怎么工作的?相关推荐
- RHEL 5基础篇—linux的简介
RHEL 5基础篇-linux的简介 Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核.Linux可安装在各种计算机硬件设备中,比如手机 ...
- 【linux】循序渐进学运维-基础篇-修复文件系统实战
文章目录 前言: 实验环境 解决方案 1) 系统出现只读的情况的解决方案 2) 系统文件受损,可以使用fsck命令 a. 创建一个1G的分区 b. 对分区进行格式化 c. 破坏文件系统并重新挂载 d. ...
- 【linux】循序渐进学运维-基础篇-linux运维级别
本文是循序渐进学运维-基础篇系列的第43篇文章 文章目录 Linux的运行级别 运行级别的启动原理 1. 在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service) ...
- 【linux】循序渐进学运维-基础篇-Linux系统启动原理
大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-基础篇的第59篇文章 文章目录 前言 centos 6的启动过程 1. 加载BIOS硬件信息 a) 通电自检 b) MBR引导 2. grub ...
- 【linux】循序渐进学运维-基础篇-Linux系统目录
我们都知道,windows下要查看文件需要进入到相应的盘符,比如C盘,D盘,E盘,然后进去进入文件目录. Linux里面也一样,也有自己的目录结构,只不过在windows是将分区映射成一个盘符,而Li ...
- RK3399平台开发系列讲解(内核入门篇)1.42、Linux 文件系统是怎么工作的?
平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1
- Linux基础篇——Linux进程、服务管理
文章目录 1. 什么是进程 2. Linux下进程与执行者的关系(多人多任务环境) 3. 工作(Job)管理 3.1 将指令丢到后端执行 & 3.2 将目前的工作暂停 Ctrl+z 3.3 j ...
- Linux基础篇——Linux磁盘操作(磁盘基础知识、分类、分区、挂载、卸载、扩容)详解
目 录 1. 概 念 2. 为啥要分区 3. 磁盘的结构 4. 磁盘的分类 4.1 IDE硬盘 4.2 SCSI硬盘 4.3 SATA硬盘 4.4 固态硬盘 5. 磁盘分区命名规则 6. 磁盘分区类型 ...
- hadoop学习序曲之linux基础篇--linux的安装和使用
一:linux介绍 1:linux思想源于unix进行开发 2:linux属于开源免费软件,公开内核源代码.而unix属于闭源收费软件. 3:linux可以自由安装,支持绝大部分平台.而unix通常和 ...
最新文章
- TensorFlow中Session.run和Tensor.eval的区别
- ExecutorService线程池
- C语言函数集(十四)
- Windows 技术篇-任务管理器查看执行进程的程序所在位置方法,查看执行进程的命令行
- Windows服务器版本简介
- 研发手Q推广遇到的一系列问题
- k8s serviceaccount pod亲和性 污点
- android自定义viewgroup之我也玩瀑布流
- mysql抓包_mysql抓包工具
- 计算2的N次方(信息学奥赛一本通-T1170)
- Ios开发之定位CLLocationManager
- html自动播放视频不可用muted,html5_videoaudio的autoplay属性失效的解决方法
- 【HDU 5145】 NPY and girls(组合+莫队)
- 苹果计算机磁盘格式,Mac怎么将ntfs格式的磁盘格式化
- 2020阿里招聘岗位要求
- Matlab图像处理与分析之压力分布图像获得
- 熊猫直播助手服务器断开,熊猫直播发告别信正式关停服务器 总共运行1286天终于再见了...
- 单片机双机通信c语言,单片机双机通信(C51程序)
- uni-app是什么有啥子用?
- 【基于UML软件建模的在线学习平台】
热门文章
- 商品审核网页界面_商品模块数据库表解析(二)
- 功率谱有什么用_马达品牌不同,功率一样,变频器互相不能用,是什么原因
- java泛型机制_Java泛型机制必要性及原理解析
- linux三剑客试题,linux三剑客-awk
- java 正则 尖括号_使用JS正则表达式替换括号,尖括号等
- 四十、ETL工具的输入步骤
- 自然语言处理之词向量技术(二)
- 太优秀了!GitHub 标星 40000+ 的大佬和他们的公众号
- 为什么你的提问没人解答?
- 州 选择国家_青海的三大城市:海南州、海北州和海西州,谁的风景更美?