Linux文件系统

这里写图片描述

每个柱面组包含了i节点数组和目录块和文件块。
i节点包含了文件有关的所有信息:文件类型、文件访问权限位、文件长度和指向文件数据块的指针。
而每个目录块中包含了当前目录下每个文件的文件名和其i节点号。

这里写图片描述

现在看看系统如何读取文件。对于调用了read系统调用的库函数的一个典型使用是:
n=read(fd,buf,nbytes);
当内核得到控制权时,它需要从这三个参数以及内部表中与用户有关的信息开始。内部表的项目之一就是文件描述符表。文件描述符表用文件描述符作为索引并为每一个打开的文件保存一个表项。
这里的思想是从一个文件描述符开始,找到文件对应的i节点为止。
Linux的实现是在文件描述符表和i节点表之间引入一个新的表,叫打开文件描述符表,这个表中存放着文件状态标志、当前文件偏移量和指向i节点的指针。
为什么要这么设计呢?直接在文件描述符表中存放一个指向i节点的指针不行吗?
我们假设在文件描述符表中存放一个指向i节点的指针,尽管这样很简单,但是这个方法不能奏效。其中存在的问题是:与每个文件描述符相关联的是用来指明下一次读(写)从哪个字节开始的文件偏移量,它该放在什么地方?一个可能的方法是将它放在i节点表中,但是,当两个不相关进程打开同一个文件时,由于每个进程都有自己的文件偏移量,这个方法就失效了。
另一种可能的方法是将文件偏移量放到文件描述符表中,这样,每个打开文件的进程都有自己的文件偏移量,但是这种方法也是失效的,但是其原因更加微妙并且与Linux的文件共享的本质有关。
考虑一个shell脚本s,它由顺序执行的两个两个命令P1和P2组成,如果该shell执行以下命令
s>x
那么,我们预期P1将它的输出写到x中,然后P2也将输出写到x中,并且从P1结束的地方开始。
当shell生成P1时,x是空的,从而P1从文件开始位置0写入。然而,当P1结束时就必须通过通过某种机制使得P2看到的初始文件位置不是0(如果将文件位置存放在描述符表中,P2将看到0)。
通过在文件描述符表和i节点表之间引入一个新的打开文件描述符表,并将文件偏移量放到打开文件描述符表中,就可以解决这个问题。在这个例子中,父进程是shell,子进程是P1和P2。当shell生成P1时,P1的用户结构是shell的用户结构的一个副本,因此两者都指向相同的打开文件描述符表项。当P1结束时,shell的文件描述符仍然指向包含P1文件偏移量的打开文件描述符表。当shell生产P2时,新的子进程自动继承了文件偏移量,这样就能实现P2写入到P1后面了。

每个i节点包含了12个数据块的磁盘地址,当文件大小超过12个磁盘块所能容纳的大小时,便用到了一级间接块地址,这个一级间接块指向一个磁盘块,这个磁盘块中存放了指向其他磁盘块的地址。例如,如果一个磁盘块的大小时1KB,磁盘地址长度是4字节,那么一个磁盘块便能容纳256个磁盘地址,这套方案便能容纳12KB+256KB的文件。
此外,i节点还有一个二级间接块的地址和一个三级间接块的地址,二级间接块中包含一级间接块的地址,三级间接块中包含二级间接块的地址。对于块大小是1KB,磁盘地址长度是4字节的情况,整个寻址方案最多能支持12KB+256KB+256*256KB+256*256*256KB=16GB的文件。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值