我们之前谈到的文件描述符fd,是与被加载到内存中的文件相关的,那么还有什么文件呢?磁盘文件
内存文件 ------ 断电失效
磁盘文件 ------ 不受断电的影响
磁盘存储器存、取信息的最基本单位是扇区。
—个扇区能存储512Bytes的数据,OS与磁盘交互的单位是4KB。
为什么不以512Bytes为单位呢?----太小,导致多次IO,效率降低 ----太大,可能会导致供大于需。
----相同的话,万一磁盘的基本单位变化了,OS也需要变,意味着磁盘与OS的耦合度增大。
磁盘结构:
- 表面(Head):磁盘的表面由磁性物质组成,用于记录二进制数据。磁盘表面被划分成一个个磁道,每个磁道又被划分为一个个扇区,每个扇区就是一个“磁盘块”。
- 磁道与柱面(Cylinder):磁道是磁盘表面上的同心圆,每个磁盘有两个面,每个面都有一个磁头。所有盘面中相对位置相同的磁道组成了柱面。
扇区(Sector):每个磁道被划分为多个扇区,每个扇区的数据量相同。靠最内侧的磁道上的扇区面积最小,因此其数据密度最大。
磁头:磁头用于读写数据,需要借助磁头移动到想要读/写的扇区所在的磁道。磁盘会转动,让目标扇区从磁头下面划过,才能完成对扇区的读/写操作。
如何对磁盘上的文件进行管理呢? 将磁盘的结构抽象成一个 很长很长 的数组。
即定位地址的方式由CHS(Cylinder Head Sector),转变成了LBA(Logical Block Array)。
我们发现,之前我们使用 ls -l -i 或者 stat + 文件名 的时候,发现有一列数字(Inode),Inode是什么呢?要想知道Inode,我们先来了解一下文件系统。
对“大数组”的管理,必须做好对数组的每一小块的管理。
Block Group: ext2 文件系统会根据分区的大小划分为数个 Block Group 。而每个 Block Group 都有着相同的结构组成。超级块(Super Block) :存放文件系统本身的结构信息。记录的信息主要有: bolck 和 inode 的总量,未使用的block 和 inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了Group Descriptor Table(GDT): 块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下块位图(Block Bitmap ): Block Bitmap 中记录着 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用Block Bitmap :和Data blocks是一 一对应的,比特位为1代表该block被占用,为0表示空闲。inode位图(inode Bitmap): 每个 bit 表示一个 inode 是否空闲可用。i节点表(inode Table): 存放文件属性 如 文件大小,所有者,最近修改时间等数据区(Data blocks): 存放文件内容
文件名 和 Inode 是一 一对应的,目录也是文件,目录中的文件名 和 Inode 就存在该目录对应的Data blocks中,文件名 和 Inode 是互为Key的!!!
我们发现,一个Block group并不是很大,对于那些几十甚至几百G的文件,该怎么存放呢?
可以将其他Block group的索引信息填写到当前 Block group中的 Data blocks中,这样,就形成了如下的多叉树的结构,显然一定能存的下!!!
创建文件,文件名 和 Inode 就被存放到当前目录对应的Data blocks中。
删除文件, 只需将Block Bitmap 和 inode Bitmap当中对应的比特位由1置为0即可,不需要修改Data blocks中的内容。