文件系统概述

news2024/12/25 22:18:17

目录

  • 概述
  • 用户空间层面
    • 1.应用程序可以直接使用内核提供的系统调用访问文件:
    • 2.应用程序也可以使用 glibc 库封装的标准 I/O 流函数访问文件:
  • 硬件层面
    • 1.块设备
    • 2.闪存
    • 3.NVDIMM
  • 内核空间层面

概述

在 Linux 系统中,一切皆文件,除了通常所说的狭义的文件(文本文件和二进制文件)以外,目录、设备、套接字和管道等都是文件。

文件系统在不同的上下文中有不同的含义。
(1)在存储设备上组织文件的方法,包括数据结构和访问方法。
(2)按照某种文件系统类型格式化的一块存储介质。我们常说在某个目录下挂载或卸
载文件系统,这里的文件系统就是这种意思。
(3)内核中负责管理和存储文件的模块,即文件系统模块。

Linux 文件系统的架构如图所示,分为用户空间、内核空间和硬件 3 个层面:

在这里插入图片描述

用户空间层面

1.应用程序可以直接使用内核提供的系统调用访问文件:

(1)一个存储设备上的文件系统,只有挂载到内存中目录树的某个目录下,进程才能访问这个文件系统。系统调用 mount 用来把文件系统挂载到内存中目录树的某个目录下。可以执行命令“mount -t fstype device dir”,把文件系统挂载到某个目录下,mount 命令调用系统调用 mount 来挂载文件系统。
(2)系统调用umount 用来卸载某个目录下挂载的文件系统。可以执行命令“umount dir”来卸载文件系统,umount 命令调用系统调用 umount。
(3)使用 open 打开文件。
(4)使用 close 关闭文件。
(5)使用 read 读文件。
(6)使用 write 写文件。
(7)使用 lseek 设置文件偏移。
(8)当我们写文件的时候,内核的文件系统模块把数据保存在页缓存中,不会立即写到存储设备。我们可以使用 fsync 把文件修改过的属性和数据立即写到存储设备,或者使用 fdatasync 把文件修改过的数据立即写到存储设备。

2.应用程序也可以使用 glibc 库封装的标准 I/O 流函数访问文件:

标准 I/O 流提供了缓冲区,目的是尽可能减少调用 read 和 write 的次数,提高性能。glibc 库封装的标准 I/O 流函数如下所示。
(1)使用 fopen 打开流。
(2)使用 fclose 关闭流。
(3)使用 fread 读流。
(4)使用 fwrite 写流。
(5)使用 fseek 设置文件偏移。
(6)使用 fwrite 可以把数据写到用户空间缓冲区,但不会立即写到内核。我们可以使用 fflush 冲刷流,即把写到用户空间缓冲区的数据立即写到内核。

硬件层面

外部存储设备分为块设备、闪存和 NVDIMM 设备3类。

1.块设备

块设备主要有以下两种。
(1)机械硬盘:机械硬盘的读写单位是扇区。访问机械硬盘的时候,需要首先沿着半径方向移动磁头寻找磁道,然后转动盘片找到扇区。
(2)闪存类块设备:使用闪存作为存储介质,里面的控制器运行固化的驱动程序,驱动程序的功能之一是闪存转换层(Flash Translation Layer,FTL),把闪存转换为块设备,对外表现为块设备。常见的闪存类块设备是在个人计算机和笔记本电脑上使用的固态硬盘(Solid State Drives,SSD),以及在手机和平板电脑上使用的嵌入式多媒体存储卡(embedded Multi Media Card,eMMC)和通用闪存存储(Universal Flash Storage,UFS)。
闪存类块设备相对机械硬盘的优势是:访问速度快,因为没有机械操作;抗振性很高,便于携带。

2.闪存

