Linux文件系统论述

     目录

 前言

一.磁盘

        1.1定义

        1.2结构

        1.3磁盘的寻找方式

        1.4磁盘的逻辑/线性结构

        1.5磁盘访问的基本单位

        1.6磁盘的管理

二.Linux文件系统

2.1系统结构

2.2属性解析: 

2.3inode相关块的解析:

2.4数据块的解析:


 前言

       学了一段时间的Linux操作系统,我们知道了操作系统对下是能够管理软硬件资源的,这是它的手段;对上能为用户提供相应的服务,这是它的目的。而我们又得明白一个道理,Linux下一切皆文件,指的是任何软硬件设备、驱动、进程等在操作系统下都会被以“文件”的方式进行管理。而真正储存文件数据的磁盘也不例外。

        在整个计算机中,唯有两种存储器能够储存相应的文件数据,一个是内存,一个是外村。内存的优点在于读写传输速度很快,缺点就是关了机数据就全都丢失了;而外存——就是磁盘,它读写速度相对内存就很慢了,但是在磁盘中的文件数据可以永久的保存下来,且磁盘的容量也很大。所以在介绍Linux的文件系统之前需要先来了解了解磁盘,用以小见大的方式理解文件系统就很容易了。

一.磁盘

        1.1定义

        磁盘是计算机主要的存储介质可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。

        磁盘存储着大量的文件数据,当某个进程需要打开磁盘中的文件时,这些文件会被操作系统管理并拿到内存中,放在运行队列排序,等待着CPU的处理和运算——意味着该文件被访问,会发生读写操作。而对于没有被打开的文件来说,需要被管理吗?

        举个例子:从浙江一加工厂送到山西太原的一箱快递货车,在被快递员整理后都贴上了各自的取件码,整齐的被放在货架上,然后通知用户来取。所以取之前,快递在货架上静静的放着。这些大量的快递也需要被静态管理,方便用户随时来取。那么没有被打开的文件也是这个道理,它们也需要被管理。

        1.2结构

        先来看几张磁盘的图片吧:

以上就是磁盘被拆开后的内部结构。

        磁盘详细分为六部分:

        一是它的外壳,用于密封保护磁盘,因为磁盘的生产环境是在无尘室的,不能有任何灰尘或颗粒的携带,这样会损坏磁盘;

        二是它的盘片,如上,光滑到能反光的那个圆盘就是盘片,一个盘片有两个盘面(正反),从这里我们可以想到小时候家里的光盘,它只有一面是光滑的,另一面就是图片形成的;

        三是它的磁头臂,磁头臂带着一个磁头,上图左边三角形的那一块就是,它处在盘面的上方,与盘面并没有任何接触,在磁盘上对各个文件的查找全靠磁头臂进行摆动,对各个文件的读写全靠磁头进行。而每一个盘面都会带有一个磁头臂。

 

         四就是它的磁道和扇区了。如上,该圆盘中从外到里划分成了若干圈,每一圈就是一个磁道。磁道由外向内依次编号,最外侧的是0号磁道。

        而从0-360度中又被若干竖线划分成了众多的扇区,扇区的标号比较特殊,是从1开始编号的。对盘面划分成成这么多的领域就是为了方便查找文件,对其进行读写操作。

        举个例子:中国有960多万平方公里的土地,划分为34个省,4个直辖市、5个自治区、2个特别行政区。而每个省有个各个市区,每个市区有能划分为多个县镇......。为什么我们的身份证上要写上自己的籍贯呢?就是为了方便管理,当公安要寻找一个有姓名,有图片的人时,系统会根据图片和名字识别出他的居住地在哪个省,哪个市,哪个县,哪个街道,哪个小区,然后就能找到。

        所以同样的,磁道和扇区的设立也方便了磁盘对文件的管理,能够快速的查找到该文件在哪个盘片的哪个盘面的哪个磁道的哪个扇区。

        划分好扇区后,从图上可知,在一个扇面中,有5个扇区,每个扇区的大小虽然不同,但是它们能存储的数据量是相同的,假设每个扇区的大小为512字节,因为扇区能存储相同容量的原因与扇区的密度有关,越靠近磁面圆心的扇区密度越大,所以每个扇区都一样。

        第五部分就是柱面了,因为一个磁盘的容量很大,那么势必要有很多个盘片,众多盘片垒在一块就形成了圆柱,每一个盘片也就是称之为磁盘的柱面。

        每一个盘面上的磁头是连接在一个磁臂上的,所有磁头是共进退的,说白了就是磁臂进行来回摆动,它会带动所有的磁头也进行来回摆动,这样做的原因是:在查找文件时,能够同时命令磁臂对所有盘面的某一区域进行寻找,提高了命中率,节省了大量的时间。 

        第六部分是马达,它会带动盘片进行旋转。

