文件=内容+属性,前面我们所说的文件操作都是针对以打开的文件,那么未打开的文件呢?当然是在磁盘上储存着,接下来谈谈它是如何储存的。
在2000年的时候流行过一段时间的光盘。
这种光盘有一面是光滑的,而磁盘就由一个或者多个这样的光盘组成(它的两面都是光滑的)。
磁盘有一个磁头,当电脑关机时,磁头就会转到磁头停靠点。当磁盘通电时,磁盘会顺时针或逆时针高速旋转,同时磁头也会来回摆动。整个磁盘的底部会有一个与电脑的连接口,当把磁盘插入到电脑里时,电脑就能通过连接的总线把二进制信号读入电脑。
磁头是两面都有,如果只有一个光盘那么就有两个磁头,如果是两个光盘,那么就有四个磁头。注意磁头和盘面不接触。
磁盘上的数据是有规律的,它会循着马达向外部扩散,形成一个一个的同心圈,数据就储存在这些圆上,这些同心圆被称为磁道。在盘面上还会有一条条的线,将磁道分割成一个个扇形区域,这些区域被称为扇区。磁盘被访问的最基本单位就是扇区-一般512B/4KB。
要把数据储存到磁盘第一个问题就是定位—面->磁道->扇区。 从上往下看,多个圆重合在一起形成一个柱形结构,这个结构被称为柱面。前面说到磁头会左右摆动,就是在定位磁道。
磁盘为什么慢主要取决于:1.确认磁道;2.盘片的自转。 如果数据无序,势必会导致盘片的自转次数变多。所以运动越少,效率越高;运动越多,效率越低。
虽然在物理结构上是圆形,但在逻辑结构上可以看成线性。
每一个扇区都有对应的下标,那么这样我们就能通过下标计算它所处的面,磁道。
回归到硬件:不仅CPU里有寄存器,磁盘里也有寄存器。
进程可以让操作系统间接的帮忙检查状态寄存器,判断状态是否变化,如果变化则操作结束,否则进行等待。然后IO访问控制寄存器,查看指令,接着对数据进行相应的操作。
如果一个电脑的磁盘有800GB的大小,那么毫无疑问这对于操作系统来说太大了不易于管理。于是我们可以将磁盘划分为C盘,D盘…之类的分区,当然这还是有些大,于是操作系统就又继续分割,分成一个个Block group组。
BootBlock:一般被称为启动分区,主要包括一些磁盘分区的起止位置,开机信息等等。
Block group:就是把磁盘划分成更多份。那么就把一块很大的磁盘变成了管理一个Block group的小块。而这些块里面的就是文件系统。
inode Table:inode是一个结构体保存了单个文件的全部属性(文件名不属于inode),128字节,一般而言一个文件一个inode。而inodeTable保存了该分组所有inode。
Data Blocks:存文件内容的区域,以块的形式呈现一般为4KB.
inodeBitmap:判断该编号的Inode是否有效。
inodeBlock:判断该编号的block是否有效。
SuperBlock:文件系统的基本信息,虽然它存在组里,但它保存的是每一个分区的信息。它不会在每一个组里都存在,但会存在某些组里,这是为了防止superblock丢失。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。
格式化:每一个分区在被使用前,都必须先将部分文件系统的属性信息提前设置进对应的分区中。
GroupDescriptorTable(GDT):块组描述符,描述块组属性信息。例如使用了多少块…
我们看到,真正找到磁盘上文件的并不是文件名,而是inode。其实在linux中可以让多个文件名对应于同一个inode。而硬链接就相当于给文件取别名。硬链接不是一个独立的文件,它没有自己的inode。
建立一个文件,它的默认硬链接数是1,因为最开始只有它自己指向自己
建立一个硬链接:对link建立一个名为hard-link的硬链接,ln link hard-link
可以看到它们两个的硬链接数都变为了2,它们都指向同一个文件。实际上这个硬链接数是一个引用计数。我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
目录的硬链接数
我们自己不能给目录创建硬链接。原因很简单,目录是通过树形结构来搜索,一旦在子节点创建了一个对父节点的硬链接,那么在搜索文件时,很有可能就会造成父节点-子节点-父节点-子节点…的闭环。所以操作系统禁止给目录创建硬链接。
但是目录本身有硬链接数,这是由操作系统自己创建的。每一个目录都会有两个隐藏目录,.和… ,分别指向自身和上级目录,这其实就是一种硬链接。
创建一个目录,它默认硬链接数是2,因为还有一个.指向自己
当再在该目录里创建子目录时链接数还会增加,因为每创建一个子目录,就会多一个…指向该目录
所以要知道该目录下有多少个子目录,只需要硬链接数-2即可。
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件。软链接是一个独立的文件,它有自己的inode。常被用于创建一个软件的快捷方式。
建立一个软链接,两者的硬链接数不会发生改变:对test.txt建立一个名为soft_link的软链接,ln -s test.txt soft_link
注意:删除链接虽然可以使用rm,但建议使用unlink.