Minix文件系统和Linux文件系统比较

来源:互联网 发布:mysql联合主键的作用 编辑:程序博客网 时间:2024/06/06 14:12
 

 

Minix是荷兰Vrjie大学的Andrew S. Tanenbaum教授编写的一个类Unix操作系统,虽然在功能和规模上不能和Unix相比,但作为操作系统的学习对象是非常合适的。Minix一共约一万两千行代码,在Tanenbaum教授所著的“Operating Systems: Design and Implementation”一书中有具体的注释和讲解。

Minix虽然是Unix的精简,但其组件齐全,文件系统、进程调度、内存管理等部分的数据结构、算法和设计思想也比较成熟,本文将针对Minix的文件系统进行详细描述和讲解,同时结合Linux中常中的EXT3文件系统进行横向的比较。

文件系统是操作系统对磁盘等存储设备进行管理的程序,它对文件在存储设备上的组织方式、数据表示和主要操作进行管理和实现。具体地说,它负责为用户新建文件,保存、读、写、权限控制和撤销等。

Minix文件系统

Minix文件系统本质上是一个运行于Minix用户态的C程序。用户程序通过给文件系统发送消息来进行文件的读写,文件系统完成之后回复消息。Minix文件系统可以说是一个网络文件服务器程序,只是这个程序和调用者运行在同一台机器上而已。Minix文件系统在设计时考虑了一下几个方面,首先,Minix文件系统是可以在独立于Minix文件系统之外进行修改、测试和试验的。其次,Minix文件系统可以很容易的在任意带有C编译器的机器上编译、运行。唯一需要注意的是不同操作系统之间消息的传递机制可能是不同的。下面将对Minix文件系统的几个关键域进行概述。这些关键域包括消息、文件系统的布局、位图、inode、块高速缓存、目录、文件描述符、文件锁以及设备文件等。

消息

消息是由用户进程发送给文件系统,指明了文件系统要完成的操作和操作对象。在Minix中大部分用于系统调用。主要消息如

文件系统在处理消息时是通过不断循环来应带消息的。当获取到一个消息后,文件系统以消息的类型作为索引查找一张函数表,找出处理该消息的函数。对应的函数返回操作结果。文件系统将结果返回给消息的发送者。

 

文件系统的布局

Minix文件系统是一个逻辑上独立的实体,它包括i-nodes、目录和数据块,可以被存储在任何块设备上。不管在什么设备上,Minix文件系统都有相同的布局。图表明了具有64i-node1KB块。在这个简单的例子中 ,位图区域是一个1KB的块,一个位图区域的byte可以管理81KB的块,所以1KB的位图区段可以表示8K个块,一共是8MB

 

 

上面的例子只是一个示意图,简单地展示了文件系统的布局。在现在计算机中,64i-node即使在容量较小的软盘中也是不够的,更不用现在已经可以做到单盘TB级的硬盘和其它设备。在容量较大的存储设备中,i-node和位图区域要远远超过一块。

文件系统都会有一个引导块(bootblock),Minix文件系统也不例外。引导块中包含可执行的代码,大小是1KB,也就是1024个字节。引导块的作用是在计算机启动时进行操作系统的加载工作。这样的描述并不是代表每个文件系统上都必须要一个操作系统,但是为了保持统一,每个块设备预留了引导块的位置(有些系统引导块的大小不止1KB)。为了防止计算机从没有操作系统的文件系统中引导,文件系统会把一个Magic number写入引导块的位置。有BIOS来检查改引导块的数据是不是真正有效的指向了一个操作系统。引导块的可以在图中找到。

文件系统的布局中与引导块相邻的是超级块(Superblock)。超级块里面固定大小为1KB的数据描述了文件系统的布局。超级块具体指明了文件系统各个部分的大小。如图

 

如果我们知道块的大小和i-node数目,就可以很容易的得到位图区段的大小和存放i-node所需要的块数目。在位图区段的这个概念中,区段由2n个磁盘块组成。对Minix所用的标准盘,区段的大小和块实际是一样的。虽然在某些系统中会有变化,但我们下面的讨论中默认区段和块的大小是一致的。区段位图表示i-node节点的状态,但是这里并不包括它本身所在当前区段。这样我们一块新格式化的分区中查看它的i-node使用情况会发现,已经存在了两个i-node,一个用于不存在的0i-node节点,一个用于该分区的根目录。

Minix启动时,根设备也就是启动设备中的超级块会被读入内存,每当一个文件系统被挂载时,它的超级块都会被读入内存。

位图

Minix使用了两个位图来管理空闲的i-node和区段。当一个文件被删除时,很容易计算出改文件i-node所在的位图块,并利用cache来查找该块,找到后改变该文件所对应的i-node位图所在的位。区段位图的操作类似。

一般来说我们可能错误的从常理认为创建一个文件时,文件系统必须逐一地检查每一个位图位,以便可以找到一个空闲的i-node,然后把它用于新建的问题。但是在实际的工作过程中,在内存的超级块表中会有一个域指向了第一个可用的i-node,所以我们可以直接使用。那么这个特殊域是如何做到指向第一个空闲i-node的呢?当一个i-node被释放时,要检查这个被释放的i-node是不是在当前第一个空闲i-node之前,如果是,则指向刚释放的i-node。当整个分区上的i-node都被占用了时候,空闲i-node地址域将被指向第0i-node。这样的机制同样使用于区段。