闪存(Flash Memory)的主要特点如下。
(1)在写入数据之前需要擦除一个擦除块,因为向闪存写数据只能把一个位从1变成0,不能从0变成1,擦除的目的是把擦除块的所有位设置为1。
(2)一个擦除块的最大擦除次数有限,NOR 闪存的擦除块的最大擦除次数是104~105,NAND 闪存的擦除块的最大擦除次数是105~106

闪存按存储结构分为 NAND 闪存和 NOR 闪存,两者的区别如下。
(1)NOR 闪存的容量小,NAND 闪存的容量大。
(2)NOR 闪存支持按字节寻址,支持芯片内执行(eXecute In Place,XIP),可以直接在闪存内执行程序,不需要把程序读到内存中;NAND 闪存的最小读写单位是页或子页,一个擦除块分为多个页,有的 NAND 闪存把页划分为多个子页。
(3)NOR 闪存读的速度比 NAND 闪存块,写的速度和擦除的速度都比 NAND 闪存慢。
(4)NOR 闪存没有坏块;NAND 闪存存在坏块,主要是因为消除坏块的成本太高。
NOR 闪存适合存储程序,一般用来存储引导程序,比如 U-Boot 程序;NAND 闪存适合存储数据。

为什么要针对闪存专门设计文件系统?主要原因如下。
(1)NAND 闪存存在坏块,软件需要识别并且跳过坏块。
(2)需要实现损耗均衡(wear leveling),损耗均衡就是使所有擦除块的擦除次数均衡,避免一部分擦除块先损坏。

机械硬盘和 NAND 闪存的主要区别如下。
(1)机械硬盘的最小读写单位是扇区,扇区的大小一般是 512 字节;NAND 闪存的最小读写单位是页或子页。
(2)机械硬盘可以直接写入数据;NAND 闪存在写入数据之前需要擦除一个擦除块。
(3)机械硬盘的使用寿命比 NAND 闪存长:机械硬盘的扇区的写入次数没有限制;NAND 闪存的擦除块的擦除次数有限。
(4)机械硬盘隐藏坏的扇区,软件不需要处理坏的扇区;NAND 闪存的坏块对软件可见,软件需要处理坏块。

3.NVDIMM

NVDIMM(Non-Volatile DIMM,非易失性内存;DIMM 是 Dual-Inline-Memory-Modules的缩写,表示双列直插式存储模块,是内存的一种规格)设备把 NAND 闪存、内存和超级电容集成到一起,访问速度和内存一样快,并且断电以后数据不会丢失。在断电的瞬间,超级电容提供电力,把内存中的数据转移到 NAND 闪存。

内核空间层面

在内核的目录 fs 下可以看到,内核支持多种文件系统类型。为了对用户程序提供统一的文件操作接口,为了使不同的文件系统实现能够共存,内核实现了一个抽象层,称为虚拟文件系统(Virtual File System,VFS),也称为虚拟文件系统切换(Virtual Filesystem Switch,VFS)。

文件系统分为以下 4 种。
(1)块设备文件系统,存储设备是机械硬盘和固态硬盘等块设备,常用的块设备文件系统是 EXT 和 btrfs(读作|bΛtəfs|)。EXT 文件系统是 Linux 原创的文件系统,目前有3个版本:EXT2、EXT3 和 EXT4。
(2)闪存文件系统,存储设备是 NAND 闪存和 NOR 闪存,常用的闪存文件系统是 JFFS2(日志型闪存文件系统版本 2,Journalling Flash File System version 2)和 UBIFS(无序区块镜像文件系统,Unsorted Block Image File System)。
(3)内存文件系统,文件在内存中,断电以后文件丢失,常用的内存文件系统是 tmpfs,用来创建临时文件。
(4)伪文件系统,是假的文件系统,只是为了使用虚拟文件系统的编程接口,常用的伪文件系统如下所示。
1)sockfs,这种文件系统使得套接字(socket)可以使用读文件的接口 read 接收报文,使用写文件的接口 write 发送报文。
2)proc 文件系统,最初开发 proc 文件系统的目的是把内核中的进程信息导出到用户空间,后来扩展到把内核中的任何信息导出到用户空间,通常把 proc 文件系统挂载在目录“/proc”下。
3)sysfs,用来把内核的设备信息导出到用户空间,通常把 sysfs 文件系统挂载在目录“/sys”下。
4)hugetlbfs,用来实现标准巨型页。
5)cgroup 文件系统,控制组(control group,cgroup)用来控制一组进程的资源,cgroup文件系统使管理员可以使用写文件的方式配置 cgroup。
6)cgroup2 文件系统,cgroup2 是 cgroup 的第二个版本,cgroup2 文件系统使管理员可以使用写文件的方式配置 cgroup2。

