第四章 文件的内部表示-Unix操作系统设计-读书笔记

本文详细介绍了Unix操作系统中文件的内部表示,包括索引节点、正规文件结构、目录、路径名转换、超级块以及文件分配和释放。讨论了索引节点的存取、释放过程,以及如何根据文件路径查找对应的索引节点。同时,文章提到了不同类型的文件和文件系统的优化策略,如三级索引结构、目录的特殊性质和磁盘块的分配算法。
摘要由CSDN通过智能技术生成

文章目录

第四章 文件的内部表示

UNIX系统中每个文件都有一个唯一的索引节点index_node,其中包含文件所有者、存取权限、文件长度、文件数据在文件系统中的位置等;

我们在使用文件的时候,使用文件路径来表示文件,核心将文件路径转换成文件的索引节点;

本章的算法的层次处在上一章所解释的高速缓冲算法之上;
iget:返回一个先前标识了的索引节点;
iput:释放索引节点;
其中iget和iput操作的内存中的索引节点;
bmap:做字节偏移量到磁盘块号之间的映射;
namei:做路径名与索引节点的映射;
alloc与free:分配与释放磁盘块;
ialloc ifree:为文件分配及释放索引节点;

索引节点

索引节点存在两份:磁盘上的和内存上的,之所有把其放置到内存上一份是为了做缓冲,提高效率,同时这里做的缓冲完全是使用的第三章的buffer设计;

索引节点以静态形式存在于磁盘上,核心把它们读进内存索引节点表中以操纵它们,由如下字段组成:

  • 文件所有者
  • 文件类型:正规类型、目录类型、字符设备类型、块设备类型、管道类型
  • 文件存取许可权:按照如下三个类型进行权限管理,文件所有者、文件的所有者所在用户组以及其他用户,能分别进行设置;rwx-rwx-rwx 所以你明白了777是什么意思了叭! 然后chmod +x是什么意思貌似页明白咯,x:execute;777也明白什么意思了叭!
  • 文件存取时间:文件最后一次修改的时间、最后一次存取的时间、最后一次修改索引节点的时间;
  • 文件联结数目:在本目录树中有多少文件名指向该文件,这个在下面的章节中介绍;
  • 文件数据的磁盘地址明细表;
  • 文件长度;

注意:这里索引节点的缓冲方式和块设备的缓冲方式类似,即都会包含一个空闲表、散列队列用来管理可用和不可用的缓冲节点;

内存中的索引节点拷贝除了磁盘索引节点所包含的那些字段以外,还包含:

  1. 内存索引节点的状态:是否上锁、是否有进程在等待其变为开锁状态、索引结点的内存版本是否与它的磁盘拷贝不同、文件的内存表示是否与它的磁盘拷贝不同;该文件是否为安装点;状态决定了:有关竞争的条件、索引节点和文件分别与磁盘的统一程度,由此可见,引入高速缓冲之后是增加了很多复杂度的;
  2. 含有该文件的文件系统的逻辑设备号;个人猜测,不同设备可能拥有不同的文件系统,比如SSD,比如HD,比如Floppy,而且是用户可选的,比如在格式化U盘的时候是有选择选项的;
  3. 索引节点号,即记录了对应的inode在数组中的下标号;因为磁盘中的索引节点的组织方式是数组结构的,开头包含一张表;
  4. 指向其他索引节点的指针;
  5. 引用计数;指示出该文件的活跃实例数目;

那么这个引用计数有什么用呢?

  • 只有当索引节点的引用计数为0时它才位于空闲表上,以表示核心能把这个内存索引节点表当作不活跃的索引节点的高速缓冲;
  • 反观块设备缓冲区呢?只要缓冲区为开锁状态,它就位于空闲表中了;因为使用完之后都会调用brelse函数,其会将缓冲区放置到空闲表中;
  • 难道不是只要索引节点的锁被解开,引用计数就为0了嘛?是这样的;

对索引节点的存取

