当前课程知识点:操作系统 > 第二十一讲 文件系统 > 21.3 目录、文件别名和文件系统种类 > 21.3 目录、文件别名和文件系统种类
下面我们来讨论目录 文件别名
和具体的文件系统
文件多到一定数目之后
我们要想对它进行有效的管理
这时候我们就必须引入分层的结构
也就说把若干个文件
以目录的形式组织起来
比如说在这里头
给出的是文件系统里的
一种组织方式
圆圈表示我们基本的 普通的文件
在这里这些方块的 就是目录
它是一种特殊的文件
这个特殊的文件里存的内容呢
是用来表示其它文件的信息
所以它是特殊的
文件内容是文件的索引表
一条索引呢 就是文件名
和指向文件的指针
有了这个之后
我们就可以把所有的文件
组织成一个树状结构
这时候我们如何来标识
一个特定的文件呢
每一个文件呢 在我们这里呢
对应过来是一条
从根目录开始的一条路径
第一级 根目录
然后找着它的下一级目录的名字
这是我们第一级根目录里的目录项
到第二级目录的时候呢
它又有它的目录项
根据你这个文件的路径
一直找到最后文件的内容
有这种方式之后
我们就可以以路径的形式
来标识每一个文件
这样的话方便用户的访问
这里所谓的方便呢 是指
我方便用户的记忆和分类
我们再换一个 这个地方呢
实际上是从program/p/list
最后找着我的这个文件 名字叫list
用这种方式组织之后
我们在目录上的操作
就跟其它的文件有一些不一样的地方
在目录里典型的操作呢
是说我会有去检索
我找我需要那个文件
然后我创建一个新的文件的时候
因为我在文件系统里
存了一个新的文件
那么这时候我必须增加相应的目录项
这也会在目录里头呢 有相应的操作
然后我删除一个文件
也会需要你在相应的目录里呢
把对应的目录项删掉
然后我会去列目录
看看这个目录里
到底有哪些文件和子目录
我会对文件重命名
你改文件的名字
那这时候目录项里的
相应的文件属性 文件名
你也需要去进行相应的修改
再有一个是遍历路径
也就相当于我想找某一个文件
是从根目录一级一级找下去
最后找那个文件
这是在目录上的典型操作
这些操作呢 对于操作系统来说
它都是封装到内核里头的
只能由内核来对目录进行修改
这样的话 就可以保证
这种目录的映射的完整性
用户进行这个操作的时候他需要改
这个改动怎么来做呢
通过系统调用
用户来通过系统调用
来对目录进行相应的操作
这是目录
目录的实现呢 是描述我目录里的
这些文件的列表
我怎么来组织
最简单一种做法呢
是把它组织成一个线性的表
这时候的问题是说如果这个表很大
那这时候检索 或者说增删
它的时间会很长
但是它的好处是我编程比较简单
然后另一种做法呢
我是把目录里这些文件呢
组织成一个哈希表
先做哈希 然后再进行后续的操作
这种做法呢 由于哈希的缘故
它可以减少搜索的时间
也会有另外一个问题 就是两个文件名
它做哈希之后
可能哈希结果是一致的
这时候会产生冲突
那么冲突呢 我需要在哈希表里
有相应的解决
这样做之后呢
我目录表里的每一项呢
它的长度是固定的
接下来我们说文件别名
也就说我有一个文件
我想给它起两个或者多个名字的时候
我怎么办
首先我们在这儿看这个例子
在这里头呢我有一个文件
这有它的路径 count
这两个最后指到是同一个实体
我们这种做法的缘故呢
是为了方便共享 减少存储空间
文件系统中我怎么来表示它
在这里头呢 这是另外一个例子
这三个说的 实际上最后都是同一个
它的实现办法呢 我们这有两种
一种叫硬链接
也就说 多个文件的目录项
最后都指向同一个文件
比如说在这里头
我们知道这一个和这一个
另一种做法叫软链接
它的做法呢 是以快捷方式
来指向其它文件
它的文件描述出来
仍然是各自独立的
只是说链接文件里头呢
它存的是另一个文件的 完整的路径
它以这种方式来实现文件别名
第一种方式呢 就会涉及到一个问题
如果说我一个删除操作
我到什么时候
实实在在把这个文件删除掉
它就会是 我只要删到最后一个
指向它的文件名的时候
我才会把这个文件实体删掉
而软链接呢 我删除的时候呢
删除别名和删除其它的文件是一样的
删除别名 实际上文件不受任何影响
删除文件之后呢 你原来的别名
它指向的文件就是不存在了
这是文件别名
还有一个问题呢
是文件目录中的循环
我可以指向下一级子目录
那我的子目录可不可以
指回到它的父目录呢
这时候 如果你这样指的话
就会构成循环
比如说在这里头 你要找某一个文件
它的子目录的子目录
我把它指向一个循环之后
这条路径就可以无限制的循环下去了
这种情况怎么处理呢
我们处理办法呢有这样几种
一种是 我加链接的时候
我只能是文件 不允许目录的链接
这是一种做法
还有一种做法呢是说
我在这里头增加链接的时候
我用检测算法来检测
这跟我们死锁检测差不太多
我可以用银行家算法
但这时候呢你的检测开销会比较大
所以在实际的做法里头呢
通常情况下 我是限制
你可以检索下去的长度
超过这个长度
我就不再给你往下检索了
这样的话也就减少了
这种由于循环所带来的问题
有了这个之后
那我们来看 接下来是
我如何找一个文件
这就是我们这里的名字解析
在很多地方呢有名字解析的问题
这里说名字解析是把一个逻辑的名字
转换成它的物理资源
比如说我们这里的文件
对于文件系统里的名字解析呢
就是我给你一个路径
然后你告诉我
这个路径所对应的文件存在哪
把它的内容读出来
它的实际做法呢就是遍历文件目录
从根目录开始
一直找到你要找那个文件为止
这是文件名的解析
在这儿给一个例子
说我这儿有一个路径
最后文件名是ls
我怎么来找呢
首先我找这个文件分区的根目录
根目录里头的位置
在文件系统当中是固定的
从这儿呢我读出根目录的数据块
里头每一个子目录
和它的根目录里的文件对应着一项
我在这里呢
找着我要找bin这一项
这一项会指向下一级目录的数据块
我再去找着下一个 bin
这个目录所对应的文件头
那在这里呢读取它的数据块
也就相当于这里头就是
bin这个目录里
所有文件和子目录的列表
在那里去找 是不是ls这一项
找到这一项之后
我再来看
就可以读取到
我这个ls这个文件的内容了
那为了方便这种查找呢
我们就提出一种概念
叫做当前工作目录
它指每一个进程
给它设定一个缺省的目录
它的名字解析
就从这个目录开始往下解析
这样做的好处是在于
如果说我这个进程
经常就在这一个目录里进行操作的话
它就没有必要每次都从根目录往下找
只有在你要找切换了
你的当前工作目录之后
你才会从根目录里找一遍
这样的话就会提高效率
这时候路径就有一种相对路径
也就说基于当前目录所进行的查找
这是当前工作目录 和相对路径
文件系统呢
在我们计算机系统起来之后
它有个根文件系统
通常我们访问这些数据呢
所在文件系统必须挂接到系统当中
才能够被访问
比如说我们在这里
这是一个未挂接的文件系统
系统起来的时候呢
它有一个根文件系统
未被挂接文件系统呢
需要挂接到这个根文件系统当中
才能进行访问
所谓挂接是指什么意思呢
就是我把这个文件系统
它根目录对应到
根文件系统里某一个目录
比如说我在这里user
这个地方就是它的挂接点
挂接上去之后
我再去找这个文件系统里的某一个文件
它的路径什么
从整个系统的根开始 沿着这找
找到你挂接点之下
找到你这个文件系统的根
从这个地方再往下找
就可以找到 当前这个
已挂接文件系统当中的
任何一个文件了
接下来我们说文件系统的种类
我们最常用一种文件系统
叫磁盘文件系统
它是用磁盘作为存储介质
在上面来存数据的
这上头我们定义了各种各样的文件系统
这时候会问
为啥我会定义这么多种文件系统
我有一种是不是就够用了
不是这样的
不同的文件系统由于存的数据不同
它会做不同优化
它使用场景的不同
它也会做各自不同的优化
比如说像我们的光盘
它的文件系统呢
它是一次性写入 多次读出
而正常磁盘文件系统呢
它是多次读入写出的 会有修改
这样的话 它的优化角度是会不一样的
不同的文件系统它的安全要求不同
安全要求级别越高
它的访问效率也会相对下降
对于我要求安全级别不高的文件系统
我可能就把安全机制减弱 甚至于取消
这样我们就构成了很多种不同文件系统
这是一类
再有一类是数据库文件系统
它可以基于文件特征
来被寻址或者是被检索
一个例子呢就是winFS
再有一个呢是日志文件系统
也就说我们对文件系统的修改
这些我必须以原子的形式来进行
因为我的数据很关键
比如说我银行里的这些记录的修改
这时候我们构成日志文件系统
它是指文件系统上 所有修改
它都会做相应的记录
以避免我这个操作执行到半截
所导致文件系统损坏
由此导致数据丢失
网络分布式文件系统
这时候实际上相当于
我们看到的是把文件存到远端的机器上
这时候呢不同的网络访问方式
构成了我们这里不同的文件系统
再有一个呢是特殊文件系统
比如说像我们前面讲到的
进程间通讯当中用到的管道
就是一类特殊的文件系统
对于分布式文件系统
我们还想多说两句
也就说我们在这里为了进行共享
前面的文件共享呢
是在一个系统里多个进程之间
分布式文件系统呢
它是想通过网络来进行文件共享
文件被存到远端的服务器上
对于这种情况
我们用户在访问远端文件系统的时候呢
要通过挂接远端服务器上的文件
这时候就会导致其中有网络通讯
我们正常的标准的文件操作
就会转换成网络上远程访问
在这种情况下 我们在这里呢
存在多种分布式文件系统的共享协议
NFS CIFS
这是Unix和windows常用的
两种网络文件系统
对于分布式文件系统
我们会面临比原来更大一些麻烦
你比如说对于安全
在本地呢我只需要标识这个用户是谁
我能标识清楚
这个安全的管理就可以实施了
而在网络环境上你想识别一个用户
这时候它会变得更复杂
所以在这种情况下
我们用到的NFS
实际上它是存在某些安全隐患的
再有一个问题呢 是一致性问题
加了网络之后 我读写的时候
这个一致性就更难把握了
出了错误之后
我的错误处理呢也会比原来更复杂
这都是广域网上的 或者网络上的
分布式文件系统所面临的挑战
到这儿呢 我们就对
文件系统的基本概念呢
有了一个大致的介绍
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html