磁盘是一个机械设备,外设。
磁盘的基本单位是扇区,一个扇区512字节,4KB。一片可以有n磁道,1磁道可以有m扇区。
如何找到指定位置的扇区?a.找到指定的磁头H b.找到指定的磁道(柱面)C c.找到指定的扇区S。这个叫CHS定址法。
访问磁盘数据的基本单位是扇区,即使只改一字节,也得把要改的那个位置的那个扇区512字节空间加载进内存再操作。
文件就是再磁盘中占有几个扇区的问题。
操作系统和磁盘交互的时候一般规定是4KB,4KB=8个连续的扇区,也就是一个块的大小。
文件 = 很多的块构成。
知道是第n个块,则n*8 = N,就是那个位置的块的起始位置。
管理磁盘800GB,磁盘可以分区,每个区再分组,因此需要管理磁盘文件,只需要能够管理好每个分组就行。
分组包含的信息如下:
Data blocks:里面是一个一个的4kb的数据块,只存放分组内各个文件内容。
Block Bitmap:位图结构,描述Data blocks中的空间使用情况。
inode table:文件的属性包含比如 文件大小、所有者、最近修改时间、inode号、文件使用的块号等(但是不直接包括文件名,文件名是在内核层面上有inode号标识)。是一个固定的集合体,一般是128字节,一个文件一个struct inode,而inode table存放这个分组内文件的属性的结构体,也就是说存放每一个文件的struct inode。
inode map:位图,表示第几个inode table 中的 inode struct的使用情况。
Group Descriptor Table:描述一个块组的使用情况。
Super Block:描述整个分区的使用情况、有多少块组等信息。并不是一个分区内每个分组都有,有的分组有,有的没有。
在每一个分区内分组,然后写入文件系统的管理数据,叫做格式化。
细节:
找文件都是根据inode编号进行寻找,inode编号以分区为单位进行分配。一个分区内的inode 编号不会重复,但不同分区不一定。
struct inode{ … , int inode_num, int datablocks[15] }; 在这个结构体中,inodenum存放的就是inode编号,datablocks中一个位置映射一个空间,而一般只有12个位置是直接索引的4KB使用空间,剩下的三个位置映射的4KB空间存放的是映射其他位置的空间。这样就保证了一个大文件也可以合理创建。
目录也是文件,目录的内容存放的是该目录下的文件名和inode编号的映射关系。因此同一目录下,不能有相同的文件名,因为同一文件名无法返回找到正确的inode 编号。目录的r 权限就是限制是否有查看 inode和文件名的映射关系。目录的w 权限,也是同理。
删除文件,只需要把文件的inode map 和 block map 把位图由1置0,就能直接删除。
每次找文件名和inode 的解析,需要从根目录找起,是一个逆向解析过程。因为要知道当前文件名和inode关系得去从当前目录内容寻找,而为了了解当前目录的内容,又得知道当前目录的目录 和 目录的目录inode关系,因此就是一层一层得从最上面找。但其实不是每次都得从头找,因为OS会进行缓存。
对于一个被打开的文件,会保存一个路径信息。那么对于很多个路径信息也是先描述再组织。
文件的打开包括:文件的操作表,文件的缓冲区,文件的属性集。