写在前面:这是本系列的第二十二篇。

在存储器之上,操作系统(文件系统)实现了“目录树”结构的文件系统,使我们能以一种直观、自然、有序的方式管理操作系统里数以百万计的持久化对象。

我们已经知道,进程从 execve 后的初始状态开始,可以通过 mmap 改变自己的地址空间,通过 fork 创建新的进程,再通过 execve 执行新的程序——我们慢慢已经开始理解“操作系统上的应用生态”并没有魔法了。

本讲内容:操作系统还必须给应用程序提供访问操作系统对象的机制。这节课我们学习 UNIX 的“Everything is a file”带来的方便,以及操纵目录和文件系统的 API。

在这里插入图片描述

课前反思:Testkit 的修复?

关于前面的 Testkit,其实我还不太会用…
多个 .c 文件交织在一起,执行顺序不知道,快照机制也没听懂。
没关系,有机会一定要自己琢磨一下怎么用 Test(或者让豆包/Kimi 详细拆解教一下)。在系统编程中,测试框架是重中之重。

回顾:操作系统的对象

  • 进程:
    • 进程 = 状态机。
    • 进程管理 API: fork, execve, exit
  • 连续的内存段:
    • 我们可以把“连续的内存段”看作一个对象,它可以在进程间共享,也可以映射文件。
    • 内存管理 API: mmap, munmap, mprotect, msync

目录树与存储设备的抽象

存储设备的抽象

  • 磁盘 = 块 (字节) 序列:
    • 就像一本书,每一页纸存储了数据,支持随机访问(翻到某一页)。
  • 文件:虚拟的磁盘:
    • 比如 hello.c, a.out
    • 在文件里,我们看不到“一页纸”的概念。它被抽象成了一个字节序列(类似 vector<char>)。
    • 支持 read, write, lseek, ftruncate 等操作。
  • 新需求: 怎么管理系统中众多的文件?总不能每次都全局 find_file_by_name 吧?

管理虚拟磁盘:建一个图书馆!

  • 信息的局部性: 将虚拟磁盘(文件)组织成层次结构。

树状分层索引:利用信息的局部性

.
└── 学习资料
    ├── .
    ├── ..
    ├── .学习资料(隐藏)
    ├── 问题求解1
    ├── 问题求解2
    ├── 问题求解3
    ├── 问题求解4
    └── 操作系统
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