【OS笔记35】:文件系统的使用、实现与管理

文章目录

  • [6.2.3 文件的使用(主要操作)](#6.2.3 文件的使用(主要操作))
      • [1. 创建文件 (Create)](#1. 创建文件 (Create))
      • [2. 打开文件 (Open)](#2. 打开文件 (Open))
      • [3. 读文件 (Read)](#3. 读文件 (Read))
      • [4. 写文件 (Write)](#4. 写文件 (Write))
      • [5. 关闭文件 (Close)](#5. 关闭文件 (Close))
      • [6. 删除文件 (Delete/Unlink)](#6. 删除文件 (Delete/Unlink))
  • [6.4 文件系统的实现与管理](#6.4 文件系统的实现与管理)

6.2.3 文件的使用(主要操作)

核心概念 :对文件的操作通过操作系统提供的系统调用实现。在编程层面,这些操作表现为一组函数。

1. 创建文件 (Create)

  • 语法fd = creat(pathname, modes)
  • 参数说明
    • pathname:文件存储的路径名。
    • modes:文件的存取权限(如:只读、读写等)。
  • 返回值fd 是文件代号(File Descriptor,文件描述符),后续操作都通过这个 fd 进行。

2. 打开文件 (Open)

  • 语法fd = open(pathname, flags, modes)
  • 参数说明
    • pathname:欲打开的文件路径。
    • flags:打开文件后的操作模式(如:只读 O_RDONLY、只写 O_WRONLY、追加 O_APPEND 等)。
    • modes:文件创建时指定的存取权限。
  • 注意 :在读写文件之前,必须先执行 Open 操作,将文件控制块(FCB)调入内存。

3. 读文件 (Read)

  • 语法number = read(fd, buffer, count)
  • 参数说明
    • fd:文件代号(由 open 返回)。
    • buffer:读出的信息送往用户指定的内存区域首地址(缓冲区)。
    • count:本次请求读取的字节数。

4. 写文件 (Write)

  • 语法number = write(fd, buffer, count)
  • 参数说明
    • fd:文件代号。
    • buffer:保存欲写出信息的缓冲区首地址。
    • count:请求写出的字节数。

5. 关闭文件 (Close)

  • 语法close(fd)
  • 操作意义:撤销该文件在内存中的数据结构,释放系统资源。

6. 删除文件 (Delete/Unlink)

  • 语法unlink(pathname)
  • 参数说明pathname 为被删除文件的路径名。
  • 底层逻辑:在磁盘上找到对应的目录项,释放其占用的物理块。

6.4 文件系统的实现与管理

6.4.1 文件存储空间管理

在深入具体算法之前,需要明确主存(内存)管理文件存储(外存)管理的区别。

内存 、 外存 管理对比表

特性 主存储器 (内存 - 第5章) 辅助存储器 (外存 - 本章)
访问速度 访问快 访问慢
容量大小 容量有限 容量大
CPU访问 处理器可直接访问 处理器不可直接访问
管理名称 操作系统的存储管理 文件存储空间管理
核心任务 用户区、内存块的分配 空闲块的组织和管理

核心任务:对空闲块的管理

文件系统的一大职能是记录磁盘上哪些块是已经被占用的,哪些是空闲的。

常见的管理方法:

  1. 空闲文件表(连续分配常用)
  2. 空闲块链表
  3. 位示图法 (Bitmap)(重要,常见于计算题)
  4. 成组链接法(UNIX系统采用,结构较复杂)

关键概念说明

  1. FD (文件描述符) :文件描述符可以理解为一个"句柄"或"指针"。在 Linux 系统中,"一切皆文件",无论是硬盘上的文件、网卡,还是键盘输入,都通过 fd 进行 read/write 操作。
  2. Open 与 FCB:"打开文件"的操作实质是:系统根据路径名找到目录项,将文件的描述信息(FCB)从磁盘读入内存的打开文件表,并返回一个索引(fd)给用户进程。
相关推荐
RainCity1 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
小宇子2B2 天前
三、内核入口 el0_svc / entry_SYSCALL_64 的汇编做了什么——从异常向量到 C 函数
操作系统
小宇子2B3 天前
四、从 write(1, "hello", 5) 到 ksys_write() —— sys_call_table 怎么路由的
操作系统
小宇子2B3 天前
一、printf("hello") 怎么变成 write(1, "hello", 5) —— libc 的 stdout 缓冲机制
操作系统
小宇子2B8 天前
一个 pthread_mutex_lock() 到底锁了什么——从用户态 CAS 到内核调度
操作系统
LinXunFeng9 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
小宇子2B9 天前
多线程 malloc 为什么会变慢——glibc 的 arena 到 bins 全景
操作系统
闪闪发亮的小星星13 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq13 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
阿米亚波13 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm