看了一些关于操作系统,以及linux方面的文章,都要讲到文件系统,老师上课的时候我老是懵懂,现在决定整体性的概括一下,可能有些地方很片面,或者有问题,欢迎指出来
文件系统的类型
Windows 95用的是FAT16
Windows 98在FAT16上进行了拓展,成为了FAT32
较新版本的操作系统拥有了更先进的本地文件系统NTFS
Windows 8配置了ReFs(弹性文件系统)
我的U盘是FAT32
电脑磁盘是NTFS
文件的类型
操作系统支持多种文件类型
UNIX和Windows中都有普通文件和目录
UNIX还有字符特殊文件和块特殊文件
1.普通文件
普通文件是包含有用户信息的文件一般分为ASCII文件和二进制文件,简单来说ASCII文件就是我们平时看见的可以显示和打印出来的,也是你认识的,二进制文件就是0和1组成的,没办法认识的。一个可执行的二进制文件如下
2.目录
在很多系统中目录本身也是文件,学这方面的知识的时候,老师就经常讲万物皆文件
在了解目录之前先了解两个概念
**绝对路径:**从根目录到文件的路径组成,绝对就是唯一(先这样记着,我脑子老是不想事儿的搞不清)
**相对路径:**经常和当前目录一起使用,不从根目录开始
目录系统分为一级目录系统和层次目录系统,直接看图吧,很容易理解的
目录的操作就不讲了,因为每种操作系统的都不同,我是学linux的后面再写总结一下linux中的文件操作吧
文件系统的实现
文件系统布局
文件系统是存放在磁盘上的,所以文件系统是如何实现的,首先要先了解磁盘
磁盘的组成:
- 圆形的磁盘盘(主要记录数据的部分)
- 机械手臂、与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据)
- 主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据
多数磁盘划分为一个或者多个区,每个分区中都有一个独立的文件系统(读到这里会不会有疑问,可不可以每个分区的文件系统不同,这个请看后面)
磁盘的第一个扇区也就是0号扇区记录了磁盘的重要信息,0号扇区叫做主引导区(Master Boot Record,MBR),作用是用来引导计算机,可以安装开机管理程序。在MBR的结尾是分区表也叫分割表(partition),在分割表所在的64bytes容量中,总共分为4组记录区,每个记录区记录了该区段的起始和结束磁柱号码。
磁盘分区的布局是随着文件系统的不同而变化的,文件系统经常含有如下:【图片来自现代操作系统第四版】
上面只说文件系统的一种可能布局,在linux鸟哥私房菜中有着一些的不同,这是EXT2文件系统,这种文件系统在格式化的时候区分号区块群组(block group)
- Data block(资料块区):用来存放档案内容的地方
- inode table (inode 表格)
- Superblock (超级区块)
- Filesystem Description (文件系统描述说明):描述每个 block group 的开始、结束的block 号码
- block bitmap (区块对照表):记录空的block
- inode bitmap (inode 对照表):记录空的inode
文件的实现
不同操作系统采用不同的方法
-
连续分配
把每个文件作为一连串连续数据块存储在磁盘上
优点: 1.实现简单,记录每个文件用到的磁盘块只需要记住第一块磁盘地址以及文件块数
2.读操作性能好,在单个操作中可以从磁盘上读出整个文件,数据以磁盘全带宽的速率输入。
缺点: 当文件被删除之后会有空闲块,会有碎片问题
CD-ROM,DVD等一次性写光学介质,是采用连续分配 -
链表分配
存储文件的第二种方法是为每个文件构造磁盘块链表
优点: 可以充分利用每个磁盘块,不会因为磁盘碎片浪费存储空间
缺点: 顺序读文件十分方便,但是随机访问相当缓慢,这和数据结构中的链表一样
指针占去了一些字节,让磁盘存储的字节数不再是2的证书次幂,降低了系统的运行效率 -
采用内存中的表进行链表分配
取出每个磁盘块的指针字,存放在一个内存表中,就可以解决上述链表的两个不足,这个表称为文件分配表(File Allocation Table ,FAT) -
i节点:
i节点(index-node),列出了文件属性和文件块的磁盘地址,相比于上一种方法来说优势有只有在文件打开时,其i节点才在内存中。如果每个i节点占有n个字节,最多k个文件同时打开,,当文件所含磁盘块的数目超出了i节点所能容纳的数目,解决办法是最后一个磁盘地址不指向数据,而是指向额外磁盘块地址的磁盘块
目录的实现
要找到文件,就要根据路径名去找,路径就涉及到目录以及在何处去存放文件的属性。实现方式有两种:1.简单目录,即在目录文件中有一个固定大小的目录项列表,每个文件对应一项,,其中有(固定长度)的文件名、属性的结构体、磁盘块的位置的一个或多个地址。 2.对于采用了i节点的系统,可以把属性存放在i节点中,而不是目录项中,这样,目录项中就只需要存放文件名和i节点号了,这种方式更好。两种方式的目录项示例图如下:
还没写完呢。。。。。