访问外部存储设备的速度很慢,为了避免每次读写文件时访问外部存储设备,文件系统模块为每个文件在内存中创建了一个缓存,因为缓存的单位是页,所以称为页缓存。

块设备的访问单位是块,块大小是扇区大小的整数倍。内核为所有块设备实现了统一的块设备层。

为了避免每次读写都需要访问块设备,内核实现了块缓存,为每个块设备在内存中创建一个块缓存。缓存的单位是块,块缓存是基于页缓存实现的。

访问机械硬盘时,移动磁头寻找磁道和扇区很耗时,如果把读写请求按照扇区号排序,可以减少磁头的移动,提高吞吐量。I/O 调度器用来决定读写请求的提交顺序,针对不同的使用场景提供了多种调度算法:NOOP(No Operation)、CFQ(完全公平排队,Complete Fair Queuing)和 deadline(限期)。NOOP 调度算法适合闪存类块设备,CFQ 和 deadline 调度算法适合机械硬盘。

每种块设备需要实现自己的驱动程序。

内核把闪存称为存储技术设备(Memory Technology Device,MTD),为所有闪存实现了统一的 MTD 层,每种闪存需要实现自己的驱动程序。

针对 NVDIMM 设备,文件系统需要实现 DAX(Direct Access,直接访问;X 代表eXciting,没有意义,只是为了让名字看起来酷),绕过页缓存和块设备层,把 NVDIMM设备里面的内存直接映射到进程或内核的虚拟地址空间。

libnvdimm 子系统提供对 3 种 NVDIMM 设备的支持:持久内存(persistent memory,PMEM)模式的 NVDIMM 设备,块设备(block,BLK)模式的 NVDIMM 设备,以及同时支持 PMEM 和 BLK 两种访问模式的 NVDIMM 设备。PMEM 访问模式是把 NVDIMM 设备当作内存,BLK访问模式是把 NVDIMM 设备当作块设备。每种 NVDIMM 设备需要实现自己的驱动程序。

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

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

相关文章

【MySQL 】:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书,小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结:文末赠书 一、准备测…

直线导轨在焊接领域有什么作用?

焊接技术在现代制造业中的应用越来越广泛,直线导轨作为重要的传动元件,已经成为焊接设备中不可或缺的部分。 相对于直线轴承来说,直线导轨具有较高的负载能力和刚度,能够保证高精度的直线运动,滑动摩擦小,惯…

【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )

文章目录 一、Python 默认捕获所有类型异常1、默认捕获所有类型异常 - 无法获取异常类型2、代码实例 - 默认捕获所有类型异常 二、Python 捕获所有类型异常 - 捕获 Exception 异常1、捕获 Exception 类型异常 - 可获取异常类型2、代码实例 - 捕获 Exception 异常 一、Python 默…

管理类联考——逻辑——知识篇——形式逻辑——三、直言——haimian

直言 考点分析 直言 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量786223232 性质定义 直言命题也叫做性质命题,是判断事物是否具有某种性质的命题。直言命题由四部分组成:主项、谓项、联项、量项。 不同种类 对当关系 对…

PID控制算法:2、Derivative Kick(微分冲击)