1.3磁盘的寻找方式

        磁盘在寻址的时候,基本单位是一个扇区(512字节)的大小,那么在一面上,如何定位一个扇区?

        磁盘寻址开始后,盘片们开始旋转,然后磁臂带动众多磁头来回摆动,依此确认是在哪一个盘片的哪一个盘面的哪一个磁道上,最终就能定位出扇区。这种方式被称为CHS寻址法。

CHS寻址模式将硬盘划分为磁头(Heads) 、 柱面(Cylinder)、扇区(Sector)。

硬盘容量=磁头数*柱面数*扇区数*512字节。

1.4磁盘的逻辑/线性结构

        从上图中看,磁盘是由一圈又一圈的磁道组成,它是圆形的——这是它的逻辑结构;而线性结构中,它又是由一个矩形长条组成的。

        举个磁带的例子:

         磁带是由一个小盒内的两个圆圈围绕组成的,录音机中的两个圆形钻头就是用来读取磁带的数据,所以磁带的运行方式按照圆的逻辑思维进行。而我们将磁带从小盒里拽出来,它只不过是一个长条。

        磁盘也是同理的,系统对磁盘进行管理,就是对数组进行管理。我们可以把整个磁盘从逻辑上看成一个arr[n]: 

转换成数组后,磁盘的寻址方式也是如此:

例如,我们要寻址第123号磁盘的位置:

假如磁盘中有一个盘片(两个盘面),一面上有10个磁道,一个磁道上有100个扇区

第一步:123/1000=0——0号盘面;        第二步:123/100=1——1号磁道

第三步:123%100=23——23号扇区

所以123号磁盘的位置在第0盘面第1号磁道第23号扇区中。

这种寻址方式被称为LBA寻址模式。

        随着硬盘技术的进步,硬盘容量越来越大,CHS寻址模式无法管理超过8064 MB的硬盘,因此工程师们发明了更加简便的LBA寻址方式。在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区) 。LBA编址方式将 CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了 烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再这种逻辑地址转换为实际硬盘的物理地址。

1.5磁盘访问的基本单位

        磁盘访问的基本单位是一个扇区大小——512字节,但依旧很小!OS内的文件系统定制多个扇区的读取是1KB/2KB/4KB,4KB是基本单位。哪怕你只想修改某个10bit大小文件的,也必须将整个4KB对应的扇区(相当于是8个扇区)加载到内存中。

        有人会认为这种方式有些浪费空间,小题大做了。其实这种方式的应用是经过科学家们无数次研究测试出来的,这样的好处在于:对数据I/O的效率提高了,可以用空间换取时间。这被称为是空间局部性原理。

        在计算机学科的概念中,局部性原理是常用的,指处理器在访问某些数据时短时间内存在重复访问,某些数据或者位置访问的概率极大,大多数时间只访问局部的数据。

