当前位置: 首页 > news >正文

建站模板网站北京市住房与城乡建设厅网站

建站模板网站,北京市住房与城乡建设厅网站,视觉设计招聘,昆明专业建站文件系统 前言一、磁盘硬件1. 磁盘的物理存储结构2. 磁盘存储的逻辑抽象结构 二、理解 Ext2 文件系统1. 初步理解文件系统2. 深入理解文件系统#xff08;1#xff09;inode Table#xff08;2#xff09;Data blocks#xff08;3#xff09;inode Bitmap#xff08;41inode Table2Data blocks3inode Bitmap4Block Bitmap5Group Descriptor Table6Super Block 3. 扩展1文件过大2Ext2 文件系统3目录 三、软硬链接1. 软链接2. 硬链接 四、页框和页帧 前言 首先我们需要知道文件的管理工作分为 打开的文件进行管理没有被打开的文件也要在磁盘中进行管理。 而以上两个部分我们称为文件系统我们在上一章已经学习过了在系统中一个被打开的文件而本章我们开始学习在磁盘中没有被打开的文件。 一、磁盘硬件 在理解文件系统之前我们先了解一下磁盘这个硬件。 1. 磁盘的物理存储结构 首先我们先认识一下磁盘的外观结构我们观察以下图片 如上图图中两个部分分别称为磁头和盘片。其中磁头不止一个盘片也不止一片盘片是有正反两面的而且一个磁盘有好几个盘片所以一个磁盘也就有好几面盘面而一个盘面就对应一个磁头所以磁头和盘面关系是一比一的如下图 其中文件的所有的数据包括内容和属性都存在盘面上磁头通过左右摆动读取和写入数据而盘片通过顺时针或逆时针转动配合磁头的左右摆动就可以读取整个盘面的数据。 其中我们我们看到的盘面是光滑的其实它上面是凹凸不平的因为它上面有许多分区例如我们拿一个盘面的俯视图来讲如下图 盘面上可以分为许多的同心圆像上图中红色的这一圈我们称为磁道这个盘面上的每一个同心圆的最外围都被称为磁道。而我们可以观察到每个同心圆都有许多分界线将它分为许多的扇形其中上图中绿色的部分我们称为扇区。 所以我们知道了一个盘面可以有很多的同心磁道一圈磁道可以有很多扇形的扇区而扇区是磁盘的最小存储单元其大小为 512字节。其中哪怕我们在系统当中需要改变某个扇区中的一个比特位无论是读或者修改必须把整个扇区加载到内存里在进行刷新时也必须要以 512字节 为单位进行刷新这就是磁盘在进行读写时的基本单位必须是 512字节。所以我们把磁盘这样的设备称为块设备 那么我们可以观察到在同心圆内圈的扇区明显要比外圈的扇区要小那么它们的大小还是 512字节 吗是的那么它是怎么做到的呢其实是通过让二进制序列在扇区写入时疏密程度不一样就可以了 如果我们想向一个扇区写入我们该如何寻址或者定位呢 首先我们得先确定我们需要写入磁盘的哪一个盘面本质也就是选择哪一个磁头选择该盘面上的哪一个磁道选择在该磁道上的哪一个扇区。 所以我们需要向一个扇区写入必须要知道以上的三个参数所以以上的寻址方式我们称为 CHS寻址法即 Cylinder(磁道、柱面) Head(磁头) Sector(扇区)。 既然我们可以向一个扇区写入我们就可以向任意一个或者多个扇区写入也可以连续多个扇区的写入当然也可以随机写入。所以我们没有被打开的文件它们都是存放在了以扇区为单位的磁道的盘面上有的扇区存放的是内容有的扇区存放的是属性如果一个文件过大就会被分为多个扇区存放 接下来我们要知道磁头的选择是很快的一给磁头编号我们就可以选择哪一个磁头。那么磁头在左右摆动的时候本质是在干什么呢其实它本质是在寻找磁道(柱面)当找到了指定的柱面那么盘片就会旋转旋转的本质就是将对应的扇区转到磁头下然后磁头就可以将数据读取上来了 2. 磁盘存储的逻辑抽象结构 我们的磁盘是一个圆形结构但是如果我们将磁盘拉展开来呢所以我们可以将磁盘盘片抽象成一段线性的空间假设我们的磁盘是两片四面的结构那么我们就可以根据盘面将它抽象成一个具有四个区间的线性空间如下图 那么每一个面不是有很多磁道吗没关系我们也可以在一面中继续给磁道划分空间如下图 但是我们的磁道里面也划分成了许多扇区呀所以我们也可以将一个磁道继续划分成许多个扇区如下图 所以整个磁盘我们可以把它抽象成由无数个扇区构成的一个数组即以扇区为单位大小的一个数组而数组都是有下标的所以我们可以给它设定下标例如假设 1~100000 为第一面100001~200000 为第二面以此类推而在第一面中1~10000 为第一个磁道10001~20000 为第二个磁道以此类推。 所以对磁盘的管理就变成了对数组的管理例如我们的下标为 1234那么它对应的盘面下标为 1234/100000 0即是第一个盘面而对应磁道的下标为 1234/10000 0即是第一个磁道对应的扇区则是 1234%10000 1234即是第 1234 个扇区所以以上三个参数就称为 CHS地址 此外操作系统也可以基于文件系统按照文件块为单位进行数据存取因为操作系统认为每次访问一个扇区太小了为了减小和磁盘IO的次数规定以8个扇区为基本单位称之为文件块为什么是8个呢因为8个扇区的大小为4KB。所以我们以后需要寻址定位某一个块只需要知道起始下标就可以了因为块的大小为8个是规定 这个文件块就是我们未来保存文件属性和内容的基本单元我们把以这8个块为起始地址我们称为 LBA即 Logical Block Address逻辑块地址。所以从此以后我们不再关注扇区站在文件系统角度只需要关注以 4KB 为基本单元的 Blocks 的数组即可每一个4KB都有它的LBA地址从此往后对于磁盘的管理对于文件系统的管理就转换成了对该数组进行管理 所以我们得出结论对存储设备的管理在操作系统层面转换成了对数组的增删查改 二、理解 Ext2 文件系统 1. 初步理解文件系统 假设我们需要在磁盘上管理 500GB我们应该怎么管理呢首先肯定不能将500GB看作一个整体管理因为太大了所以我们应该将它进行分区管理假设将它分成 100GB、100GB、100GB、200GB此时我们只需要将 100GB 管理好就可以了同样的我们可以将管理这 100GB 的方法应用在其它分区上。 那么我们应该如何管理好这 100GB 呢100GB 还是太大了所以我们可以继续给它划分我们可以将它分为许多个组假设我们以 2GB 为一个组可以给它分成 50 个组。所以要把 500GB 管理好我们只需要把 2GB 管理好即可这就是我们学过的分治思想。例如下图我们将 100GB 放大看 上图只是我们描述的分组所以在操作系统内核中我们所分的组其实是如下的 如上图在第一个分区中第一个并不是组而是 Boot Block启动块一般启动块是在磁盘的第一个扇区它是负责启动的。 而后面的就全部都是划分的块组假设我们以 Block group 0 为例即第一个块组它里面又划分为很多东西这个我们后面详细说。 现在我们需要认识在磁盘中无非就存两类信息一是我的文件信息二是很多的文件管理的数据。所以在每个块组中都会存两类信息就是文件信息和文件管理信息。 而我们的文件信息中包括内容和属性内容和属性都是数据而操作系统在文件系统层面将它们分开存储。而文件管理的数据需要管理块组有多大、还剩多少空间、将对应的内容和属性也要管理起来。所以块组里面就包括内容和属性还有文件管理的数据。一般来说在使用文件系统之前在每个块组中首先需要将管理数据进行写入因为一般先要有管理者才能有被管理者而将这些管理数据写入每个块组的工作我们就叫做格式化所以格式化是清除数据没有错但是清空的是我们的数据再对管理数据恢复出厂设置即可 2. 深入理解文件系统 假设我们目录下有以下这些文件和目录 但是当我们带上 -i 选项之后会多出一列数据这些数据是什么呢如下 其实这就是文件的 inode 编号一般情况一个文件对应一个 inode而且每个文件必须要有。在整个分区具有唯一性Linux 内核中识别文件和文件名无关之和 inode 有关 接下来我们介绍每个分区中的组块的组成内容。 1inode Table inode Tablei 节点表存放文件属性如文件大小所有者最近修改时间等。 因为每一个文件都有属性属性的种类是有限的而且每一个文件的属性都一样所以保存文件属性是通过 inode 保存的inode 是文件的属性集我们可以把 inode 想像成一个结构体里面包含文件的大小、权限、拥有者、所属组、ACM时间、inode 编号等如下 struct inode{大小、权限、拥有者、所属组、ACM时间、inode 编号等}在文件系统当中这个 inode 结构体的大小是固定的是 128 字节。inode Table 当中会有非常多的 inode所以假设 inode Table 的大小是 4KB * 1000即有 1000 个文件块单位所以就会有 32000 个 inode因为每个 inode 的大小是固定的所以我们可以根据偏移量(以128字节为单位)来确定每个 inode 的编号。所以在我们看来 inode Table 就是一个数组而 inode 编号就是数组下标我们很快就能定位到一个 inode. 那么怎么确定 inode 在整个分区上具有唯一性呢其实在每个分区的起始位置都有一个起始的 inode 位置叫做 start_inode_number比如第一个分区的 start_inode_number 是 0第二个分区的 start_inode_number 是 32001所以在组块内确定每一个 inode 编号之后需要加上当前分区的 start_inode_number 才是最终的 inode 编号而想要确定当前 inode 在当前组块内是第几个 inode 就用最终的 inode 减去 start_inode_number 即可 2Data blocks Data blocks数据区存放文件内容 由于 文件 内容 属性属性我们已经可以找到了所以当系统申请一个文件所以先会申请一个 inode 块即上面所说的结构体标识这个 inode 块用的是 inode 编号但是文件需要保存属性还要保存内容呀 所以 Data blocks 里面没有任何管理数据里面是一个非常大的以 4KB 为数据块的数据块区域我们在找这些数据块的时候也很好找它们也有自己对应的类似于数据块编号的号码那么我们应该怎么找到当前文件的内容呢为了方便对应文件的数据块所以 inode 块当中会帮我们维持一个数组这个数组中存的是该文件对应的 Data blocks 中的数据块编号如下 struct inode{大小、权限、拥有者、所属组、ACM时间、inode 编号等;int blocks[15] {1, 2, 4};}所以当我们需要读取一个文件我们只需要找到一个文件的 inode找到 inode 之后文件的属性就全部都有了要读取数据就读取 blocks 数组中的内容将对应的数据区的数据块加载到内存中即可。 3inode Bitmap 我们对应的属性和数据块已经有了但是系统怎么知道当前的 inode 中哪些已经被使用哪些没被使用呢数据块中哪些被使用哪些没被使用呢所以我们继续介绍块组中的其它内容。 inode Bitmapinode位图inode Bitmap每个比特位表示一个 inode 是否空闲可用即用比特位的位置表示 inode 编号比特位的内容(0/1)对应的 inode 是否被使用。 所以以我们上面所假设一个 inode Table 里面有 32000 个 inode 块也就是 4KB * 1000 大小所以在 inode Bitmap 中用一个比特位标识一个 inode 块是否可用也就是用 32000 个比特位标识而刚好 4KB 就是 4000 字节也就是 32000 个比特位所以 inode Bitmap 中只需要用一个文件块单位就可以管理整个 inode Bitmap 了 4Block Bitmap 那么类似于 inode Bitmap数据块也是可以用位图进行标识的 Block Bitmap块位图Block BitmapBlock Bitmap 中记录着 Data Block 中哪个数据块已经被占用哪个数据块没有被使用。 比特位的位置表示 block 的编号比特位的内容(0/1)对应 block 是否被使用。 所以当我们在磁盘上新建一个文件并向里面写入 helloworld首先是要先查 inode Bitmap检测最近一个没有被使用的比特位并置1然后把偏移量编号记录下来根据这个偏移量直接去 inode Tables 找到对应的 inode 然后把文件属性往里面一写然后在 Block Bitmap 找到一个位置假设用一个块找到之后将该比特位置1将偏移量记录下来那么数据块号就有了然后往 inode 块中的 block 数组中写入有了块号之后就可以找到对应的块号将 helloworld 往对应的块号直接做刷新写入里面。最后将 inode 编号返回给上层即可。 如果我们需要删除一个文件系统是怎么做的呢只需要将 inode Bitmap 中对应的比特位由1置0即可并且还要将 inode 块中的 block 数组的内容即数据块的编号在 Block Bitmap 中由1置0所以删文件只需要改位图即可 5Group Descriptor Table Group Descriptor TableGDT块组描述符描述块组属性信息。 GDT 是描述当前整个块组的信息比如我们上面所说的 start_inode_number、整个组中一共有多少 inode、一共有多少 inode 被使用了… 它整体保存的是整个块的管理信息。 6Super Block 基本上每一个块组都有我们上面所介绍的五个区域以上五个区域就够建成了一个块。而 Super Block超级块存放文件系统本身的结构信息。记录的信息主要有block 和 inode 的总量整个分区未使用的 block 和 inode 的数量一个 block 和 inode 的大小最近一次挂载的时间最近一次写入数据的时间最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block 的信息被破坏可以说整个文件系统结构就被破坏了。 Super Block 不属于某一个块组假设我们一个分区分为100个块组可能也就在前面的个别块组里有 Super Block它是存放管理整个分区的管理信息那么它为什么会只存在个别块组呢当一个 GDT 损坏它影响的可能也就是一个块组它的影响也有限。但是当一个 Super Block 损坏就会导致整个分区损坏所以为了防止这个事故发生它就在几个块组多副本的保存几个如果系统识别到我们经常使用的 Super Block 出问题了我们只需要在其它块组的 Super Block 拷贝过来即可这也就是自动修复功能。 3. 扩展 1文件过大 我们上面说过一个 inode 块中的 block 数组是存放数据块的编号这个数组的大小一般是 15那么一个文件块单位是 4KB15 个最多也就 60KB如果一个文件超过了 60KB 怎么办呢不用担心这个 block 数组的最后几个数据块的编号对应的数据块并不保存数据信息而是继续保存更多的块列表这可是 4KB 呀也就是这个 4KB 的空间用来保存更多的块列表一个整数是 4Byte所以这个 4KB 的空间可以再放 1000 个整数用来找到更多的数据块编号做二次索引从而找到更多的数据块如下图 而二次索引后的数据块也可以不保存数据信息而是继续保存更多的块列表继续做三次、四次… 索引从而找到更多的数据块从而将空间变大可以容下更大的文件。 2Ext2 文件系统 以上我们所介绍的文件系统也就是100GB这个分区每个分区都由文件系统去管理上面这种文件系统在 Linux 中称为 Ext2 文件系统它是一个承上启下的文件系统。 3目录 我们上面所说的文件系统适用于目录吗在 Linux 下一切皆文件所以也适用于目录目录也有自己对应的 inode如图 目录也有自己的属性但是目录的数据块内容存的是什么呢答案是存的是自己目录内部直接保存的文件的文件名和 inode 的映射关系。在用户角度用户只用文件名而在系统内核角度只用 inode 编号所以文件名和 inode 必须要有对应的映射关系 所以同一个目录下不允许存在同名文件因为文件名是用来做 key 用的由于 inode 编号在整个分区具有唯一性所以文件名和 inode 互为键值大家可以互查。目录也是普通文件只是目录存的内容是映射关系。 那么我们以前说过在一个目录下新建、删除、修改一个文件对于这个目录我们应该需要有什么权限呢 w 权限为什么是 w 权限呢因为我们新建目录、文件是要在该目录下新建映射关系删除就是去掉映射关系 那么我们是如何查找一个文件的呢 首先我们需要找到当前目录在当前目录下找到对应的文件名和 inode 的映射关系然后根据 inode 编号找到 inode 块根据里面的 block 数组找到对应的数据块加载到内存中即可。但是我们应该如何找到当前目录呢当前目录也是文件呀那我们是如何找到当前目录这个文件的呢我们要找到当前目录的 inode 才能找到当前目录但是当前目录的 inode 需要找到上级目录呀那么我们就需要一直往上级目录去找所以我们就需要一直找到根目录。所以我们要找到一个文件就要从根目录开始找到根目录然后一直往下找就可以找到一个文件所以找到一个文件就可以根据这样一个路径找到了。所以一个文件的路径结构就非常重要了。但是这个路径是谁给的呢进程我们的进程中存在一个 cwd 的当前工作路径 访问文件的时候最开始怎么知道这个文件是在哪一个分区里面呢 其实一个磁盘被分区格式化后Linux 中要使用这个分区就要把这个分区进行挂载这个挂载就是路径的前缀所以每一个文件都有路径可以通过路径的前缀判断出我们的路径在哪一个分区下。 所以我们总结一下假设我们打开一个文件这个过程是怎么样的呢首先确认的是打开的时候是进程打开它而进程有自己的 cwd然后就结合进程的 cwd 和我们传入的路径假设使用 fopen(./log,txt, r)我们传入的路径就是 ./log.txt就可以定位这个路径在磁盘的哪里根据路径可以确定在哪一个分区里面根据路径就能找到它的上级目录的 inode 和文件内容目录找到了就可以找到文件名和 inode 的映射关系也就是 inode 找到了就可以找到文件的属性就可以将属性加载到内存中在内存里构建 struct file 结构体把 inode 属性填充到结构体里面然后根据 inode 找到文件的数据块将数据块预加载到文件里缓冲区就有了如果我们要读怎么办呢系统将缓冲区的数据拷贝到应用层我们就拿到了 三、软硬链接 1. 软链接 我们先来看看在 Linux 中如何进行软链接假设我们当前目录下有一个 log 文件对它进行软链接指令如下 ln -s log log.soft.link其中 ln -s log 代表对 log 进行软链接而后面的 log.soft.link 表示用 log.soft.link 对前者进行软链接。链接完成后如下 我们看一下它们的 inode 编号 我们可以看到它们的 inode 编号是不一样的即是两个独立的文件。 为什么要有软链接呢软链接又是什么呢这就好比 Windows 下的快捷方式快捷方式一般是放在桌面上 我们一点就能打开但是我们也可以通过它的路径找到可执行程序直接运行也能打开它。但是有时候某个应用的可执行程序放在 C盘 的很深处我们需要费很大功夫才能找到它所以我们可以创建一个软链接指向它可以直接打开它。 在 Linux 下比如我们写了一个程序 test.c一般都是打包到一个文件夹给别人使用所以我们编译好打包放入 proj 中的 bin 目录下如下 proj 下的目录结构和 bin 的目录结构如下 此时我们每次执行 test 程序都要在 bin 路径下执行这种方法很不好所以我们可以用软链接进行对 test 进行链接可以快速定位到这个文件如下 那么我们该如何理解软链接呢其实它就是独立文件有独立的 inode软链接内容是指向的目标文件的路径。 2. 硬链接 我们也先看看在 Linux 中使用硬链接例如对当前路径下的 file 文件进行硬链接指令如下注意此时不用带 -s 选项 ln file file.hard.link链接完成后如下 我们再看看它们的 inode 我们可以看到硬链接后它们的 inode 是一样的并且和软链接的区别还有上述中绿色和蓝色框中的数字也增加了。 所以我们得出结论软链接是一个独立的文件硬链接不是一个独立的文件因为它没有独立的 inode 编号。 那么硬链接是什么呢它的本质就是在指定目录内部的一组映射关系即文件名和 inode 的映射关系所以建立硬链接就是增加了一个文件名和 inode 的映射关系那么如果我们删除硬链接呢删除硬链接的做法如下 unlink file.hard.link然后我们查看属性该列的数字又变回1了如下 但是该文件还在因为它的 inode 还在那么一个文件什么时候应该真正被删除呢没有文件名和 inode 映射时(没有人用了)在文件系统层面目标文件怎么知道没有文件名指向我了呢其实 inode 块里面还包含一个引用计数 ref count如下 struct inode{int ref count;大小、权限、拥有者、所属组、ACM时间、inode 编号等;int blocks[15] {1, 2, 4};}该引用计数统计的是有多少个文件名指向该 inode即表明有几个文件名映射关系 文件名在目录里面具有唯一性文件名其实有点像指针该文件名指向 inode多一个文件名指向 inode 引用计数就加一少一个就减一减到0说明没有文件指向该 inode就需要删除该 inode 编号。 其实我们上面所看的属性中有一列我们从来没有介绍过就是硬链接数如下框中的数字就是表示硬链接数 接下来我们创建一个 newdir 目录和一个 newfile如下为什么新创建的目录硬链接数是 2而新创建的文件硬链接数是 1呢 那么我们就进入 newdir 看一下我们知道每个目录下默认都有两个隐藏文件如下 我们知道. 表示当前目录为什么它代表当前目录呢很简单因为它的 inode 和该目录本身的 inode 是同一个我们可以从上面两个图中观察到所以 . 表示当前目录 接下来我们在当前目录下再新建一个 dir然后我们退回上级目录再看一下 newdir 的属性 我们发现它的硬链接数又变成了 3 这是为什么呢这肯定是有新的文件名指向它的 inode我们猜想它一定和在 newdir 中新建的目录 dir 有关所以我们直接到 dir 中查看 我们发现在 dir 中有一个 .. 的隐藏目录该目录的 inode 也指向了 newdir 的 inode因为 .. 代表的是当前所处目录的上级目录 所以硬链接的应用场景经常用作路径切换和回退。 最后有一个结论就是用户无法对目录建立硬链接因为会导致环状搜索问题。 四、页框和页帧 我们已经知道操作系统需要对文件进行管理对文件管理必然离不开对内存进行管理所以操作系统也要对内存进行管理。物理内存的本质就是对数据的临时存取所以在系统层面上可以把物理内存看作一个非常大的缓冲区。物理内存必定要和磁盘有一定的关联因为磁盘的数据都需要加载到物理内存里。 为了更好地进行物理内存和磁盘之间的数据交互操作系统内部将物理内存划分为基本单位一般这个基本单位的大小为 4KB我们称这个基本单位为页框。而磁盘中的可执行程序也被划分为以 4KB 为单位的小的数据段我们将这个单位称为页帧。所以物理内存和磁盘在进行数据交互时是以 4KB 为单位进行交互的 为什么是4KB呢硬件层面上可以减少IO的次数减少访问外设的次数。如果我们的数据不够4KB呢如果我们只需要访问其中的100字节操作系统也会把4KB加载进来因为基于局部性原理的预加载机制也就是我们方法这100个字节很大可能还会访问附近的空间。
http://www.w-s-a.com/news/518711/

