文件管理(一)—— 初识文件管理

前言

操作系统作为系统资源的管理者,文件也是一种系统资源。文件本质上就是一组有意义的信息/数据的集合。 我们日常接触的照片、Word 文档、PPT、PDF 等都是文件,不同类型的文件呈现出不同的特性,而这些特性都需要操作系统来关心与处理。

文件管理需要解决以下五个核心问题:

  1. 文件有哪些属性:文件本身具备哪些描述信息
  2. 文件内部如何组织:文件内部数据的组织形式(逻辑结构)
  3. 文件之间如何组织:多个文件怎么有序地存放在一起(目录)
  4. 操作系统向上层提供哪些接口:应用程序和用户如何操作文件(系统调用)
  5. 文件如何存放在外存:文件数据在磁盘上的物理存放方式(物理结构)

1. 文件的属性

每个文件都拥有若干属性:文件名 是用户最直接感知的属性,同一目录下不允许重名;标识符 是操作系统内部用于唯一区分文件的编号,用户不可见;文件类型 (如 .txt、.mp4)决定默认打开程序;文件位置 包括用户可见的存放路径和操作系统内部记录的外存物理地址;此外还有文件大小、创建/修改时间、所有者,以及控制不同用户读写权限的保护信息。

2. 文件内部的数据组织(逻辑结构)

文件按内部结构分为两类:无结构文件 (流式文件)由二进制或字符流组成,无明显结构,如 .txt;有结构文件(记录式文件)由一条条记录组成,每条记录包含若干数据项(如学号、姓名),Excel 表格和数据库表是典型代表,其记录的具体组织方式属于文件逻辑结构的范畴,后续章节详述。

3. 文件之间的组织(目录)

我们平时使用的文件系统呈现出树状结构:

yaml 复制代码
根目录 /
├── 文档/
│   ├── 工作/
│   │   └── report.docx
│   └── 学习/
│       └── notes.txt
├── 照片/
│   ├── 2024/
│   └── 2025/
└── 视频/
  • 用户可以自由创建多层目录(即文件夹),将文件有序组织。
  • 目录本身也是一种特殊的有结构文件,由一系列记录组成。

4. 操作系统向上层提供的文件操作接口

操作系统通过系统调用为上层应用程序和用户提供以下基本文件操作:

系统调用 功能 说明
create 创建文件 新建一个空文件
open 打开文件 使用文件前必须先打开
read 读文件 将文件数据从外存读入内存
write 写文件 将内存中的数据写回外存
close 关闭文件 文件使用结束后必须关闭
delete 删除文件 将文件数据从外存中抹除

注意 :在读/写文件之前,必须先调用 open;使用结束后,必须调用 close。

复杂操作可由基本操作组合实现,例如"复制文件":

  1. create 创建新的空文件
  2. read 将源文件内容读入内存
  3. write 将内存数据写入新文件

5. 文件在外存上的存放(物理结构)

外存的基本结构

  • 外存(磁盘)与内存类似,被划分为一个个大小相等的磁盘块(物理块)。
  • 每个磁盘块通常包含 (2^n) 个地址单元,例如 (2^{10} = 1024) 字节 = 1 KB。

地址转换

操作系统需要将文件的逻辑地址 转换为外存的物理地址:

复制代码
逻辑地址  = 逻辑块号  + 块内地址
物理地址  = 物理块号  + 块内地址
  • 块内地址位数取决于磁盘块大小(1 KB 块需要 10 位表示块内地址)。

分配单位

  • 操作系统以块为单位为文件分配存储空间。
  • 即使文件只有 10 字节,也会占用整个磁盘块(1 KB)。
  • 读写文件时,也以块为单位进行数据交换。

6. 其他重要功能

除上述内容外,操作系统还需实现:

  • 文件共享:多个用户可以共享使用同一个文件。
  • 文件保护:不同用户对文件拥有不同的操作权限(读/写/无权访问)。
相关推荐
时间的拾荒人2 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
爱敲代码的小黄13 小时前
神经网络入门指南:从 CNN、RNN 到 Attention
人工智能·面试·程序员
李剑一1 天前
早在八十年代我们就有国产操作系统,但为什么最后还是Windows一统天下,答案藏在时间里
操作系统
Java成神之路-1 天前
虚拟内存核心精讲:页表、VMA、缺页异常与mmap(单级页表 + 多级页表对照)
操作系统
brave10251 天前
LLMGuide 大模型面试指南
人工智能·ai·面试·ai编程
Rain的Java大神之路1 天前
面试官最烦的答案:“我用 Redis + Token”!接口幂等 8 种方案 + 四层防御,把重复扣款工单干到 0
java·后端·面试
Moment1 天前
Harness Engineering 为什么是 AI Coding 的工程底座 ❓❓❓
前端·后端·面试
利威尔xu1 天前
2026-11-08-Go-defer-panic-recover面试
面试·golang
CoderYanger1 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wo_jack2 天前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector