第4章 文件的内部表示

来源:互联网 发布:ci框架怎么连接数据库 编辑:程序博客网 时间:2024/04/30 00:50
  • unix系统中每个文件都有唯一的索引节点。索引节点包含着为进程存取文件所必需的信息,如文件所有者、存取权限、文件长度、文件数据在文件系统中的位置。
  • 进程通过路径名来指明文件,内核把路径名转换成文件的索引节点(namei函数)。
  • 算法函数:iget、iput、bmap、namei、alloc、free、ialloc、ifree。
  • 文件系统分配函数比缓冲区分配函数更底层?

4.1 索引节点

4.1.1 定义

  • 磁盘索引节点包括:文件所有者标识号、文件类型、文件存取许可权、文件存取时间、文件链接数目、文件数据的磁盘地址明细表、文件大小。
  • 改变文件内容就意味着改变索引节点内容,但改变索引节点内容并不意味着文件内容的改变。
  • 内存索引节点还包括:状态、逻辑设备号、索引节点号、指向其他内存索引节点的指针、引用数。

4.1.2 对索引节点的存取

  • 算法iget分配一个索引节点的内存拷贝,与在高速缓存找到一个磁盘块的getblk算法几乎完全相同。内核把设备号和索引节点号映射到一个散列队列上,并搜索该队列。如果找不到就从空闲表中分配一个索引节点。
  • 索引节点存储在磁盘上,因此需要把索引节点号转换成第几个磁盘块上的多少字节偏移量(一个磁盘块上存储多个索引节点)。
  • 算法iget用于当进程初次存取一个文件时所引用的系统调用的开始阶段。

4.1.3 释放索引节点

  • 算法iput。

4.2 正规文件的结构

  • 索引节点中的地址明细表实际上是一张包含着属于该文件系统的那些数据的磁盘块块号的清单。
  • 索引节点中的地址明细表使用直接块、间接块、n次间接块来存储磁盘块号清单。
  • 算法bmap把文件的字节偏移量转换成一个物理磁盘块。
  • 索引节点结构的发展:
    • 增大磁盘块。但会使磁盘空间浪费,通过把文件的最后不足一个磁盘块的数据放到磁盘块分段里(即一个磁盘块存储多个文件的尾部数据?)。
    • 把文件数据存储到索引节点中。使一个索引节点占据一个磁盘块,多余的部分存储整个文件数据或文件尾部数据,有利于小文件的存储。

4.3 目录

  • 目录在文件名到索引节点的转换中扮演重要角色。
  • 目录是文件,它的数据是一系列目录表项,每个目录表项由一个索引节点号和一个包含在这个目录中的文件名(或者目录)组成。
  • 一个目录项长度为16字节。目录文件中的数据就是一个又一个16字节的目录表项。
  • 目录表项中的索引节点号为0,表示不存在。

4.4 路径名到索引节点的转换

  • 在当前目录里搜索文件/子目录时使用线性搜索,因为目录长度的限制而不失效率。

4.5 超级块

  • 超级块的结构:
    • 文件系统的规模。
    • 空闲块的数目。
    • 可用的空闲块表。
    • 空闲块表中下一个空闲块的下标。
    • 索引节点表的大小。
    • 索引节点数目。
    • 空闲索引节点表。
    • 空闲索引节点表中下一个空闲索引节点的下标。
    • 空闲表块的锁字段和空闲索引节点表的锁字段。
    • 用来指明超级块已被修改的标志。

4.6 为新文件分配索引节点

  • 文件系统包含一个索引节点线性表,每次寻找空闲索引节点都要线性搜索。为提高性能,文件系统超级块包含一个数组(空闲索引节点表),缓存着空闲的索引节点。
  • 超级块每分配一个空闲索引节点,就把数组下标后移,当移至数组末尾,就从索引节点线性表里上次搜索结束的地方(“铭记”的索引节点)继续寻找空闲索引节点。

4.7 磁盘块的分配

  • 超级块中的空闲块表缓存空闲的磁盘块,表中每个元素存储一个空闲磁盘块号,但是最后一个元素充当一个指针,指向下一个空闲块表。所以所有的空闲块表以链表的形式链接起来。
  • 当超级块中的空闲块表中空闲块的数目为1时,即只有一个指针时,把该指针指向的空闲块表复制到超级块的空闲块表里,并把这个空闲块表占据的磁盘块分配出去。如果不算超级块的空闲块表,相当于删除了链表的头节点。当超级块的空闲块表满时,相当于插入了头节点。

4.8 其他文件类型

  • 管道文件:先进先出(FIFO),数据是暂时的,使用直接块存储。
  • 特殊文件:块设备特殊文件和字符设备特殊文件。此类文件索引节点不引用任何数据,而含有主次设备号。
0 0
原创粉丝点击