获取的是内存中的索引节点,也就是说这部分算法直接交互的对象还是buffer,即缓冲区;
[外链图片转存失败(img-YRKw05sl-1567060305156)(en-resource://database/3308:1)]

核心用文件系统和索引节点号来标识特定的索引节点;iget算法和getblk算法如出一辙,核心将设备号和索引节点号映射到一个散列队列上,并且搜索该队列以便找到该索引节点,如果找不到,就从空闲表中分配一个索引节点,并且对它上锁;

然后就去磁盘中找对应的磁盘块号咯,块号=((索引节点号-1)/每块的索引节点数目)+索引结点表的起始块号;

知道了块号之后还需要使用缓冲区里的函数:bread,读出该块,然后计算该索引结点在该块中的字节偏移量:((索引节点号-1) mod (每块的索引节点数目))*磁盘索引节点大小;找到之后,拷贝到内存索引节点中,把它放到正确的散列队列中,并且将它的内存引用计数置为1;

当进程打开一个文件时,它就把索引节点引用计数增1,当引用结束的时候,比如当进程关闭一个文件时,就把索引节点啊引用计数间减1,当减到0的时候,意味着锁结束了;

算法iget,如果核心试图从空闲表中取出一个索引节点,但发现空闲表是空的,则报告一个错误;这与处理磁盘缓冲区是不同的,思考为什么不同?

  1. 首先文件的index_node是直接和用户相关的,即用户open一个文件,则会涉及到index_node,那么什么时候close呢?由用户决定,核心是无法预测的。
  2. 而反观磁盘缓冲区,磁盘缓冲区的buffer_head则是完全由核心来管理的,所以不会让iget的进程睡眠,而是直接返回错误,因为如果睡眠的话,核心是无法保证其一定能唤醒的;

[外链图片转存失败(img-30XS8tej-1567060305158)(en-resource://database/3306:1)]

算法iget会返回一个上了锁的索引节点数据结构,而且其引用计数比原来大1,上面图片中的文字还是

译者序 前言 第1章 系统概貌 1.1 历史 1.2 系统结构 1.3 用户看法 1.3.1 文件系统 1.3.2 处理环境 1.3.3 构件原语 1.4 操作系统服务 1.5 关于硬件的假设 1.5.1 中断与例外 1.5.2 处理机执行级 1.5.3 存储管理 1.6 本章小结 第2章 内核导言 2.1 UNIX操作系统的体系结构 2.2 系统概念介绍 2.2.1 文件子系统概貌 2.2.2 进程 2.3 内核数据结构 2.4 系统管理 2.5 本章小结 2.6 习题 第3章 数据缓冲区高速缓冲 3.1 缓冲头部 3.2 缓冲池的结构 3.3 缓冲区的检索 3.4 读磁盘块与写磁盘块 3.5 高速缓冲的优点与缺点 3.6 本章小结 3.7 习题 第4章 文件内部表示 4.1 索引节点 4.1.1 定义 4.1.2 对索引节点的存取 4.1.3 释放索引节点 4.2 正规文件的结构 4.3 目录 4.4 路径名到索引节点的转换 4.5 超级块 4.6 为新文件分配索引节点 4.7 磁盘块的分配 4.8 其他文件类型 4.9 本章小结 4.10 习题 第5章 文件系统的系统调用 5.1 系统调用Open 5.2 系统调用read 5.3 系统调用write 5.4 文件和记录的上锁 5.5 文件的输入/输出位置的调整lseek 5.6 系统调用close 5.7 文件的建立 5.8 特殊文件的建立 5.9 改变目录及根 5.10 改变所有者及许可权方式 5.11 系统调用stat和fstat 5.12 管道 5.12.1 系统调用pipe 5.12.2 有名管道的打开 5.12.3 管道的读和写 5.12.4 管道的关闭 5.12.5 例 5.13 系统调用dup 5.14 文件系统的安装和拆卸 5.14.1 在文件路径名中跨越安装点 5.14.2 文件系统的拆卸 5.15 系统调用link 5.16 系统调用unlink 5.16.1 文件系统的一致性 5.16.2 竟争条件 5.17 文件系统的抽象 5.18 文件系统维护 5.19 本章小结 5.20 习题 第6章 进程结构 6.1 进程的状态和状态的转换 6.2 系统存储方案 6.2.1 区 6.2.2 页和页表 6.2.3 内核的安排 6.2.4 u区 6.3 进程的上下文 6.4 进程上下文的保存 6.4.1 中断和例外 6.4.2 系统调用的接口 6.4.3 上下文切换 6.4.4 为废弃返回(abortive return)而保存上下文 6.4.5 在系统和用户地址空间之间拷贝数据 6.5 进程地址空间的管理 6.5.1 区的上锁和解锁 6.5.2 区的分配 6.5.3 区附接到进程 6.5.4 区大小的改变 6.5.5 区的装入 6.5.6 区的释放 6.5.7 区与进程的断接 6.5.8 区的复制 6.6 睡眠 6.6.1 睡眠事件及其地址 6.6.2 算法sleep和wakeup 6.7 本章小结 6.8 习题 第7章 进程控制 7.1 进程的创建 7.2 软中断信号 7.2.1 软中断信号的处理 7.2.2 进程组 7.2.3 从进程发送软中断信号 7.3 进程的终止 7.4 等待进程的终止 7.5 对其他程序的引用 7.6 进程的用户标识号 7.7 改变进程的大小 7.8 Shell程序 7.9 系统自举和进程init 7.10 本章小结 7.11 习题 第8章 进程调度和时间 8.1 进程调度 8.1.1 算法 8.1.2 调度参数 8.1.3 进程调度的例子 8.1.4 进程优先权的控制 8.1.5 公平共享调度 8.1.6 实时处理 8.2 有关时间的系统调用 8.3 时钟 8.3.1 重新启动时钟 8.3.2 系统的内部定时 8.3.3 直方图分析 8.3.4 记帐和统计 8.3.5 计时 8.4 本章小结 8.5 习题 第9章 存储管理策略 9.1 对换 9.1.1 对换空间的分配 9.1.2 进程的换出 9.1.3 进程的换入 9.2 请求调页 9.2.1 请求调页的数据结构 9.2.2 偷页进程 9.2.3 页面错 9.2.4 在简单硬件支持下的请求调页系统 9.3 对换和请求调页的混合系统 9.4 本章小结 9.5 习题 第10章 输入输出子系统 10.1 驱动程序接口 10.1.1 系统配置 10.1.2 系统调用与驱动程序接口 10.1.3 中断处理程序 10.2 磁盘驱动程序 10.3 终端驱动程序 10.3.1 字符表Clist 10.3.2 标准方式下的终端驱动程序 10.3.3 原始方式下的终端驱动程序 10.3.4 终端探询 10.3.5 建立控制终端 10.3.6 间接终端驱动程序 10.3.7 注册到系统 10.4 流 10.4.1 流的详细的示例 10.4.2 对流的分析 10.5 本章小结 10.6 习题 第11章 进程间通信 11.1 进程跟踪 11.2 系统V IPC 11.2.1 消息 11.2.2 共享存储区 11.2.3 信号量 11.2.4 总的评价 11.3 网络通信 11.4 套接字 11.5 本章小结 11.6 习题 第12章 多处理机系统 12.1 多处理机系统的问题 12.2 主从处理机解决方法 12.3 信号量解决方法 12.3.1 信号量定义 12.3.2 信号量实现 12.3.3 几个算法 12.4 Tunis系统 12.5 性能局限性 12.6 习题 第13章 分布式UNIX系统 13.1 卫星处理机系统 13.2 纽卡斯尔连接 13.3 透明型分布式文件系统 13.4 无存根进程的透明分布式模型 13.5 本章小结 13.6 习题 附录A 系统调用 参考文献 索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值