Appearance
文件的基本概念
2026 大纲 四(一)1 文件的基本概念。
断电之后,数据还得在
内存管理那一章从头到尾都在解决一个问题:东西怎么放进内存。 但内存有个绕不开的性质——一断电就全没了,而且它再大也装不下所有数据。
所以必然还要有一层:把数据放在断电也不丢的地方。这就是外存,也就是这一章的起点。
可外存原始得很。它提供给软件的东西只有一个按编号排列的扇区数组—— 你能说的只有"把第 8213 号扇区读出来"。要在这层上直接写程序, 用户得自己记住数据在哪几号扇区、自己保证不覆盖别人的数据、 换一台机器还得全部重来。
于是需要一层抽象把这些全都挡住,这层抽象就是文件。 而整章的内容,就是把这层抽象一件件搭起来:
用户想按名字找东西,那就得有名字,还得有个地方把名字翻译成位置—— 这是文件概念、inode、目录。 数据本身得在盘上摆好,摆的方式直接决定了它能不能随机访问、能不能长大—— 这是逻辑结构与物理结构。 要分配空间就得知道哪儿还空着——这是空闲空间管理。 最后,一台机器上往往有好几个文件系统、好几块盘, 得把它们合成用户看到的那一棵树——这是虚拟文件系统与挂载。
这一节是起点,把"文件"这个抽象本身讲清楚。其中最要紧的一条是 属性并不都存在同一个地方——把它分成两处的那条判据, 会一路管到硬链接、改名、移动文件为什么不动 inode。
一、什么是文件
裸磁盘提供给软件的东西非常原始:一个按编号排列的扇区数组,你只能说"把第 8213 号扇区读出来"。直接在这层写程序会立刻遇到三个问题,而文件抽象的每一条性质都是被其中一个问题逼出来的:
| 裸磁盘的问题 | 逼出的性质 | 具体形态 |
|---|---|---|
| 用户记不住扇区号,程序换一台机器扇区号就变了 | 按名存取 | 文件必须有一个名字,由系统把名字翻译成位置 |
| 一份数据可能占很多不连续的扇区 | 成组管理 | 文件是一组信息的集合,而不是一个扇区 |
| 多个用户共用一块盘,互相踩踏 | 属性与保护 | 文件除了内容还要带元数据(所有者、权限……) |
"名字 → 位置"这一层翻译,正是目录和 inode 要做的事。操作系统通过文件系统(File System)实现这层抽象:对上提供创建、删除、读写等接口,对下把逻辑文件映射到物理存储位置。
二、文件的属性
每个文件都有一组元数据(metadata)描述它自己——像一本书的版权页,记录作者、出版日期、页数,但不含正文。关键是这些属性并不都存在同一个地方:
| 属性 | 说明 | 存放位置 | 为什么放这边 |
|---|---|---|---|
| 文件名 | 同一目录下唯一,是用户访问文件的标识 | 目录项 | 同一个文件可以有多个名字(硬链接),名字必须跟着目录走 |
| 标识符(inode 号) | 文件系统内部的唯一标识 | 目录项 | 它就是"名字 → 文件本体"这条映射的右半边 |
| 类型 | 普通文件 / 目录 / 设备文件等 | inode | 属于文件本体的性质,改名字不改类型 |
| 位置 | 文件在外存上的存储位置指针 | inode | 多个名字指向同一份数据,位置只能存一份 |
| 大小 | 文件当前长度(字节 / 块数) | inode | 同上,只能有一份且随写入变化 |
| 保护信息 | 所有者、访问权限(读/写/执行) | inode | 权限属于数据本身,不能靠换个名字绕过 |
| 时间戳 | 创建 / 最后修改 / 最后访问时间 | inode | 记录的是本体被动过没有 |
| 链接计数 | 有多少个目录项指向本文件 | inode | 只有本体知道自己被几个名字引用 |
三、文件的分类
四组分类互相正交,一个文件同时属于每一组中的某一类:
| 分类维度 | 它在回答什么问题 | 类别与示例 |
|---|---|---|
| 按用途 | 这个文件归谁用 | 系统文件(内核、驱动)/ 用户文件(文档、代码)/ 库文件(libc.so、.dll) |
| 按逻辑结构 | 文件内部有没有记录 | 无结构(流式,字节流,如 .txt)/ 有结构(记录式,每条记录有固定格式)——见文件的逻辑结构 |
| 按存取方式 | 用户能以什么顺序取到内容 | 顺序存取(磁带典型)/ 随机存取(直接存取,磁盘典型)/ 索引存取(通过索引表定位记录) |
| 按信息交换单位 | 一次 I/O 搬多少 | 字符设备关联文件 / 块设备关联文件 |
/usr/lib/libc.so 同时是库文件、无结构文件、随机存取文件、块设备关联文件——四个维度各取一个值,互不冲突。
四、文件有哪些操作
| 操作 | 一句话说明 | 大纲点名 |
|---|---|---|
create | 建立:查重名 → 分配 FCB/inode → 加目录项 → 分配外存空间 | ✅ |
delete | 删除:回收外存空间 → 删目录项 → 链接计数减 1 | ✅ |
open | 打开:把目录检索的结果缓存进内存的打开文件表,返回 fd | ✅ |
close | 关闭:打开计数减 1,减到 0 才回写并释放表项 | ✅ |
read | 读:从当前读指针位置取数据到内存缓冲区 | ✅ |
write | 写:把缓冲区数据写到当前写指针位置,可能触发新块分配 | ✅ |
seek | 重定位:只改读写指针,不碰磁盘 | 补充 |
truncate | 截断:只丢弃内容、保留文件本身与全部属性 | 补充 |
复杂操作由它们组合而成,例如「复制文件」= create 新文件 + 循环 read 源文件 + write 新文件 + 两次 close。每一步具体做了什么、为什么要分成两级打开文件表、读写和缓冲区什么关系,全部在文件的操作展开。
考点速记
- 文件是一组有意义信息的集合,以文件名为标识,由文件系统统一管理;用户按名存取,不必知道数据落在哪些盘块上。
- 三条性质各被一个问题逼出来:记不住扇区号 → 按名存取;数据占很多不连续扇区 → 成组管理;多用户共用一块盘 → 属性与保护。
- "文件是最小分配单元"与"磁盘块是分配单元"不矛盾,主语不同:用户能命名、能整体操作与授权的最小对象是文件;系统真正向磁盘划走空间的最小物理单位是磁盘块。1 字节的文件照样占满一整块,多出的是内部碎片。
- 属性放目录项还是 inode,判据只有一条:看这个属性是跟着名字变的还是跟着文件本体变的。跟着名字 → 目录项(文件名、inode 号);跟着本体 → inode(类型、位置、大小、权限、时间戳、链接计数)。
- 这条判据的两个直接推论:① inode 里不含文件名 → 一个 inode 能挂多个名字,这就是硬链接成立的全部原因;② 改名、移动文件不动 inode,只改目录项。
- 唯一性范围:文件名在同一目录内唯一;标识符(inode 号)在整个文件系统内唯一。
- 四种分类维度互相正交——按用途、按逻辑结构、按存取方式、按信息交换单位各回答一个不同问题,一个文件在四个维度上各取一个值,不是"文件有十几种类型"的一张长清单。
- 存取方式被物理结构卡着:隐式链接分配的文件无论逻辑上怎么声明都只能顺序存取——不把当前块读进来就不知道下一块在哪。
- 大纲点名的六个操作是
create、delete、open、close、read、write;另有seek(只改读写指针、不碰磁盘)与truncate(只丢内容、保留文件与全部属性)。
这一节在真题里被考过的形式:
文件的基本概念本身不单独成题,本页下方因此没有练习区。
但它在大纲里(四(一)1),不能跳过——它是整章几乎所有题的前置认知, 只是从不单独设问。具体来说,第四条那个"跟着名字还是跟着本体"的判据, 直接决定了下面这几类题会不会做:
- 问文件访问控制信息该存在哪(2009-30,在 inode 讲)——答案落在 FCB/inode 一侧,靠的就是"权限跟着本体走"。
- 问新建文件时文件系统做了什么、不做什么(2025-29,在 inode 讲)——错项是"在目录文件中写入 F 的访问权限信息",理由同样是权限不在目录项里。
- 判断硬链接的性质(2017-31、2009-31,在硬链接和软链接讲)——两个名字共享同一个 inode,这件事的全部依据就是第五条推论①。
- 问删除文件、改名、移动时改了什么(2013-23、2021-30,在目录与硬链接和软链接讲)——靠推论②。
复习优先级:读一遍建立框架即可,不必单独准备。 唯一需要牢记的是第四条那条判据 和它的两个推论——把"文件名和 inode 号在目录项、其余全在 inode"这句话记死, 本章后面四五道题的答案会自己浮出来。第三条(文件 vs 磁盘块)和第八条 (存取方式受物理结构限制)容易被设成错项,也要留意。
易错:认为文件的全部属性都存在同一个地方。文件名与 inode 号在目录项,其余在 inode。
易错:认为访问权限存在目录项里。权限跟着文件本体走,在 inode 里——否则换个名字就能绕过权限。
易错:认为 inode 里存着文件名。不存——正因为不存,一个 inode 才能挂多个名字(硬链接)。
易错:认为改名或移动文件会改动 inode。只改目录项,inode 一个字节不动。
易错:认为"文件是最小分配单元"和"磁盘块是分配单元"互相矛盾。主语不同:前者对用户,后者对系统。
易错:认为逻辑上声明成随机存取就一定能随机存取。隐式链接分配的文件只能顺序存取。
教材出处
- 汤小丹《计算机操作系统》:文件控制块含基本信息、存取控制信息、使用信息三类,"文件与文件控制块一一对应,文件控制块的有序集合称为文件目录,一个文件控制块就是一个文件目录项",见印刷版 p233(7.3.1 文件控制块和索引结点)。
- 同书 p234 说明 Unix 把文件名与文件描述信息分开、目录项仅由文件名与 i 结点指针构成,是本篇"属性分两处存放"的依据。