> For the complete documentation index, see [llms.txt](https://lfool.gitbook.io/operating-system/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lfool.gitbook.io/operating-system/di-si-zhang-wen-jian-guan-li/4.-wen-jian-de-mu-lu-jie-gou.md).

# 4. 文件的目录结构

对于每一个目录，都会有一个目录表，其结构如下：

![](https://824295091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MEmUhsvIFBb8ar2-Um3%2F-MFVAdI22W-kIx3NudMs%2F-MFVCtEojt4e9c4qi3G7%2Fimage.png?alt=media\&token=d717ffbc-7293-4b61-8027-7f599d8c0d24)

目录本身就是一个有结构的文件，由一条条记录组成。每条记录对应一个在该目录文件下的文件

目录文件中的一条记录就是一个 **文件控制块（FCB）**，包含了**基本信息**（**文件名、物理地址**、逻辑结构、物理结构等），存取控制信息（是否可读 / 可写、禁止访问的用户名单等），使用信息（如文件的建立时间、修改时间等）

需要对目录进行的操作：

* 搜索
* 创建文件
* 删除文件
* 显示目录
* 修改目录

## 1. 目录结构

### 1.1 单级目录结构

早期操作系统不支持多级目录，整个系统只建立一张目录表，每个文件占一个目录项

单级目录实现了 按名存取，但是**不允许文件重名**

在创建一个文件时，需要先检查目录表中有没有重名文件，确定不重名后才能允许建立文件，并将新文件对应的目录项插入目录表中

### 1.2 两级目录结构

早期的多用户操作系统，采用两级目录结构。分为**主文件目录**（MFD）和**用户文件目录**（UFD）

![](https://824295091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MEmUhsvIFBb8ar2-Um3%2F-MFVIXF81SH7joDtGGOo%2F-MFVMIAGPDooPE1y19sw%2Fimage.png?alt=media\&token=d736c01c-5593-4a76-8eb3-5357bca0ea32)

主文件目录下是用户目录，每个用户一个目录，每个用户目录里存放文件。每个用户目录下不允许重名，不同用户目录下运行重名

**缺点：**&#x5BF9;于某一个用户来说，不能对自己的文件进行分类管理

### 1.3 多级目录结构（树形目录结构）

对于一个目录中，可以有目录和文件。不同目录下的文件可以重名

![](https://824295091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MEmUhsvIFBb8ar2-Um3%2F-MFVIXF81SH7joDtGGOo%2F-MFVNdmRqhGZBlHH6sCT%2Fimage.png?alt=media\&token=484873a5-4372-4302-b2ed-8fa5adf850ce)

**树形目录结构**可以很方便地对文件进行分类，层次结构清晰，也能够更有效地进行文件的管理和保护。但是**树形结构不便于实现文件的共享**

### 1.4 无环图目录结构

在树形目录结构的基础上，增加了一些指向同一节点的有向边，使整个目录成为一个**有向无环图**。可以更加方便的实现多个用户间的文件共享

![](https://824295091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MEmUhsvIFBb8ar2-Um3%2F-MFVIXF81SH7joDtGGOo%2F-MFVTai5Qv9Lbpx_LmVI%2Fimage.png?alt=media\&token=806793ee-0652-4f39-8dd7-bbcd30cfcf70)

**可以用不同的文件名指向同一个文件**，甚至可以指向同一个目录

需要为**每个共享结点设置一个共享计数器**，用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时，只是删除该用户的 FCB、并使**共享计数器减 1**，并不会直接删除共享结点。**只有共享计数器减为 0 时，才删除结点**

**注意：共享和复制是不同的**

## 2. 索引结点

在查找文件的时候，仅仅使用到了文件名这个信息，但是我们却是在整个目录表中去查找的，需要把真个目录表从磁盘中读取出来。有时目录表很大，需要多个盘块存放，这样在查找的时候，就需要启动磁盘很多次，开销增大

**优化思路：**&#x628A;除了文件名之外的文件描述信息都放到一个索引结点里，同时建立一张表，其中包含文件名，和指向索引结点的指针。查找时，只需要把这张表调出即可。由于这张表只有两个字段，很小，占用的盘块也相应减少，需要启动磁盘的次数减少，提高了检索速度

![](https://824295091-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MEmUhsvIFBb8ar2-Um3%2F-MFVIXF81SH7joDtGGOo%2F-MFVWXgdrspE-ZlTUupN%2Fimage.png?alt=media\&token=a5318c44-98b8-45db-b86f-b4a89aacc69f)