空间局部性原理:
        在不久的将来将用到的数据很可能与现在正在使用的数据在空间地址上是临近的。这条原理的原因是因为分治思想的处理。当一个模块正在解决一个子问题时,他会申请使用很多局部变量,这些变量不仅空间上连续,而在逻辑上也有关联。因此正在使用的这个数据周围的其他数据也是很可能会被用到。

        所以将4KB的扇区加载到内存就是为了这种情况的发生做出的措施,节省了时间,增加了数据的命中率 。

        内存的管理也是如此,内存被划分为了4KB大小的空间,因为内存空间共有4GB大小,换算一下就是4GB/4KB=100多万个4KB大小的小内存空间。

1.6磁盘的管理

假如磁盘有500GB空间,它的管理方式从上面内存的管理就知道了——分而治之

 如上图:假如我们将磁盘分成2个100GB,2个150GB。

        举个例子:中国有14亿多的人口、数十个省市,想要管理的话,得根据经济状况、风土人情、环境等因素去管理,方式要有针对性;而计算机不同,尽管磁盘有500GB大小,但是数据都是二进制的,没有任何不同,那么管理500GB就和管理100GB一样简单,而管理5GB空间就和管理100GB也一样简单!这就是分区管理——参考电脑中的C、D、E、F盘

到这里,磁盘的相关知识就讲完了。接下来就要进入文件系统了。


二.Linux文件系统

        通过磁盘对数据的管理方式,我们也能够体会到文件系统对文件的管理也是如此——分治思想。文件系统就是一个数组,数组的每一个元素都包含着相应数量大小的文件数据和文件属性,治理一个数组方式就和治理数组中的一个元素一样。文件系统中包括磁盘。

2.1系统结构

在Linux文件系统中,N个块组形成了一整个文件系统,块组中的每一个小块(相当于一个小型的文件系统)又有其多个小块属性

2.2属性解析: 

 1.超级块:包含的是当前文件系统中的重要信息:比如文件系统中inode的总个数,整个文件系统的类型大小,文件系统的空间占用度、空闲的块个数、已使用块的字节大小、文件系统的最近一次访问的时间......

2.块组描述符:每个块组都对应一个块组描述符,用来描述块组的相关信息。

3.inode列表:该列表中存放了该组内部所有使用过的和没使用过的inode。inode表示的是每个文件的编号,就像进程的PID一样。

4.inode位图:该位图结构是由N个比特位组成。用于显示在当前文件系统中各个位置比特位的值,能够查看在该位置的空间块是否已经被使用了。

5.数据块:数据块内有若干个小块,每个小块中存放的就是各个文件的数据。所以数据块存放着分组内的所有文件数据。

6.数据位图:该位图作用与inode位图的原理一样,都是用比特位去表示,能够显示在当前文件系统中各个数据块的使用情况。

        一个文件=文件的属性+内容。inode块代表的就是文件属性,数据块代表的就是文件内容。所以证明了文件属性和内容是分批存储的。

        一个文件中只有一个inode,而inode列表中有多个inode,它的大小是固定的。我们在创建文件时,需要定义文件名,而文件名并不在inode块中存储着。

        文件内容存放在数据块中,文件内容会根据文件的类型变化而变化,它的大小是不固定的,会随着文件内容的增多而为其增添多个小数据块。

2.3inode相关块的解析:

如上图:红框框住的就是各个文件的inode编号。

        inode位图的创建原理:因为inode代表的是各个文件,它们都需要一个特有的编号去被系统识别。那么这么多的inode是如何去管理的?于是inode位图诞生了,inode位图是由N个比特位组成的,每个比特位代表着一个inode,假如inode列表中共有1000个inode,那么inode位图中便有1000个比特位,这些比特位初值为0,表示没有被使用。现有200个文件被创建出来,那么系统需要给其分配200个空闲的inode,此时这200个inode所对应的比特位就会从0置为1。于是从位图中我们就能很好的查看整个inode列表中的使用情况。

        数据位图的原理也是如此!

