文章目录
- 前面基础的总结
- 文件系统
- 文件的管理目的问题
- 文件的管理内容问题
- 磁盘
- 磁盘的结构和基本原理
- 磁盘的分区
- 磁盘的索引原理
- 磁盘的逻辑抽象写入
本篇主要对于磁盘进行深入的理解,从而对于文件系统有一个基本的认识
前面基础的总结
在开始对文件系统做理解前,先对于前面的文件部分进行初步的总结
如何理解操作系统管理文件这个过程呢?
当进程运行到特定的代码语句时,需要对于文件进行访问,在操作系统内部会有关于当前进程的PCB,通过这个PCB可以找到一个指针,这个指针指向的结构体是专门用来管理文件的结构体,而在这个结构体中,又包含一个指针数组,这个指针数组也叫做进程文件描述符表,而数组中存储的是一个一个的指针,这些指针又分别指向对应的结构体,这个指向的结构体就是用来描述文件的结构体,每一个结构体都对应着磁盘上的文件信息,这样就把从语言,到操作系统,到磁盘外部这三个模块建立起来了联系
简单来说,当语言层面需要用到关于文件的操作时,就会调用系统调用的接口,操作系统作为内存中的管理者,就会承担起接受系统调用接口的责任,因此就会通过这个进程在内存中创建的PCB,找到指向管理文件的结构体,同时,操作系统会把磁盘中的文件加载到内存中,为这个文件建立起来一个描述文件的结构体,在进程的PCB找到的这个文件描述符表中,就会与这个建立起来的专门用来描述外部的文件建立一定的联系,这样就形成了一张网,建立起来了联系,因此我们说,操作系统在访问文件的过程中,它只认识文件描述符,基于这样的原理,就可以很轻松的理解重定向的原理,所谓重定向的原理就是把文件描述符进行了一次覆盖,用新的描述符代替原来旧的描述符,这样当原本向显示器中打印的信息就会被重定向到其他指定的文件,它背后的原理就是因为原来向显示器中打印文件的文件描述符被覆盖成了一个新的文件描述符,这样就实现了重定向的基本原理
上述就是关于操作系统管理文件的一个过程
如何理解一切皆文件?
在操作系统中,由于存在上述的体系,因此就存在这样的技术,可以将外部的硬件用描述文件的结构体表示出来,这样的技术也叫做虚拟文件系统,在这样的技术下,就可以实现了将每一个硬件的信息都用一定的文件描述的方法进行一些表示,这样在把文件加载到内存中后,就可以参与到上述所表示的文件系统的运作中,也就是说,虚拟文件系统就是将不同硬件的读写方式用相同的文件结构体来描述出来,在文件结构体中存在包括但不限于有读和写的方法,将不同硬件的读写方式分别录入到这样的文件系统中,就可以达到特定的想要的效果,也就能做到屏蔽不同的硬件带来的属性差异,而能在操作系统中用相同的方式实现文件接口的调用,来进行方便于文件的管理
上述就是关于一切皆文件的理解,在这样的基础上,下一步是进行了关于缓冲区的概念
如何理解缓冲区?
在Linux系统中,存在有两种意义的缓冲区,一种是语言类提供给我们的缓冲区,一种是操作系统向外部进行交互的时候使用的内核缓冲区,不管是什么样的缓冲区,它们的主要目的都是为了提升效率,使得只需要将请求传递给缓冲区,就能立刻拿到所需要的返回值信息,可能是返回成功也可能是返回的错误信息,至于后续的操作就不在用户的考虑范围内,如何将信息从缓冲区刷新到指定的位置就交由操作系统来完成
基于上面所说的这几点理论,下面来对文件系统进行进一步的理解
文件系统
文件的管理目的问题
在磁盘中存在很多很多的文件,而实际上只有很少的一部分文件是要被打开的,换句话说,只有很少的文件是需要被加载到内存中的,大致上可以把文件分成两种文件:
- 已经打开的文件
- 大多数都是没有被打开的文件,它们存储在磁盘中
对于第一种文件来说,如何进行管理?答案是有操作系统在内存中对这些文件进行管理,那第二种文件需不需要管理呢?答案是肯定是需要的,管理的目的是为了快速查找,将这些文件进行管理起来,才能在需要的时候可以立刻定位到所需要的位置,进而进行调用或是其他的各种操作,那么初步的,将管理这些文件的目标设置为需要定位文件,提供一个合适的路径,进而可以在所需要的时候进行快速的定位
文件的管理内容问题
在磁盘中管理的文件,管理的本质是什么?
从前面的知识体系中,有这样的基本认知:文件 = 内容 + 属性,所以管理文件的本质就是管理的是文件的内容和文件的属性,也就是说是目的是为了方便用户进行文件的增删查改,换句话说是为了便利与操作系统对于文件的增删查改
文件的内容是被放置到哪里的?
这是一个很显然的问题,文件的内容当然是存储在了磁盘中,换句话说是存储在了一个硬件,一个物理的存储结构中
文件要在哪里被管理?
这也是一个很显然的问题,文件的管理当然要被放置在操作系统中进行管理了,操作系统本质上来说是内存中的管理,也就是一种逻辑的存储结构
因此现在的问题是,如何将文件的管理从硬件的物理存储结构转换成逻辑抽象的逻辑存储结构呢?这就是本篇要讨论的核心问题,这对于理解操作系统管理磁盘,和理解文件系统来说是至关重要的,进而会延伸到软硬链接的问题
磁盘
那么想要理解磁盘是如何管理内容,就必须要先走近磁盘,理解它内部的结构信息
磁盘的结构和基本原理
上述展示的是关于一个磁盘的结构,关于上述的复杂结构也不必过多理解,只需要知道磁盘总体来说是由磁片和磁头组成的,而在一个磁片中是存在多个这样的结构的,每一个磁头会用于寻找一个磁片中的信息,磁片会随着主轴而进行高速旋转,而磁头是可以左右进行旋转的,而磁片的旋转和磁头的旋转就可以保证磁头可以访问到磁片中的任意一个位置的信息,也就达到了访问的目的
磁盘的分区
磁盘的信息是如何存储的?结论肯定是经过一定的区域划分才能进行数据的存储,而划分的方式就是通过上图进行划分的
对于单个磁片来说,可以划分为很多个磁道,而每一个磁道又会组成一个一个的扇区,而扇区就是最小的存储单元,对于不同的扇区来说存储的数据密度肯定是不相同的,这也就能保证虽然离中心点近的扇区区域小,但是依旧可以保证存储的空间和外部的扇区存储的空间是相同的
基于上述的这个原理,可以做出一些初步的总结
- 一个盘面可以有多个同心的轨道
- 一圈磁道可以有多个扇形的扇区组成
- 扇区是磁片的最小存储单元,通常是512字节或是4kb
磁盘的索引原理
上图展示的是磁盘的一个立体的图片,一个磁盘是由多个磁片所组成的,这是可以看出的,因此也就包括了磁道,扇区,和柱面这样的组成部分
现在的问题是:当需要对于磁盘中某个特定的位置进行写入,如何具体的定位呢?
- 选择某一面,本质上来说是选择一个合适的磁头
- 选择这个面上的吗,某个轨道
- 选择这个磁道上的某个扇区
这样的过程就叫做CHS定位法,通过这样的三个步骤,就可以定位到所需要的某个扇区,进而进行数据的读和写,这样就可以向任意一个或者多个的连续扇区中进行写入,也可以进行随机写入
磁盘的逻辑抽象写入
磁盘的外部结构已经基本理解了,那么操作系统自然是需要得到磁盘中的信息的,那么操作系统是如何读取和存储关于磁盘的信息的呢?是直接存储这些物理结构吗?答案是否定的,在操作系统内部,会把整个磁盘想象成一个数组,不断的拉长拉长再拉长,这样就能把这样的磁盘抽象成数组,也就是把磁盘的存储的逻辑抽象结构描述了出来
将磁盘想象成一个线性的空间:
通过上述的这个过程,就可以把整个磁盘用一个数组来表示起来,这样就能像访问数组一样进行访问磁盘,进而进行数据的增删查改等等行为…
例如给定一个字符的下标是123,那么假设下标1-100000是第一面磁盘,下标1-10000是第一个磁道,那么就可以有如下的定位计算方式:
1234 / 100000 = 0 表示现在是第一个磁片
1234 / 10000 = 0 表示现在是第一个磁道
123 % 10000 = 123 表示现在是123所在的扇区
在实际的映射计算中可能比上述的计算要复杂的多,但是基本原理已经从上述的计算中可以看的出来,的确通过这样抽象出来的数组可以找到磁盘中对应的位置
操作系统,可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块为单位进行数据的存储,一般来说选择后者进行数据的存储,这里按照八个扇区为一个文件块,因此就可以把扇区又进行划分,每八个扇区为一个文件块
LBA地址:全称叫做logical block address,LBA作为地址,可以对应到CHS地址,也就是通过操作系统内部抽象出来的逻辑结构的地址,可以与外部的磁盘的实际地址做出一个对应,这样就完成了初步的目标
到这里,就把存储设备的管理,在操作系统层面转换成了对数组的增删查改