相关文章:

  • 旅游短租公寓网站建设深圳龙岗招聘网
  • 做海淘是在哪个网站网络查控系统设计方案
  • o2o网站建设代理商微信公众号开发文档
  • 网站设计课程总结关于网站备案的公告
  • 网站建设与运营意义到哪查找网站域名
  • 网站及单位网站建设情况眉县住房和城市建设局网站
  • 网站是否能够被恶意镜像wordpress占用
  • 经典设计网站网站等保测评怎么做
  • 重庆做网站公司贴吧廊坊公司快速建站
  • 海外贸易在什么网站做怎么排名到百度第一页
  • 线上注册公司是在哪个网站做高仿网站
  • 网站构架图网上推广平台哪个好
  • 公司网站首页图片素材vi设计的目的和意义
  • 网站的需求分析都有哪些内容济南营销型网站建设团队
  • 怎么选择优秀的网站建设公司生鲜网站开发
  • 如何编写网站建设销售的心得网站的权限管理怎么做
  • 网站业务员好做吗无忧网站优化
  • 网站随机代码网站建设费 账务处理
  • 商洛网站建设哪家好网站建设 织梦者
  • 怎么创建收费网站宁夏住房和城乡建设部网站
  • 怎么确认网站是什么语言做的用php和mysql做网站
  • 安徽做网站的公司有哪些星子网络公司
  • 肥西县重点工程建设管理局网站wordpress界面菜单怎么弄
  • 宁夏网站开发设计说明书wordpress主题背景图片
  • 同一个阿里云可以做两个网站吗织梦 帝国 学校网站
  • 城阳网站建设培训网站后台怎么上传文件
  • 重庆茂尔建设集团有限公司网站网页制作教程软件
  • 金湖建设工程质量监督网站高端网站建设公司哪里济南兴田德润实惠吗
  • 站酷设计网站官网入口文字设计seo网站推广工具
  • 专业移动网站建设网站建设软件dw