文件系统管理(随笔)

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

文件系统构成

Linux 文件系统会为每个文件分配两个数据结构:索引节点和目录项,它们主要用来记录文件的元信息和目录层次结构。

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

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

目录项存放 inode 指针 => 指向硬盘中得inode节点

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

文件系统分类

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后,直接返回,内核收到数据就会自己拷贝到对应得用户空间
  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ThinkPHP 是一个优秀的PHP框架,可以帮助我们快速开发高质量的 Web 应用程序。因此,使用 ThinkPHP 来开发 OA 系统是非常方便和实用的。下面我们来讨论一下如何使用 ThinkPHP 来开发一个人力资源管理系统。 1. 创建数据库 首先,我们需要创建一个数据库来存储我们的数据。在该数据库中,我们需要创建一些表来存储员工信息、部门信息、职位信息、薪资信息等等。我们可以使用 MySQL 数据库来创建这些表。 2. 创建 ThinkPHP 项目 在创建完数据库之后,我们需要创建一个 ThinkPHP 项目来实现我们的 OA 系统。我们可以使用 ThinkPHP 官方提供的命令行工具来创建项目,具体命令如下: ``` composer create-project topthink/think oa ``` 执行完上述命令后,会在当前目录下创建一个名为 oa 的 ThinkPHP 项目。 3. 配置数据库 在项目创建好之后,我们需要配置数据库连接信息。在项目的 `.env` 文件中,我们可以配置数据库的相关信息,如下所示: ``` # 数据库类型 DB_CONNECTION=mysql # 数据库地址 DB_HOST=127.0.0.1 # 数据库端口 DB_PORT=3306 # 数据库名 DB_DATABASE=oa # 数据库用户名 DB_USERNAME=root # 数据库密码 DB_PASSWORD= ``` 我们需要根据自己的实际情况来修改这些配置项。 4. 创建控制器和模型 在 ThinkPHP 中,我们可以通过创建控制器和模型来实现 OA 系统的功能。我们可以使用命令行工具来快速创建控制器和模型,具体命令如下: ``` # 创建控制器 php think make:controller Index # 创建模型 php think make:model User ``` 执行完上述命令后,会在项目中生成一个名为 Index 的控制器和一个名为 User 的模型。 5. 实现功能 在创建好控制器和模型之后,我们就可以开始实现 OA 系统的功能了。比如,我们可以实现员工信息的添加、修改、删除、查询等操作,部门信息的添加、修改、删除、查询等操作,职位信息的添加、修改、删除、查询等操作,薪资信息的添加、修改、删除、查询等操作等等。我们可以在控制器中编写处理逻辑,在模型中编写数据库操作。最后,我们可以使用视图来展示数据。 6. 测试系统 在实现完功能之后,我们需要对系统进行测试。我们可以使用浏览器或者 Postman 等工具来测试系统的功能是否正常。如果有问题,我们可以根据错误提示来进行调试和修复。 总之,使用 ThinkPHP 来开发 OA 系统是非常方便和实用的。我们可以根据自己的实际情况来定制系统的功能和界面,从而更好地管理公司的人力资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值