UNIX文件系统相关笔记

最近阅读了UNIX发明者D. M. Ritchie和K. Thompson的UNIX相关论文。这些文章没有废话的介绍了UNIX的进程、程序、I/O系统以及文件系统。最后写到文件系统的时候我觉得非常有意思,因为非常好的解释了“UNIX中文件是什么东西”以及“UNIX是如何做到‘万物皆是文件’这件事的”,让平时零散积累的相关知识一下融会贯通。
所以写下本文来记录自己的想法。当然由于这些文章太过久远,其中一些功能和特性已经在现代的类UNIX系统中不太一样了。

首先需要理解的是,文件是什么,并且它们有什么特性:

  • 在UNIX系统中,文件是一个一维的数据数组,不包含任何其他的文件结构或者格式。 这在类UNIX的Linux中也可以发现:当写一个脚本或者vim创建文本文件的时候,后缀名很多时候只是为了方便区分,而不会让文件本身产生改变。例如将test.txt的后缀删除,照样可以使用less查看文本内容。
  • 一个文件可以存在于目录的任何层级中,甚至是多个层级中(就是硬链接 ,没有软链接。因为软链接是一个单独的文件)。
  • **目录也是一种文件,只不过这个文件用户是不能写入的。这让目录层级非常容易添加。**一个目录文件包含16字节大小的条目,其中14字节是名称,2字节是i-number。

然后就是UNIX文件系统的结构是什么?
UNIX文件系统是一个完全通过块I/O系统(block I/O system)访问的硬盘数据结构。
在装载系统之前,硬盘可以简单地被看作被分割成多个可随机分配地址的块(block)尺寸为512字节的数组(现在Linux等类UNIX系统的块尺寸为4096字节)。装载系统之后,文件系统将硬盘分成四个部分:

  • 第一部分用在启动过程中,文件系统并不会使用它。
  • 第二部分是所谓的“超级块”所在地,包含了硬盘大小和其他部分的边界地址,以及一些其他信息。
  • 第三部分就是i-list所在的位置,这是一个文件定义(file definitions)的列表。每个文件定义是一个64字节大小的结构,被称为i-node(这就是stat查看文件的时候,很常见的inode了)。一个i-node包含13个硬盘地址,最开始的十个地址直接指明了文件最开始的十个块。如果文件大于10个块(也就是5120字节),第十一个字节地址将指出一个块包含该文件接下来128个块的地址,也就是70656字节。如果文件还是大,那么第十二个地址会指出128个块的地址,这128个块每个再指向128个块,这时候文件最大为8459264字节。如果这时候还是不够,那么就会三重间接指定地址,也就是第十三个地址指向128个块,每个块再指向128个块,然后每个块再指向128个块,也就是1082201087字节。列表中,一个i-node的偏移量被称为i-number。UNIX文件系统中,i-number跟设备名称(主要和次要数字)的混合作为独一无二的名字来指代一个文件。也就是说这个部分存放的是文件目录
  • 第四部分是空余的,被用于存储的地方,用于存放可访问的文件内容,也就是文件本身。这些在硬盘上空余的地方被一个由可访问硬盘块组成的链表控制。这个链中每个块包含下个块的硬盘地址,还有五十个空闲硬盘块的地址(现在可能不是50个了)。当一个I/O操作的时候,系统会获得五十个空余块的地址和一个指针来发现更多空闲的块。由于这些块是分散的,随着使用延迟会逐步递增(因为块越多,需要指针不断导向,如果导向次数多了就延迟高了),有些设备甚至通过偶尔压缩硬盘空间来减少延迟(这只针对机械硬盘,现在固态硬盘没有这个问题了)。

这些都让UNIX文件系统容易创建、容易移除、容易随机访问(因为是链表,在设备上不按顺序摆放,机械硬盘随机访问可能会更快)和非常容易进行空间分配。但是也有缺点,由于大多数物理地址被限制在硬盘上一小块相邻的区域,也易于转储、再存储和检查文件系统连续性,但是由于文件系统使用链表,而间接地址对大型文件不是很好。好在可以使用缓存(cache)来很好地避免暗含的物理I/O,并且不添加额外的操作(也就是牺牲一定的空间来换取对大文件操作的不变,这些空间用于存放i-node、间接指向的块、最后块断裂。大部分系统会将这些单独填充到后续空白的部分)。

说完“文件是什么”和“文件系统是什么以及是何构造之后”,就是“UNIX如何将一切看作文件”这个问题了。
其实这个非常好理解,文件系统向文件写入内容来代表复杂的I/O系统操作。例如键盘输入,就是在读取键盘接口文件的内容,从而获取键盘输入的内容。

希望可以帮助到有需要的人哦~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值