总结inode:

        1.当我们新建文件的时候,是在inode 位图中的位图结构中找一个未被使用的inode,将该比特位从0置为1,这样该文件就有了一个独有的inode编号了,而正是这个编号,论证了在一目录下不能有两个相同名字的文件,但该文件名并不在inode中存储着! 之后该文件几乎所有的属性就都放在了inode 列表中,该文件也有了其对应的数据块,在向文件中写数据时,第一次分给文件的空间大小大约有4KB,若写入的数据超过4KB,数据块会继续再给其分配一个数据块供其使用。


        2.若想要将该文件删除时,直接将inode 位图结构中的该inode号比特位从1置为0,将数据位图结构中的也置为0即可,这样文件就删除成功了!  但是删除的并不彻底,因为我们可以恢复删除的数据,方法就是寻找之前删除过的inode 列表中该文件的编号,找到后,该inode中还存有指向该文件的数据位图结构的比特位,将其0-->1,再根据该inode结构体中的数据块数组成员,便能找到文件相应的数据块及里面的内容,这样就能恢复删除的文件了!


        系统能够通过inode文件编号映射找到该文件的数据块内容!

        这样就可以解释通:当我们在电脑上下载一个文件的时间要花上十几二十分钟之久:而对于删除文件,系统只需要将inode 位图中相应的比特位从1-->0,数据位图中相应文件的比特位1-->0,就成功删除文件。之后系统若是再于该数据块为新文件添内容时,采用的是堕性管理的方式,将新内容覆盖掉就内容即可——复用数据块!

 

 
        3.那么我们怎么会知道之前删除过的文件的inode呢?
        系统会有相应的日志文件,它会记录在一段时间内新建文件的名字,inode,时间...,删除文件的文件名,inode等信息,我们在寻找的时候可以通过这个快速的找到删除的inode。


2.4数据块的解析:

        因为数据块中存放的是当前文件系统中所有文件的数据,那么它肯定会采用分治的思想去管理数据。数据块的底层相当于是一个有15个元素的数组。其中0-10位置的元素都对应有一个小数据块。这是对一般小型文件的处理方式;若是对于一些数据量在不断增大的文件来说,数据块就得一直给该文件提供小数据块供其存储!

 

         若是该文件一下提供了大约4,5兆的内容,那么索引0-10位置对应的数据块已经放不下了,便会启用二级方案——使用下标第11索引,第11索引管理的小数据块的数量可以有N个了——这是一级索引。这时便会由一级索引给该文件分配数据块空间。

        若是文件有几十兆几百兆,连第11索引也放不下,便会开启三级方案——使用下标第12索引,该索引为二级索引——它能够管理的小数据块数量可以有N^2个。

        若还不够分配,则会使用第13,14索引为其分配数据块空间,相对应它们能够管理的数据块为N^3,N^4个。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python垃圾短信识别程序(KNN、逻辑回归、随机森林、决策树和多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯等算法进行融合)—含python工程全源码

目录 前言总体设计系统整体结构图请求流程图系统流程图 运行环境Python 环境jieba分词库Scikit-learn 库nginxphp 模块实现1. 前端模块2. 后端模块 系统测试1. 测试结果2. 结果对比3. 可视化部分 工程源代码下载其它资料下载 前言 本项目以Python为基础,旨在开发一…

Docker 安全及日志管理

目录 前言一、Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制四、Docker 安全基线标准五、容器相关的常用安全配置方法六、限制流量流向七、镜像安全八、避免Docker 容器中…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据;泛型可以定义任何抽象数据类型;生命周期限制所有权的作用域范围;错误处理使程序更健壮。 集合 一组特性相同的数据集合,除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

短视频seo源码开发部署技术解析

短视频seo开发需要哪些技术 应用程序优化技术:包括应用程序的各种元素(如标题、描述、关键字、图标等)的优化和设置,以及应用程序内部链接和导航的合理布局和设置。 视频内容优化技术:包括视频标题、描述、标签、封面…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。 最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等&#xff0…

