系统中是不是所有的文件都被打开了呢?如果没有被打开呢?那么没有被打开的文件在哪里保存起来呢?
文件被打开后会在内存里,也会像进程一般,OS会有一定的数据结构对其进行管理,那么OS要不要管理一下磁盘上的文件呢?
例如:我们日常生活中的菜鸟驿站,你在网上买了几个快递到了菜鸟驿站,每日会菜鸟驿站会到很多个快递,当快递到站了其工作人员会将快递按照快递单号都分门别类的放好,也便于人们去取快递,其核心工作就是为了让用户快速定位快递进行提取,这也就是相当于我们的OS所做的工作。
菜鸟驿站的老板不仅会做这些工作,还需要知道菜鸟驿站今天会到多少快递,已经存储了多少快递,还有预估还能存储多少快递等等信息,为让菜鸟驿站好好的运作下去,要让这些包裹都好好存储起来。
整个菜鸟驿站就是我们的磁盘,菜鸟驿站的包裹就是我们一个个没有被打开的文件,菜鸟驿站的老板就相当于我们OS内的一个文件管理模块–我们称为文件系统
为了好好理解文件系统,我们先来认识一下磁盘
我们今天谈论的磁盘是企业级磁盘。磁盘在今天是并没有被淘汰,SSD在今天比磁盘依然是要贵的,磁盘存储的数据量比较大,又便宜,性价比比较高
[总结]
1. 磁盘是有多个盘片和磁头组成的,盘片和磁头是1:1的
2. 磁头和盘片经过旋转移动进行定位寻址
3. 磁盘是机械设备,不允许我们在其开机时进行移动、搬迁等等,出现物理上的损失
4. 盘片和磁头离得比较近,所以要求我们的磁盘要防震,以及内部要是无尘的,磁盘是很需要高精度的技术的,国外走的比较早,所以国外的技术是非常领先的
5. 企业磁盘的数据失去其价值的时候,是不会将磁盘随便扔掉的,但是对于磁盘需要去销毁,有人说可以消磁也有人说可以丢进火里烧毁,当然了这两种办法都是可行的,但是这费人费力消耗太大,所以我们的企业通过和另一些企业通力合作,通过一定的指令技术,将磁盘数据全部写0或者1,来达到消除数据的功效,进行集中报废
如果我们想访问磁盘里的一个扇区:
通过磁头定位:磁道/柱面(cylinder),确认使用哪一个磁头(head),再进行确认哪一个扇区(sector)
这种定位方案叫做CHS定位法
了解了这些,那么文件不就是多个扇区承载的数据吗?
我们先来认识一下磁带
磁带存储的数据就在这一条带子上面,它是圈起来通过马达将其一点一点移动的,通过技术读取带子数据,这一整个带子圈起来就相当于盘片里的一面,全部抽出来拉直了不就是一恶搞线性存储结构吗?
在我看来,磁盘也就是一个非常巨大的线性空间,而扇区就是其中一块一块的连续空间,可以理解为磁盘是这一整个线性空间,而磁道和扇区就是这其中一个一个的子空间,也就是说,我们对磁盘的管理也就是对数组的增删查改!我们就可以通过一个磁道有多少个扇区来访问到目标扇区
操作系统认为,一次和磁盘IO一个扇区单位太小了,访问速度太慢了,OS文件系统认为:IO的基本单位是4KB,如果一个扇区是512B,那么OS会一次访问8个扇区去进行IO。
SCSI采用LBA抽象定址。实际上硬件控制器还是以CHS来定址区块,但无论驱动程序还是任何以低级访问磁盘的应用程序(例如数据库软件)通常都不再需要这个参数。各种要求区块低级访问的系统调用把定义好的LBA传给驱动程序﹔最直接的情况下(逻辑器件与实体设备单一对应)驱动程序只是将LBA再传给硬件控制器。
一个磁盘整体空间是非常大的,我们OS会将其划分成一个一个小块。会对这个空间进行分区操作,分完区又会对其进行分组,将每一个小块进行管理就会将整个空间管理好了
大部分笔记本都只有一块磁盘,我们电脑里的C盘D盘是我们系统对其进行了分区的。
Linux磁盘文件特性:
文件=内容+属性
内容和属性分开存储
内容是大小不确定,可能很大,也可能很小,这是可变的
属性是固定大小的,属性的类别是一样的,只不过每个类别内容不一样
我们所有的文件的属性对应的结构体存储都叫inode
注: 文件名不属于文件属性!
为了能解释清楚inode
我们先简单了解一下文件系统
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的
Block Group
:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
超级块(Super Block)
:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table
:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap)
:每个bit表示一个inode是否空闲可用。
i节点表(inode table)
:存放文件属性 如 文件大小,所有者,最近修改时间等
数据区
:存放文件内容
使用指令ls -i
就可以看到文件的inode
位于文件最前面的数字编号就是inode编号
系统中,标识一个文件,用的不直接是文件名,而是inode
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
为了说明问题,我们将上图简化:
创建一个新文件主要有一下4个操作:
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。