您的当前位置:首页正文

文件系统管理(随笔)

2024-12-01 来源:个人技术集锦

该文根据小林coding的文件系统总结的笔记,如有不对,请多指正

文件系统构成

  • inode - 元信息 -
    保存在硬盘
  • 目录项 - 结构 - 保存在内存中 - 内核维护

文件读写按块读写 - 一块4KB = 8个扇区 - 512B

会先指向超级块,超级块中存放各个数据块的索引节点 - 索引节点会指向对应的数据块

文件系统分类

Linux的文件系统大致可以分为3类:

  • 磁盘文件系统: Ext
  • 内存文件系统: proc , sys
  • 网络文件系统: nfs

文件的使用

用户空间的write() -> 虚拟文件系统的sys_write() -> 文件系统的写方法 -> 磁盘

open -> 生成fd -> 加入到文件描述符表

fd: 绑定文件对应信息(包括文件在磁盘的位置,文件指针的位置,访问权限等等)

进行write/read 等操作时,用户操作的是字节,文件系统操作的数据块

文件的存储

文件存储与程序在内存中的存放相似(内存管理)

两种存储方式连续存储和非连续存储:

  • 连续存储 -> 存放效率高,但是如果文件被删除了,会产生很多碎片空间

  • 非连续存储有两种

    • 链表方式
      • 隐式
        实现: 文件头都包含第一块数据块和最后一块的位置,每个数据块都有指针指向下一个数据块
        缺点: 耗时, 文件指针损坏会导致文件数据丢失
      • 显式
        实现: 参照隐式,取出每个磁盘块的指针,把它放在内存的一个表中
        缺点: 不适用于大磁盘,占内存
    • 索引方式
      • 链式索引 + 数据块
        实现: 为每个文件创建一个索引数据块,存放指向文件数据块的指针列表(跟书的目录类似)

空闲空间管理

针对磁盘的空闲空间引入管理的机制:

  • 空闲表法
    为所有空闲空间创建一张表,表内包括空闲区的第一个块号和块数(空闲空间少比较合适,不然表会很大,查询效率也低)
  • 空闲链表法
    通过链表方式来管理空闲块(空闲空间多起来也很大,很耗时)
  • 位图法(Linux)
    用二进制的一位来表示盘块(4KB)的使用情况

文件系统的结构

块组: 一个块大小的位图所能表示大小为128MB(1B位图可以表示8x4KB)就是块组的大小

  • 超级块: 包含的是文件系统的重要信息。
  • 块组描述符: 包含文件系统中各个块组的状态。
  • 数据位图和 inode 位图: 用于表示对应的数据块或 inode 是空闲的,还是被使用中。
  • inode 列表: 包含了块组中所有的 inode。
  • 数据块: 包含文件的有用数据。

每个块组里有很多重复的信息,比如超级块和块组描述符表,每个块组都有,原因如下:

  • 存放副本,防止系统崩溃
  • 提高文件系统性能

目录的存储

软链接和硬链接

  • 软链接相当于重新创建一个文件,内容是另外一个文件的路径
    就算目标文件删除了,链接文件还会在,只是指向的文件找不到了。

文件 I/O

  • 缓冲与非缓冲 I/O
    • 缓冲 I/O,库函数调用(文件IO),有标准库缓存。
    • 非缓冲 I/O,系统调用(标准IO),无标准库缓存。
  • 直接与非直接 I/O
    • 直接 I/O,直接经过文件系统去访问磁盘。
    • 非直接 I/O,在操作时,数据会经过系统缓存,再拷贝给用户或者写入数据到磁盘。
  • 阻塞与非阻塞 I/O VS 同步与异步 I/O
    • 阻塞I/O: 当执行read,线程会被阻塞,一直等到内核数据准备好,并把数据拷贝过来,read才会返回
    • 非阻塞I/O: 当执行read(非阻塞),没有数据,直接返回,线程可以一直往下执行,不断轮询,直到内核数据准备好,把数据拷贝过来,read才有结果
    • 同步I/O: 在 read 调用时,内核将数据从内核空间拷贝到应用程序空间,过程都是需要等待的
    • 异步I/O: 在aio_read后,直接返回,内核收到数据就会自己拷贝到对应得用户空间
显示全文