文件数据结构:索引节点,目录项

索引节点(inode):记录文件元信息(...),是文件唯一标识符,一一对应存储在磁盘空间

目录项(dentry):记录文件名字,索引节点指针,与其他目录项的层级关联关系。由内核维护缓存在内存中。

目录与目录项

目录是文件在磁盘,避免每次去磁盘查询,内核将维护一个目录项。

文件是如何存储在磁盘的?

磁盘读写单位:扇区:512B

文件系统组和扇区成一个逻辑块,linux中逻辑块大小为4KB

为了加速文件访问,将索引节点加载到内存中

磁盘被分为三大区

超级块:头部存储文件系统详细信息(块数,大小,空闲块等)

索引节点区:存储索引节点

数据块区:存储文件或目录数据

文件系统缓存到内存的时机

超级块:当文件系统挂载时

索引节点:当文件系统被访问时

文件系统众多,用虚拟文件系统管理

操作系统希望对用户提高统一的接口,引入中间层:虚拟文件系统

文件系统分为三类

磁盘文件系统:直接存储在磁盘:Ext ,XFS

内存文件系统:占用内存空间存储:/proc,/sys

网络文件系统:访问其他计算机主机数据文件系统

文件系统先要挂载才能使用

文件的使用

open()打开一个文件,返回一个文件描述符:

操作系统会跟踪进程打开的所有文件,操作系统为每一个进程维护一个打开文件表,文件表里的每一项代表文件描述符,所以文件描述符就是打开文件的标识。

文件指针:保存上次读写位置,对单个进程来说是唯一的

文件打开计数器:多个进程可能打开同一个文件,需要等计数器为0,才能删除

文件磁盘位置:大多数会被从磁盘缓存到内存中。

访问权限:每个进程打开文件都需要一个访问模式(创建,只读,读写,添加等),该信息保存在进程的打开文件表中。以便操作系统允许与拒绝i/o操作;

用户习惯读字节,但操作系统是以数据块来读写文件,屏蔽这种差异的就是文件系统

1.当用户读取一个字节大小数据时,文件系统获取字节所在数据块,再返回数据块对应的数据部分

2.当把一个字节大小的数据写进文件时,找到数据块位置,修好数据块中对应的字节

文件的存储

连续空间存放

非连续空间存放:

1.链表方式

2.索引方式

连续空间存放方式

文件存放在磁盘[连续的]物理空间中,读写效率高,一次磁盘寻道读出整个文件

但需要文件头保存指定[起始块的位置]和长度

缺点:

容易产生磁盘空间碎片和文件长度不易扩展

非连续空间存放方式

链表:

是离散的,不用连续,解决了磁盘碎片问题,同时可以动态扩展文件长度

隐式链表:

1.一个文件头保护起始块和末尾块

2.每个数据块留出一个指针空间,存放下一个数据块的位置

缺点:

只能顺序访问,不能随机访问,稳定性差,一旦指针丢失或损坏,导致文件损坏

显示链表:

通过一个文件分配表,存储每一个数据块地址,从而解决无法随机访问,与稳定性差的问题

缺点:

不适用于大磁盘,文件越大需要保存的数据越多,浪费的空间越多

索引数据块

解决磁盘碎片与文件动态扩展问题,支持顺序与随机读写。

每个文件一个索引数据块:存储指向文件数据块的指针列表,文件头存放索引数据块地址

链式索引块

解决存储大磁盘文件

一个头文件保存指向索引块的指针,每个索引块保存文件数据块,每个索引块指向通过隐式链表保存下一个索引块地址

根据文件大小

1.小于10块直接用一个索引块保存:10个指向数据块的指针

2.超过10块用一级索引:11个指向索引块的指针

3.大文件用多级索引:10多个指向多级索引块的指针

空间空间管理

空闲表法:

适合连续的空闲表空间(保存第一块和空闲的块数)

空闲链表法:

用链表包空闲块连在一起无法随机访问,且不稳定,不适合存储大型文件系统

位图法:

用二进制标识磁盘中一个盘块的使用情况,0表示空闲,1表示已分配

文件系统的结构

由大量的快组组成

块组:

1.超级块:inode总个数

2.组块描述符:文件系统各个组块的状态

3.数据位图与inode位图:对应数据块的空闲与否

4.inode列表:保存所有inode,用于保存文件系统与各文件和目录相关的所有元数据

5.数据块:包含文件的有用数据

超级块与块组文件描述符中保存了全局信息

为了避免超级块的损坏,导致所有信息丢失,多备份几个

目录的存储

保存的是当前目录绝对路径

下一级的相对路径

保存在列表中,通过取余,哈希值去定位数据块再查找

为了减少目录查询时反复进行i/o操作导致开销过大,将文件目录缓存到内存中,只对内存进行操作,降低磁盘操作次数,提高文件系统的访问速度。

软链接和硬链接

硬链接:

1.多个目录项中的索引节点指向同一个文件(inode),

2.因为inode不可能跨越文件系统,每个文件系统都有各自的inode数据结构,所有硬链接不可用于跨文件系统

3.因为有多个目录页指向inode,只有在所有硬链接都断开始,才彻底删除文件回收资源。

软链接:

1.从新创建了一个文件,拥有独立的inode,但文件的内容是另一个文件的路径,访问时相当于访问另一个文件

2.软链接是可以跨文件系统的

3.目标文件被删除时,链接文件依旧存在,只是找不到目标路径文件

文件I/O

缓冲与非缓冲文件I/O:

根据是否利用标准库缓冲,为的是减少系统函数的调用次数。

直接与非直接

是否利用内核缓存空间,读写时直接访问磁盘,利用内核缓存,由内核决定写入磁盘时机,减少访问磁盘的次数提高运行效率:

1.当缓存超过一定时间

2.主动调用sync

3.内存缺乏时,内存回收机制,将数据换出

阻塞与非阻塞 VS 同步与异步

需要等待:

1.数据准备的过程

2.数据从内核空间拷贝到用户进程缓冲区的过程

同步:

1.阻塞等待内核数据准备好,一直占用cpu

2.非阻塞等待内核数,当数据没准备好时,先往下继续执行,应用程序不断轮询内核,直到数据准备好,并没有实质性的解放cpu

3.非阻塞I/O多路复用:改善了对cpu的利用率,在没有通知时解放cpu,有事件时再轮询一遍内核。

异步:

一个都不需要等待。