django中发送get post请求并获得数据

django中发送get post请求并获得数据 项目结构如下注册路由 urls.py在处理函数中处理请求 views.py进行 get的请求01浏览器 get请求传参数02服务器django get参数解析获取01浏览器 post的发送浏览器get 请求 获取页面返回的 form 发送post请求 带参数 02服务器django的post请求…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C,本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim,也就是要求大…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 七、删除分支 八、合并分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#…

【面试题12】HTTP协议三次握手和四次挥手分别是什么

文章目录 一、概览二、三次握手2.1 第一步:客户端向服务端发送 SYN(同步)包2.2 第二步:服务端返回 ACK(确认)包和 SYN 包2.3 第三步:客户端返回 ACK(确认)包 三、四次挥手…

【AudioCaps数据集】windows10下载AudioCaps数据集,附百度网盘下载链接

🔥 AudioCaps是从AudioSet数据集中筛选再加工得到的数据集。 AudioCaps数据集的下载使用python的第三方库 audiocaps-download,根据README.md的提示,先进行配置下载环境: 📣 AudioCaps的下载环境配置分为四步&#x…

反AI来了…尼康的Natural Intelligence

a mutant_umbrella tree shaped like a nuclear bomb explosion,a photo-realism photograph, 4k, ultra realistic VS a mutant_umbrella tree shaped like a nuclear bomb explosion 尼康发起了一次名为:Natural Intelligence ,“不要放弃现实世界”的…

电商--抢购架构总结

文章目录 背景业务流程业务难点技术难点技术方案技术方向具体落地客户端流控网关流控容器流控后端接口流控数据库流控 流控总结优化读取加速异步化流程处理系统扩容 压测监控 总结参考文献 背景 这是个在做NFT电商项目时遇到的场景,要求运营可以商家某个系列的NFT商…

PHP 文心千帆API接口对接

一:API 调用流程简介 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后,获取AppID、API Key、Secret Key 等信息。API 授权。对应用的 AppID 进行授权。获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key &#xff0c…

2023上半年软考系统分析师科目一整理-04

2023上半年软考系统分析师科目一整理-04 企业信息化 企业信息化 企业信息化工程是将( A )相结合,改善企业的经营、管理、产品开发和生产等各个环节,提高生产效率、产品质量和企业的创新能力,从而实现产品设计制造和企业管理的信息化、生产过…

RocketMQ --- 高级篇

一、高级功能 1.1、消息存储 分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。 消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回…

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

最近正在尝试使用uniappvue3开发仿制chatgpt会话功能。 如上图:经过测试在h5/App端/小程序端 均支持markdown语法解析,键盘撑起后,整体页面和顶部自定义导航栏不会被顶起。 uniapp markdown解析及语法高亮 使用了markdown-it和highlight.js…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后,反响不错,也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的,但是半路杀出了这个活动😂,为表敬意,先参与一波吧。 本文主要介绍一下容…

HTML 全面入门教程:从基础到高级

目录 一、基本结构和标签1. HTML 文档结构2. 常用标签 二、表单和输入元素1. 表单标签&#xff08;<form>&#xff09;2. 输入元素3.实例 三、样式和布局1. 内联样式2. 内部样式表3. 外部样式表 四、多媒体和嵌入内容1. 图像2. 音频和视频3. 嵌入内容 五、语义化标签语义…

【高频电子线路课程设计】调幅发射机

目录 高频电子线路课程设计 摘要&#xff1a; 1绪论 1.1设计的作用和目的 2调幅发射机的主要性能指标 2.1调幅发射机的工作原理 3小功率调幅发射机的设计 3.1方案的选择 3.1.1简易调幅发射机的工作原理框图 3.1.2功率分配及电源电压确定 3.1.3各级晶体管的选择 3.2…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…