一个文件只需要一个inode节点来存储文件的元信息就够了,所以文件和inode节点是一一对应的
struct m_inode {
unsigned short i_mode;/文件类型和属性,ls查看的结果,比如drwx———/
unsigned short i_uid;/文件宿主id/
unsigned long i_size;
unsigned long i_mtime;/文件内容上一次变动的时间/
unsigned char i_gid;/groupid:宿主所在的组id/
unsigned char i_nlinks; /链接数:有多少个其他的文件夹链接到这里/
unsigned short i_zone[9];/文件映射的逻辑块号/
/ these are in memory also /
struct task_struct i_wait;/等待该inode节点的进程队列/
unsigned long i_atime;/文件上一次打开的时间/
unsigned long i_ctime;/文件的inode上一次变动的时间/
unsigned short i_dev;/设备号/
unsigned short i_num;
/ 多少个进程在使用这个inode/
unsigned short i_count;
unsigned char i_lock;/互斥锁/
unsigned char i_dirt;
unsigned char i_pipe;
unsigned char i_mount;
unsigned char i_seek;
/
数据是否是最新的,或者说有效的,
update代表数据的有效性,dirt代表文件是否需要回写,
比如写入文件的时候,a进程写入的时候,dirt是1,因为需要回写到硬盘,
但是数据是最新的,update是1,这时候b进程读取这个文件的时候,可以从
缓存里直接读取。
*/
unsigned char i_update;
};


对比内存,磁盘的管理方式也类似,只不过磁盘最小的存储或读写单元是512byte,称之为扇区(用户哪怕只想读1格byte,驱动每次也要读512byte的数据);不过现在的文件一般都远超512byte,所以存储单个文件肯定需要超过1个扇区的空间,这就导致了磁盘的磁头要挨个读不同的扇区,花费大量时间在磁盘上寻址,导致IO效率低下,形成了瓶颈!为了提升读取效率,磁盘一般都是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB(和内存页的大小保持一致,便于从磁盘读写数据),即连续八个 sector组成一个 block;


https://zhuanlan.zhihu.com/p/183238194
空闲空间管理
前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块,我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?
那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:
- 空闲表法

- 空闲链表法

- 位图法
位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。
当值为 0 时,表示对应的盘块空闲,值为 1 时,表示对应的盘块已分配。它形式如下:
1111110011111110001110110111111100111 …
在 Linux 文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于 inode 空闲块的管理,因为 inode 也是存储在磁盘的,自然也要有对其管理。