技术编程|低调的 Linux 文件系统家族( 七 )
rec_len 域是如何扩展的呢?如下图所示
本文插图
我们可以看到 , 中间的 second 被移除了 , 所以将其所在的域变为第一个目录项的填充 。 当然 , 这个填充可以作为后续的目录项 。
由于目录是按照线性的顺序进行查找的 , 因此可能需要很长时间才能在大文件末尾找到目录项 。 因此 , 系统会为近期的访问目录维护一个缓存 。 这个缓存用文件名来查找 , 如果缓存命中 , 那么就会避免线程搜索这样昂贵的开销 。 组成路径的每个部分都在目录缓存中保存一个 dentry 对象 , 并且通过 i-node 找到后续的路径元素的目录项 , 直到找到真正的文件 i - node 。
比如说要使用绝对路径来寻找一个文件 , 我们暂定这个路径是 /usr/local/file, 那么需要经过如下几个步骤:
首先 , 系统会确定根目录 , 它通常使用 2 号 i -node, 也就是索引 2 节点 , 因为索引节点 1 是 ext2 /3/4 文件系统上的 坏块 索引节点 。 系统会将一项放在 dentry 缓存中 , 以应对将来对根目录的查找 。
然后 , 在根目录中查找字符串 usr, 得到 /usr 目录的 i - node 节点号 。 /usr 的 i - node 同样也进入 dentry 缓存 。 然后节点被取出 , 并从中解析出磁盘块 , 这样就可以读取 /usr 目录并查找字符串 local 了 。 一旦找到这个目录项 , 目录 /usr/local 的 i - node 节点就可以从中获得 。 有了 /usr/local 的 i - node 节点号 , 就可以读取 i - node 并确定目录所在的磁盘块 。 最后 , 从 /usr/local 目录查找 file 并确定其 i - node 节点呢号 。
首先 , 系统会确定根目录 , 它通常使用 2 号 i -node, 也就是索引 2 节点 , 因为索引节点 1 是 ext2 /3/4 文件系统上的 坏块 索引节点 。 系统会将一项放在 dentry 缓存中 , 以应对将来对根目录的查找 。
然后 , 在根目录中查找字符串 usr, 得到 /usr 目录的 i - node 节点号 。 /usr 的 i - node 同样也进入 dentry 缓存 。 然后节点被取出 , 并从中解析出磁盘块 , 这样就可以读取 /usr 目录并查找字符串 local 了 。 一旦找到这个目录项 , 目录 /usr/local 的 i - node 节点就可以从中获得 。 有了 /usr/local 的 i - node 节点号 , 就可以读取 i - node 并确定目录所在的磁盘块 。 最后 , 从 /usr/local 目录查找 file 并确定其 i - node 节点呢号 。
如果文件存在 , 那么系统会提取 i - node 节点号并把它作为索引在 i - node 节点表中定位相应的 i - node 节点并装入内存 。 i - node 被存放在 i - node 节点表(i-node table) 中 , 节点表是一个内核数据结构 , 它会持有当前打开文件和目录的 i - node 节点号 。 下面是一些 Linux 文件系统支持的 i - node 数据结构 。
属性字节描述Mode2文件属性、保护位、setuid 和 setgid 位Nlinks2指向 i - node 节点目录项的数目Uid2文件所有者的 UIDGid2文件所有者的 GIDSize4文件字节大小Addr6012 个磁盘块以及后面 3 个间接块的地址Gen1每次重复使用 i - node 时增加的代号Atime4最近访问文件的时间Mtime4最近修改文件的时间Ctime4最近更改 i - node 的时间
现在我们来一起探讨一下文件读取过程 , 还记得 read 函数是如何调用的吗?
n = read(fd,buffer,nbytes);
当内核接管后 , 它会从这三个参数以及内部表与用户有关的信息开始 。 内部表的其中一项是文件描述符数组 。 文件描述符数组用 文件描述符 作为索引并为每一个打开文件保存一个表项 。
文件是和 i - node 节点号相关的 。 那么如何通过一个文件描述符找到文件对应的 i - node 节点呢?
这里使用的一种设计思想是在文件描述符表和 i - node 节点表之间插入一个新的表 , 叫做 打开文件描述符(open-file-deion table)。 文件的读写位置会在打开文件描述符表中存在 , 如下图所示
推荐阅读
- 电池技术,相机发烧|防爆相机多少钱能买到?
- 行业互联网|深圳第22届高交会闭幕:一大批新技术新成果集中亮相
- 电池技术|动能转换看烟台|有锂电池的地方就有创为
- 行业互联网|2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
- 行业互联网|英国运输技术论坛发布网络安全标准和指南摘要
- 钉科技|“选择性过滤”太难?方太“死磕”8年突破净水技术
- 中国新闻网|告别各自为营,梧桐车联宣布开放系统“技术底座”
- 腾讯|腾讯举办科学脱口秀X-Talk,聚焦人工智能、基因编辑等前沿技术
- |「推仔说新闻」NVIDIA曝光CPU+GPU加速技术 支持两家处理器
- 产业|清华教授魏少军:信息技术产业是全球GDP增长的主要动力
