(一)文件系统的内部表示
在unix中文件系统在磁盘上的分布是如下的:
========================================
==引导块--超级块--索引结点表----数据块==
========================================
其中超级块与索引结点表为重点。
一,索引结点表
索引结点(index node,简称inode)是文件系统的核心内容,也是内核最重要的数据结构。unix中一个文件只有一个inode与其相对应,它的储存在磁盘的索引结点表里。索引结点表是一个线性数组。索引结点的各个域的内容如下:
1,文件所有者的标识号。
2,文件类型。
3,文件的存取权限。
4,文件的存取时间。
5,文件的联结数。
6,文件在磁盘上的位置。
7,文件大小。
(注意:索引结点不表明该文件的路径)
当索引结点被某个进程引用是,它被调入内存中。在内存中存在另外一个索引结点表(in-core inode list)和一个空闲索引结点表。当索引结点被调入内存时(在内核中使用iget算法),将索引结点放入内存索引结点表里,并将其引用数加1。
内存索引结点里的数据域除了磁盘索引结点的内容以外,还有以下新的域:
1,内存索引结点的状态
2, 含有该文件的文件系统的逻辑设备号。
3,索引结点号。(索引结点在磁盘上数组里索引)
4,指向其他内存索引结点的指针。
5,引用数。
内核用文件系统和索引结点号来标识特定的索引结点,在高层的系统调用请求是使用iget算法来分配一个索引结点的内存拷贝,即内存索引结点。内核独立的操纵索引结点锁和引用数。在系统调用执行期间将起锁住,防止其他的进程在此期间使用此结点,调用结束后开锁。在两次系统调用之间结点是不上锁的。
而iget算法主要完成的任务:索引结点号为参数,如果索引结点位于内存索引结点表中则引用数加1,返回索引结点,如果位结点位于空闲索引结点表中(此表中索引结点的引用数为0),则从该表中取出该索引结点,放入在内存索引结点表中,并将其引用数加1,如果在两个表中都没有该索引结点,则在空闲表中移出一个新的索引结点,在磁盘索引结点表中寻找到该结点,读入内存索引结点表中,然后返回该索引结点。
当内核释放索引结点时,引用数减1。如果引用数降为0,而且文件的内存拷贝与磁盘拷贝不同,则执行写磁盘操作,并把索引结点放入空闲表里。这里用到的算法是iput。如果文件的联结数为0,则内核释放该文件的所有数据块,并释放该文件的磁盘索引结点。
二,正规的文件结构
索引结点包含着文件在磁盘上位置的明细表。磁盘的每个块都编了号。在unix系统V中,块的大小是1k,(在windows里为4k),索引结点里包含指向各个数据块的指针,其中有10个直接块,1个1次间接块,1个2次间接快,1个3次间接块,如果使用到3次间接的话,单个文件的大小可以最大为16G,存取文件时,内核调用bmap算法将逻辑文件的字节偏移量映射到文件系统的块上。
三,目录
目录是使文件系统具有树型结构的那些文件。目录是文件,它只是数据是一些目录表项的文件,每个目录表项有他们的索引结点号和此目录下的文件名构成,路径就是有/分割成的各个独立分量构成的。
目录的读权限为允许进程读目录,写权限为允许进程创建子目录或删除子目录,执行权限为允许进程寻找文件而搜索整个目录。
注意:读权限与执行权限的区别。
(未完)