📂 操作系统 - Operating System / Chapter IV 持久性 / Section 2 文件 / 2-1 文件系统

文件与目录

2026-06-07
#OS
  • 持久存储

    • 虚拟化中的一个重要部分是持久存储(persistent storage),即使用永久存储设备永久(至少很长一段时间)地存储信息
    • 永久存储设备包括传统硬盘驱动器(hard disk drive) 或现代的固态存储设备(solid-state storage device)
    • 持久存储的重点是提高性能可靠性
  • 文件与目录

    • 存储虚拟化中出现了两个关键的抽象:文件(file)目录(directory)
      • 文件

        • 文件就是一个线性字节数组,每个字节都可以存取
        • 每个文件都有一个用户可读名字,通常会包含后缀名(例如.txt、.png、.docx)
        • 每个文件都有一个低级名称(low-level name),也被称为inode号(inode number),用户通常不知道这个名字
        • 在大多数系统中,操作系统并不了解文件的结构(例如它是文本,还是图片),文件系统的责任仅仅是将这些数据永久存储在磁盘上,并当用户请求时在那个位置找到文件
      • 目录

        • 一个目录也有一个低级名字,即inode号。不过文件inode号的内容非常具体:它包含一个 {用户可读名字, 低级名字}对,可将用户可用名称与低级名称相互映射
        • 目录下的每个条目都会指向文件或其他目录(子目录、链接、快捷方式等)
        • 通过在目录下构建子目录(sub-directory),可以构建目录树(directory tree),也称目录层次结构(directory hierarchy),在该目录下存储文件和目录
        • 目录层次结构从根目录(rood directory) 开始
          • 在Unix/Linux系统中,根目录就是 /
          • 在windows系统中,根目录是C:/D:/ 等,不过一般写为C:\ 或 C://
      • 路径

        • 每个文件与目录都有自己的路径,分为绝对路径相对路径
          • 绝对路径是从根目录开始的路径,需要加根目录符号
          • 相对路径是从某个确定目录开始的路径,不用加起始目录
          • 通过分隔符(separator) 来分离各级目录
          • 例如: / └── project/ └── arona/ ├── ai_service.py └── backend/
            • 对于文件ai_service.py
              • 绝对路径就是/project/arona/ai_service.py
              • 相对于目录/project的相对路径就是arona/ai_service.py
            • 对于目录backend
              • 绝对路径是/project/arona/backend
              • 相对于目录/project的相对路径就是arona/backend
  • 文件系统接口

    • 创建、顺序读取与写入

      • open()
        • 操作系统提供了系统调用open(),调用open()时可以传入不同的标志来实现不同的功能
          • 传入O_CREATE标志,程序可以创建一个新文件
          • 传入O_RDONLY标志,程序可以以方式打开文件
          • 传入O_WRONLY标志,程序可以以只写方式打开文件
          • 传入O_RDWR标志,程序可以以可读可写方式打开文件
          • 传入O_TRUNC标志,程序可以删除该文件的内容
          • 多个标志可以通过按位或(|) 同时使用,但是O_RDONLY、O_WRONLY、O_RDWR互斥
        • open()会返回一个文件描述符(file descriptor),这是一个整数,是进程私有
        • 通过使用文件描述符访问文件,操作系统就会假定该进程有权限访问该文件。即文件描述符是一个权限(capability),是一个不透明的句柄
        • 文件描述符也可以作为指向文件类型对象的指针,从而让程序使用read()或write()方法来访问文件
      • cat
        • Linux系统提供了cat指令,从文件中读取内容并显示到终端上
    • 不按顺序的读取和写入

      • 通过lseek(),可以通过一个偏移量来读写文件的指定位置
    • 立即写入

      • 程序调用write()时,只是告诉操作系统“请在将来的某个时刻将这些数据存储起来”,而不是让操作系统立即存储数据
      • 通过fsync(),可以立即强制操作系统写入磁盘,这对数据库管理系统(DBMS)等软件非常重要
    • 文件重命名

      • 通过mv指令,可以实现文件的重命名
    • 删除文件

      • 通过rm指令,可以实现删除文件或者删除目录
      • 删库跑路:rm -rf /*
    • 创建目录

      • 使用mkdir
    • 删除目录

      • 使用rmdir