1、索引结点(inode):文件目录通常存放在磁盘上,当文件很多时,文件目录会占用大量的盘块。在查找目录的过程中,要先将存放目录文件的第一个盘块中的目录调入内存,然后用给定的文件名逐一比较,若未找到指定文件,就还需要不断地将下一盘块中的目录项调入内存,逐一比较。我们发现,在检索目录的过程中,只用到了文件名,仅当找到一个目录项(其中的文件名与要查找的文件名匹配)时,才需从该目录项中读出该文件的物理地址。也就是说,在检索目录时,文件的其他描述信息不会用到,也不需要调入内存。因此,有的系统(如UNIX)便采用了文件名和文件描述信息分开的方法,使文件描述信息单独形成一个称为索引节点的数据结构,简称i节点(inode)。在文件目录中的每个目录项仅由文件名指向该文件所对应的i节点的指针构成。

2、文件逻辑结构中的索引文件:变长记录文件只能顺序查找,效率较低。为此,可以建立一张索引表,为主文件的每个记录在索引表中分别设置一个表项,包含指向变长记录的指针(即逻辑起始地址)和记录长度,索引表按关键字排序,因此其本身也是一个定长记录的顺序文件。这样就把对变长记录顺序文件的检索转变为对定长记录索引文件的随机检索,从而加快了记录的检索速度。除了索引文件以外还有索引顺序文件

3、文件物理结构中的索引分配:索引分配将每个文件所有的盘块号都集中放在一起构成索引块 (表)。每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。要读第i块,通过索引块的第i个条目的指针来查找和读入所需的块。索引分配的优点是支持直接访问,且没有外部碎片问题。缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题, 每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。还有多层索引、混合索引等。

4、open()系统调用返回的索引:当用户对一个文件实施操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,大多数操作系统要求,在文件使用之前通过系统调用open被显式地打开。操作系统维护一个包含所有打开文件信息的表(打开文件表)。所谓“打开”,是指调用open根据文件名搜索目录,将指明文件的属性(包括该文件在外存上的物理位置),从外存复制到内存打开文件表的一个表目中,并将该表目的编号(也称索引)返回给用户。当用户再次向系统发出文件操作请求时,可通过索引在打开文件表中查到文件信息,从而节省再次搜索目录的开销。当文件不再使用时,可利用系统调用close关闭它,操作系统将会从打开文件表中删除这一条目。在多个不同进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表。整个系统的打开文件表包含FCB的副本及其他信息。每个进程的打开文件表根据它打开的所有文件,包含指向系统表中适当条目的指针。一且有进程打开了一个文件,系统表就包含该文件的条目。当另一个进程执行调用open时,只不过是在其文件打开表中增加一个条目,并指向系统表的相应条目。通常,系统打开文件表为每个文件关联一个打开计数器(Open Count), 以记录多少进程打开了该文件。每个关闭操作close使count递减,当打开计数器为0时,表示该文件不再被使用,并且可从系统打开文件表中删除相应条目。文件名不必是打开文件表的一部分, 因为一旦完成对 FCB 在磁盘上的定位, 系统就不再使用文件名。对于访问打开文件表的索引,UNIX称之为文件描述符,而Windows称之为文件句柄。因此,只要文件未被关闭,所有文件操作就通过打开文件表来进行。