i-node

Minix3i-node的布局和Unix中几乎一样。在Minix3中,i-node占用64byte。磁盘区段指针是32位,7个直接指针,2个简介指针。在i-node中还预留了一段未使用的空间用于未来的第十个指针。Minix3i-node访问时间、修改时间都和标准的UNIX一样,除了读操作外,其余的文件操作都会导致i-node的修改时间变化。

当一个文件被打开时,它的i-node将被找到同时装入到内存中的i-node表中,并且一直保留到该文件被关闭。在内存中的i-node表中有一些字段是磁盘中的i-node没有的。比如该i-node所在的设备。每个i-node还有一个计数器,如果同一个文件被多次打开,那么在内存中只保存一个i-node的副本。当计数器减到0时,该i-node将从内存中删除,如果在内存中曾被修改过,还要把它写入磁盘。

i-node的主要作用是给出文件数据块所在的位置。前7个区段号直接存在i-node中。在Minix发行版中,区段和块的大小都为1KB,所以小于7KB的文件可以不必使用间接块号。当文件的大小超过7KB时,需要使用间接区段。具体方案如图

i-node中,Minix只用到了其中的一级间接块和二级间接块。如果块的大小和区段的大小都是1KB,区段号位32位,则一级间接块含有256项,可以表示256KB的存储区。二级间接块指向256个一级间接块,因此可以访问长达256256KB长度的文件。如果块的大小为4KB,那么二级间接块将指向1024*1024个块,文件最大长度位4GB

i-node中含有模式信息,给出了文件的类型和保护标志位、SETUID位、SETGID位,类型包括普通文件、目录、快设备文件、字符设备或者管道。i-node中的link字段记录了多少个目录项正在指向这个i-node

块高速缓存

Minix使用块高速缓存来改进文件系统的性能。高速缓存使用一个固定长度的缓冲区数组来实现,每个缓冲区由头和体两个部分组成。头里面包含有指针和计数器、标志位。体则包含了一个磁盘块大小的空间。所有未使用的缓冲区被连接在一条双向链表中,按最近一次使用时间的先后顺序排列,如图。

       为了快速判断某个块是否在缓存中,Minix使用了哈希表。

       目录和路径

       目录和路径名管理是文件系统的一个重要功能。Minix文件系统的系统调用一部分是以文件名作为数据的标示的。在实际操作中实际需要的是目的文件的i-node。文件系统需要在目录树中查找文件并找到对应的i-node

       Minix目录在本质上是一个文件。Minix文件系统在经过改进后,允许目录项有64个字节,其中4个字节存放i-node号码。60个字节存放文件名。这种情况下,一个文件系统支持的文件个数是40亿个。在Minix系统中不允许出现名字超过60个字符的目录。

文件描述符

       readwrite系统调用中会用到文件描述符,这个文件描述符是在文件被打开时返回的。文件系统首先是一个程序,它有自己的地址空间,并在其中维护进程表的部分内容。在地址空间中有一个字段是一个数组,以文件的描述符编号作为索引。当给定一个文件描述符时,可以通过改数组找到相应的文件。在Minix中,每个文件都有一个32位的整数来描述即将读写的下一个字节的位置,这个整数成为文件位置,它是通过lseek系统调用来修改的。在Minix中存在一个共享表filp,包含了所有被打开的文件的文件位置。同时文件的i-node也在其中。进程表中的文件描述符数组只要包含指向filp表项的指针就可以了。

文件锁

       在文件系统管理中,有一部分内容需要使用专门的表结构,这就是文件锁。Minix3在这个部分支持POSIX标准,支持IPC中的建议性文件锁,允许文件的任何部分或多个部分被标记位锁定。锁操作不是强制的,而是进程过程中的一种自觉行为,在执行存在潜在冲突的操作前检查文件锁。在Minix3中,文件锁以来一种叫做file-lock的表来实现。

Linux文件系统

Linux雏形是Minix,兼容POSIX标准。Ext2Linux文件系统典型,它很好地继承了 Unix文件系统的主要特色,如普通文件的三级索引结构,目录文件的树型结构和把设备作为特别文件等。和Minix文件系统一样,Linux文件系统是一个逻辑上独立的实体,有i-node、目录和数据块等。

 

Linux文件系统的布局和Minix文件系统相似,也是有引导块、超级块、i-node问题组成。

Linux文件系统的引导块将在系统启动是被BIOS检查是否有操作系统在该分区中。超级块将在文件系统被挂载时进入内存。

Linux文件系统同样使用位图来表示i-node和磁盘中块的使用情况。当某i-node或数据块已被占用则代表该i-node的位图中的bit位被置为0Linux文件系统同样的存在指向第一个空闲i-node的指针。该指针将始终指向第一个空闲的i-node,这样的机制可以在Minix文件系统中找到。

Linux文件系统i-node信息包括对应文件的类型、所属用户和所属组。通时有一个计数器,记录有多少个目录指向这个i-node。如果该计数器为0,则文件系统释放对应文件的存储区域。

原创粉丝点击