文件的目录结构分类
一级目录结构
优点:简单
缺点:查找速度慢、不允许重名、不便于实现文件共享
二级目录结构
不同用户目录下的文件允许重名
树结构:根结点主目录、分支结点用户目录、子分支结点文件
多级目录结构
多级目录文件的访问
必须指出文件所在路径名:从根目录到该文件的路径上各级目录名的组合。也称为文件全名。例如:/usr/lib/man
相对路径:设置一个“当前目录”(也叫“工作目录”),此时对于文件的查找是从当前目录中进行的。可以带来两点好处
- 用户使用更加方便
- 检索效率更高
多级目录结构的优点
- 提高了检索目录的速度。
- 较好地解决了重名问题。
多级目录结构的缺点
不便于用户共享文件
文件目录的维护
打开文件机构
文件及其目录结构是存储在外存上的,当对文件读写时会有大量的I/O操作。为了提高系统工作效率,操作系统在内存设置了一个非常精炼的文件机构,它不是外存文件管理机构的全部映象,而是最近正在使用文件的相关信息。文件打开后由内存的一套管理机构管理,关闭时退出管理机构,所以将这种文件管理机构称为打开文件机构。
为了方便对文件的操作,文件一旦被打开,打开文件机构在内存中需要维护一些数据结构来存放已打开文件的有关信息,这包括:
内存文件控制块
每个文件在文件存储器上都有一个文件控制块,当需要查询、修改外存上某文件控制块时,按一般方式,可将其临时装入内存,处理完毕后再写回外存。为方便操作,UINX设置了内存I节点,称作内存文件控制块。
内存I节点结构与外存I节点结构基本相同,只是略微调整了一些内容,增加的主要有i_dev和i_number。
当打开某一个文件时,如果找不到其相应的内存I节点,就在内存I节点表中分配一个空闲表项,并将该文件的外存I节点中的主要部分复制进去,填入外存I节点号。当需要查询、修改文件的控制信息时,直接在内存I节点中进行。当关闭文件时,如果内存I节点被修改过,则更新外存I节点信息。
系统打开文件表
UNIX磁盘上的目录分成索引节点和目录文件,打开文件时在内存中建立也建立相应的活动索引节点表(或称内存索引节点表)和系统打开文件表,分别保存已打开文件的索引节点和文件名内容。
一个文件可以被同一进程或不同进程,用同一或不同路径名,以相同或不同的方式(读、写)同时打开。因此同一个文件的目录信息可能会占用多个系统打开文件表表项。
用户打开文件表
每一个进程都有一张打开文件表,在UNIX系统中,它是进程扩充控制块user中的一个指针数组int u_ofile[NOFILE]。进程打开文件时,按下标序由低到高顺序使用数组中的某一空闲项(即指针为NULL的表项),在该表项中填入系统打开文件控制块file结构变量的地址。
文件的打开过程及各结构之间的关系
一个进程执行如下代码:
fd1=open(“/etc/passwd”, o_RDONLY);
fd2=open(“pocal”, o_WRONLY);
fd3=open(“/etc/passwd”, o_RDWR);