什么是微分冲击Derivative Kick 引入微分,就是为了减少超调量的,但是根据PID的经典公式 就看微分部分 在PID刚开始时,误差值肯定是存在的,但是PID启动的瞬间,这个dt是很小的,这就导致是一个很大的值&#…

软件开发实习个人总结

软件开发实习个人总结篇1 一、实习目的 随着时代发展和社会进步,用人单位对游戏软件专业大学生的要求越来越高,对于即将毕业的游戏软件专业在校生而言,为了能更好的适应游戏软件专业严峻的就业形势,毕业后能够尽快的融入到社会&am…

Golang学习日志 ━━ 通过将gin-vue-admin项目上传到自己的仓库并且与原版保持更新来学习github操作

gin-vue-admin是一套国人用golang开发的后台管理系统,本文是从作者早期原文中截取的一部分,后期会以本文为框架进行扩展说明。 官网:https://www.gin-vue-admin.com/ 学习视频:https://www.bilibili.com/video/BV1kv4y1g7nT/?p6 …

Redis 2023面试5题(七)

一、Redis redlock 实现原理 Redlock是一种基于Redis的分布式锁实现,它可以解决在分布式系统中由于主从切换、网络延迟等导致的锁竞争问题。 Redlock的实现原理如下: 创建多个Redis实例,每个实例都有相同的锁名称。使用Redis的SETNX命令尝试…

如何选择消息中间件

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种: 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式,同步的,跨语言跨平台,面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

Vlan与ARP讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域;可以理解为一个V…

RT-Thread-11-事件集

事件集 举例说明事件集: 1、A坐公交车去某地,只有一趟公交车去该地,等此公交车即可出发; 2、A坐公交车去某地,有三趟公交车去该地,等其中任意一辆公交车即可出发; 3、A约B一起去某地&#xff0…

点亮你的创意,使用Python与树莓派制作呼吸灯的详细教程

文章目录 前言PWM的介绍实现PWM控制LED亮度结果与分析 前言 在上一篇文章中,我们介绍了如何在树莓派上点亮一个LED灯,并让它以时间间隔为1秒进行闪烁。闪亮登场!在树莓派上点亮LED灯的简单详细方法_☞黑心萝卜三条杠☜的博客-CSDN博客。现在&…

【剑指offer刷题记录 java版】数组双指针 之 其它题目

本系列文章记录labuladong的算法小抄中剑指offer题目 【剑指offer刷题记录 java版】数组双指针 之 其它题目 剑指 Offer II 018. 有效的回⽂剑指 Offer 58 - I. 翻转单词顺序剑指 Offer 21. 调整数组顺序使奇数位于偶数前⾯剑指 Offer 57. 和为s的两个数字剑指 Offer II 007. 数…

【裸机开发】IRQ 中断服务函数(三)—— 中断处理逻辑实现

实现了 IRQ 中断服务函数的汇编部分以后,接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑,主要包含初始化和中断处理两部分。 全局中断初始化(全局中断使能、IRQ中断使能)具体中断处理逻辑实现 我们这里的中断是由按键产生…

springboot+mybatisplus复习笔记

1.环境搭建 依赖配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifa…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

软件工程实践总结

前言 这次我们学校花了很多心血在这次的课设上&#xff0c;真的是特别感动和感谢&#xff0c;当你遇到真心为你好对你好的老师的时候&#xff0c;真的是会觉得人间值得&#xff01; 之前在学软件工程的时候我就会觉得这些理论的东西有什么用啊&#xff0c;什么UML&#xff0c;…

冒泡排序、选择排序、插入排序

冒泡排序 思路&#xff1a; 每次循环比较相邻两个元素&#xff0c;如果左边元素>右边元素&#xff0c;则交换位置。结果&#xff1a;将最大值放到最右边&#xff1b;一次循环过后&#xff0c;左边无序区域减少一个数&#xff0c;右边有序取增加一个数&#xff1b;序列长度…

【C++】AVL树的插入实现

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…