当前课程知识点:操作系统(RISC-V) >  第十七讲 文件系统概念 >  17.3 目录、文件别名和文件系统种类 >  17.3 目录、文件别名和文件系统种类

返回《操作系统(RISC-V)》慕课在线视频课程列表

17.3 目录、文件别名和文件系统种类在线视频

17.3 目录、文件别名和文件系统种类

讲义PDF版本参见课程wiki页面:

http://os.cs.tsinghua.edu.cn/oscourse/OS2020spring/lecture17


下一节:17.4 虚拟文件系统

返回《操作系统(RISC-V)》慕课在线视频列表

17.3 目录、文件别名和文件系统种类课程教案、知识点、字幕

下面我们来讨论目录 文件别名

和具体的文件系统

文件多到一定数目之后

我们要想对它进行有效的管理

这时候我们就必须引入分层的结构

也就说把若干个文件

以目录的形式组织起来

比如说在这里头

给出的是文件系统里的

一种组织方式

圆圈表示我们基本的 普通的文件

在这里这些方块的 就是目录

它是一种特殊的文件

这个特殊的文件里存的内容呢

是用来表示其它文件的信息

所以它是特殊的

文件内容是文件的索引表

一条索引呢 就是文件名

和指向文件的指针

有了这个之后

我们就可以把所有的文件

组织成一个树状结构

这时候我们如何来标识

一个特定的文件呢

每一个文件呢 在我们这里呢

对应过来是一条

从根目录开始的一条路径

第一级 根目录

然后找着它的下一级目录的名字

这是我们第一级根目录里的目录项

到第二级目录的时候呢

它又有它的目录项

根据你这个文件的路径

一直找到最后文件的内容

有这种方式之后

我们就可以以路径的形式

来标识每一个文件

这样的话方便用户的访问

这里所谓的方便呢 是指

我方便用户的记忆和分类

我们再换一个 这个地方呢

实际上是从program/p/list

最后找着我的这个文件 名字叫list

用这种方式组织之后

我们在目录上的操作

就跟其它的文件有一些不一样的地方

在目录里典型的操作呢

是说我会有去检索

我找我需要那个文件

然后我创建一个新的文件的时候

因为我在文件系统里

存了一个新的文件

那么这时候我必须增加相应的目录项

这也会在目录里头呢 有相应的操作

然后我删除一个文件

也会需要你在相应的目录里呢

把对应的目录项删掉

然后我会去列目录

看看这个目录里

到底有哪些文件和子目录

我会对文件重命名

你改文件的名字

那这时候目录项里的

相应的文件属性 文件名

你也需要去进行相应的修改

再有一个是遍历路径

也就相当于我想找某一个文件

是从根目录一级一级找下去

最后找那个文件

这是在目录上的典型操作

这些操作呢 对于操作系统来说

它都是封装到内核里头的

只能由内核来对目录进行修改

这样的话 就可以保证

这种目录的映射的完整性

用户进行这个操作的时候他需要改

这个改动怎么来做呢

通过系统调用

用户来通过系统调用

来对目录进行相应的操作

这是目录

目录的实现呢 是描述我目录里的

这些文件的列表

我怎么来组织

最简单一种做法呢

是把它组织成一个线性的表

这时候的问题是说如果这个表很大

那这时候检索 或者说增删

它的时间会很长

但是它的好处是我编程比较简单

然后另一种做法呢

我是把目录里这些文件呢

组织成一个哈希表

先做哈希 然后再进行后续的操作

这种做法呢 由于哈希的缘故

它可以减少搜索的时间

也会有另外一个问题 就是两个文件名

它做哈希之后

可能哈希结果是一致的

这时候会产生冲突

那么冲突呢 我需要在哈希表里

有相应的解决

这样做之后呢

我目录表里的每一项呢

它的长度是固定的

接下来我们说文件别名

也就说我有一个文件

我想给它起两个或者多个名字的时候

我怎么办

首先我们在这儿看这个例子

在这里头呢我有一个文件

这有它的路径 count

这两个最后指到是同一个实体

我们这种做法的缘故呢

是为了方便共享 减少存储空间

文件系统中我怎么来表示它

在这里头呢 这是另外一个例子

这三个说的 实际上最后都是同一个

它的实现办法呢 我们这有两种

一种叫硬链接

也就说 多个文件的目录项

最后都指向同一个文件

比如说在这里头

我们知道这一个和这一个

另一种做法叫软链接

它的做法呢 是以快捷方式

来指向其它文件

它的文件描述出来

仍然是各自独立的

只是说链接文件里头呢

它存的是另一个文件的 完整的路径

它以这种方式来实现文件别名

第一种方式呢 就会涉及到一个问题

如果说我一个删除操作

我到什么时候

实实在在把这个文件删除掉

它就会是 我只要删到最后一个

指向它的文件名的时候

我才会把这个文件实体删掉

而软链接呢 我删除的时候呢

删除别名和删除其它的文件是一样的

删除别名 实际上文件不受任何影响

删除文件之后呢 你原来的别名

它指向的文件就是不存在了

这是文件别名

还有一个问题呢

是文件目录中的循环

我可以指向下一级子目录

那我的子目录可不可以

指回到它的父目录呢

这时候 如果你这样指的话

就会构成循环

比如说在这里头 你要找某一个文件

它的子目录的子目录

我把它指向一个循环之后

这条路径就可以无限制的循环下去了

这种情况怎么处理呢

我们处理办法呢有这样几种

一种是 我加链接的时候

我只能是文件 不允许目录的链接

这是一种做法

还有一种做法呢是说

我在这里头增加链接的时候

我用检测算法来检测

这跟我们死锁检测差不太多

我可以用银行家算法

但这时候呢你的检测开销会比较大

所以在实际的做法里头呢

通常情况下 我是限制

你可以检索下去的长度

超过这个长度

我就不再给你往下检索了

这样的话也就减少了

这种由于循环所带来的问题

有了这个之后

那我们来看 接下来是

我如何找一个文件

这就是我们这里的名字解析

在很多地方呢有名字解析的问题

这里说名字解析是把一个逻辑的名字

转换成它的物理资源

比如说我们这里的文件

对于文件系统里的名字解析呢

就是我给你一个路径

然后你告诉我

这个路径所对应的文件存在哪

把它的内容读出来

它的实际做法呢就是遍历文件目录

从根目录开始

一直找到你要找那个文件为止

这是文件名的解析

在这儿给一个例子

说我这儿有一个路径

最后文件名是ls

我怎么来找呢

首先我找这个文件分区的根目录

根目录里头的位置

在文件系统当中是固定的

从这儿呢我读出根目录的数据块

里头每一个子目录

和它的根目录里的文件对应着一项

我在这里呢

找着我要找bin这一项

这一项会指向下一级目录的数据块

我再去找着下一个 bin

这个目录所对应的文件头

那在这里呢读取它的数据块

也就相当于这里头就是

bin这个目录里

所有文件和子目录的列表

在那里去找 是不是ls这一项

找到这一项之后

我再来看

就可以读取到

我这个ls这个文件的内容了

那为了方便这种查找呢

我们就提出一种概念

叫做当前工作目录

它指每一个进程

给它设定一个缺省的目录

它的名字解析

就从这个目录开始往下解析

这样做的好处是在于

如果说我这个进程

经常就在这一个目录里进行操作的话

它就没有必要每次都从根目录往下找

只有在你要找切换了

你的当前工作目录之后

你才会从根目录里找一遍

这样的话就会提高效率

这时候路径就有一种相对路径

也就说基于当前目录所进行的查找

这是当前工作目录 和相对路径

文件系统呢

在我们计算机系统起来之后

它有个根文件系统

通常我们访问这些数据呢

所在文件系统必须挂接到系统当中

才能够被访问

比如说我们在这里

这是一个未挂接的文件系统

系统起来的时候呢

它有一个根文件系统

未被挂接文件系统呢

需要挂接到这个根文件系统当中

才能进行访问

所谓挂接是指什么意思呢

就是我把这个文件系统

它根目录对应到

根文件系统里某一个目录

比如说我在这里user

这个地方就是它的挂接点

挂接上去之后

我再去找这个文件系统里的某一个文件

它的路径什么

从整个系统的根开始 沿着这找

找到你挂接点之下

找到你这个文件系统的根

从这个地方再往下找

就可以找到 当前这个

已挂接文件系统当中的

任何一个文件了

接下来我们说文件系统的种类

我们最常用一种文件系统

叫磁盘文件系统

它是用磁盘作为存储介质

在上面来存数据的

这上头我们定义了各种各样的文件系统

这时候会问

为啥我会定义这么多种文件系统

我有一种是不是就够用了

不是这样的

不同的文件系统由于存的数据不同

它会做不同优化

它使用场景的不同

它也会做各自不同的优化

比如说像我们的光盘

它的文件系统呢

它是一次性写入 多次读出

而正常磁盘文件系统呢

它是多次读入写出的 会有修改

这样的话 它的优化角度是会不一样的

不同的文件系统它的安全要求不同

安全要求级别越高

它的访问效率也会相对下降

对于我要求安全级别不高的文件系统

我可能就把安全机制减弱 甚至于取消

这样我们就构成了很多种不同文件系统

这是一类

再有一类是数据库文件系统

它可以基于文件特征

来被寻址或者是被检索

一个例子呢就是winFS

再有一个呢是日志文件系统

也就说我们对文件系统的修改

这些我必须以原子的形式来进行

因为我的数据很关键

比如说我银行里的这些记录的修改

这时候我们构成日志文件系统

它是指文件系统上 所有修改

它都会做相应的记录

以避免我这个操作执行到半截

所导致文件系统损坏

由此导致数据丢失

网络分布式文件系统

这时候实际上相当于

我们看到的是把文件存到远端的机器上

这时候呢不同的网络访问方式

构成了我们这里不同的文件系统

再有一个呢是特殊文件系统

比如说像我们前面讲到的

进程间通讯当中用到的管道

就是一类特殊的文件系统

对于分布式文件系统

我们还想多说两句

也就说我们在这里为了进行共享

前面的文件共享呢

是在一个系统里多个进程之间

分布式文件系统呢

它是想通过网络来进行文件共享

文件被存到远端的服务器上

对于这种情况

我们用户在访问远端文件系统的时候呢

要通过挂接远端服务器上的文件

这时候就会导致其中有网络通讯

我们正常的标准的文件操作

就会转换成网络上远程访问

在这种情况下 我们在这里呢

存在多种分布式文件系统的共享协议

NFS CIFS

这是Unix和windows常用的

两种网络文件系统

对于分布式文件系统

我们会面临比原来更大一些麻烦

你比如说对于安全

在本地呢我只需要标识这个用户是谁

我能标识清楚

这个安全的管理就可以实施了

而在网络环境上你想识别一个用户

这时候它会变得更复杂

所以在这种情况下

我们用到的NFS

实际上它是存在某些安全隐患的

再有一个问题呢 是一致性问题

加了网络之后 我读写的时候

这个一致性就更难把握了

出了错误之后

我的错误处理呢也会比原来更复杂

这都是广域网上的 或者网络上的

分布式文件系统所面临的挑战

到这儿呢 我们就对

文件系统的基本概念呢

有了一个大致的介绍

操作系统(RISC-V)课程列表:

第一讲 操作系统概述

-1.1 课程概述

--课程概述

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

-1.8 OS实验概述

--视频

第二讲 操作系统与系统结构和程序设计语言

-2.1 从OS角度看计算机系统

--2.1 从OS角度看计算机系统

-2.2 从OS角度看RISC-V

--2.2 从OS角度看RISC-V

-2.3 Rust语言与系统编程

--2.3 Rust语言与系统编程

-2.4 RISC-V CPU启动

--2.4 RISC-V CPU启动

-2.5 RISC-V CPU启动进一步分析

--2.5 RISC-V CPU启动进一步分析

第三讲 中断、异常和系统调用

-3.1 基本概念与原理

--3.1 基本概念与原理

-3.2 硬件架构支持

--3.2 硬件架构支持

-3.3 中断处理机制

--3.3.1 中断处理机制–Overview

--3.3.2 中断处理机制–Detail-1

--3.3.3 中断处理机制–Detail-2

--3.3.4 中断处理机制–Detail-3

--3.3.5 中断处理机制–Summary

-3.4 系统调用

--3.4 系统调用

第四讲 物理内存管理: 连续内存分配

-4.1 计算机体系结构和内存层次

--4.1 计算机体系结构和内存层次

-4.2 地址空间和地址生成

--4.2 地址空间和地址生成

-4.3 连续内存分配

--4.3 连续内存分配

-4.4 碎片整理

--4.4 碎片整理

-4.5 伙伴系统

--4.5 伙伴系统

-4.6 SLAB分配器

--4.6 SLAB分配器

第五讲 物理内存管理: 非连续内存分配

-5.1 非连续内存分配的需求背景

--5.1 非连续内存分配的需求背景

-5.2 段式存储管理

-- 5.2 段式存储管理

-5.3 页式存储管理

--5.3 页式存储管理

-5.4 页表概述

--5.4 页表概述

-5.5 快表和多级页表

--5.5 快表和多级页表

-5.6 RISC-V页映射机制

--5.6 RISC-V页映射机制

-5.7 使能RISC-V页表

--5.7 使能RISC-V页表

第六讲 虚拟存储概念

-6.1 虚拟存储的需求背景

--6.1 虚拟存储的需求背景

-6.2 覆盖和交换

--6.2 覆盖和交换

-6.3 局部性原理

--6.3 局部性原理

-6.4 虚拟存储概念

--6.4 虚拟存储概念

-6.5 虚拟页式存储

--6.5 虚拟页式存储

-6.6 缺页异常

--6.6 缺页异常

-6.7 RISC-V缺页异常

--6.7 RISC-V缺页异常

第七讲 虚拟存储:局部页面置换算法

-7.1 页面置换算法的概念

--7.1 页面置换算法的概念

-7.2 最优算法、先进先出算法和最近最久未使用算法

--7.2 最优算法、先进先出算法和最近最久未使用算法

-7.3 时钟置换算法和最不常用算法

--7.3 时钟置换算法和最不常用算法

-7.4 Belady现象和局部置换算法比较

--7.4 Belady现象和局部置换算法比较

-7.5 页表自映射

--7.5 页表自映射

第八讲 虚拟存储:全局页面置换算法

-8.1 工作集置换算法

--8.1 工作集置换算法

-8.2 缺页率置换算法

--8.2 缺页率置换算法

-8.3 抖动和负载控制

--8.3 抖动和负载控制

-8.4 面向缓存的页替换算法

--8.4.1 面向缓存的页替换算法-FBR

--8.4.2 面向缓存的页替换算法-LRU-K 2Q

--8.4.3 面向缓存的页替换算法-LIRS

第九讲 进程和线程

-9.1 进程的概念

--11.1 进程的概念

-9.2 进程控制块

--9.2 进程控制块

-9.3 进程状态

--9.3 进程状态

-9.4 三状态进程模型

--9.4 三状态进程模型

-9.5 挂起进程模型

--9.5 挂起进程模型

-9.6 线程的概念

--9.6 线程的概念

-9.7 用户线程

--9.7 用户线程

-9.8 内核线程

--9.8 内核线程

-9.9 进程地址空间与熔断 (meltdown) 漏洞

--9.9 进程地址空间与熔断 (meltdown) 漏洞

第十讲 进程和线程控制

-10.1 进程切换

--10.1 进程切换

-10.2 进程创建

--10.2 进程创建

-10.3 进程加载

--10.3 进程加载

-10.4 进程等待与退出

--10.4 进程等待与退出

-10.5 rCore进程和线程控制

--10.5 rCore进程和线程控制

第十一讲 处理机调度

-11.1 处理机调度概念

--11.1 处理机调度概念

-11.2 调度准则

--11.2 调度准则

-11.3 先来先服务、短进程优先和最高响应比优先调度算法

--11.3 先来先服务、短进程优先和最高响应比优先调度算法

-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-11.5 实时调度

--11.5 实时调度

-11.6 优先级反置

--11.6 优先级反置

-11.7 rCore调度框架

--11.7 rCore调度框架

第十二讲 多处理机调度

-12.1 对称多处理与多核架构

--12.1 对称多处理与多核架构

-12.2 多处理器调度概述

--12.2 多处理器调度概述

-12.3 O(1)调度

--12.3 O(1)调度

-12.4 CFS调度

--12.4 CFS调度

-12.5 BFS调度算法

--12.5 BFS调度算法

第十三讲 同步互斥

-13.1 背景

--13.1 背景

-13.2 现实生活中的同步问题

--13.2 现实生活中的同步问题

-13.3 临界区和禁用硬件中断同步方法

--13.3 临界区和禁用硬件中断同步方法

-13.4 基于软件的同步方法

--13.4 基于软件的同步方法

-13.5 高级抽象的同步方法

--13.5 高级抽象的同步方法

第十四讲 信号量与管程

-14.1 信号量

--14.1 信号量

-14.2 信号量使用

--14.2 信号量使用

-14.3 管程

--14.3 管程

-14.4 哲学家就餐问题

--14.4 哲学家就餐问题

-14.5 读者-写者问题

--14.5 读者-写者问题

-14.6 Rust语言中的同步机制

--14.6 Rust语言中的同步机制

第十五讲 死锁和并发错误检测

-15.1 死锁概念

--15.1 死锁概念

-15.2 死锁处理方法

--15.2 死锁处理方法

-15.3 银行家算法

--15.3 银行家算法

-15.4 死锁检测

--15.4 死锁检测

-15.5 并发错误检测

--15.5 并发错误检测

第十六讲 进程通信

-16.1 进程通信概念

--16.1 进程通信概念

-16.2 信号和管道

--16.2 信号和管道

-16.3 Linux信号机制

--16.3 Linux信号机制

-16.4 消息队列和共享内存

--16.4 消息队列和共享内存

-16.5 D-Bus机制

--16.5 D-Bus机制

-16.6 Binder机制

--16.6 Binder机制

第十七讲 文件系统概念

-17.1 文件系统和文件

--17.1 文件系统和文件

-17.2 文件描述符

--17.2 文件描述符

-17.3 目录、文件别名和文件系统种类

--17.3 目录、文件别名和文件系统种类

-17.4 虚拟文件系统

--17.4 虚拟文件系统

-17.5 文件缓存和打开文件

--17.5 文件缓存和打开文件

-17.6 文件分配

--17.6 文件分配

-17.7 空闲空间管理和冗余磁盘阵列RAID

--17.7 空闲空间管理和冗余磁盘阵列RAID

第十八讲 文件系统实例

-18.1 FAT文件系统

--18.1 FAT文件系统

-18.2.1 EXT4文件系统-历史

--18.2.1 EXT4文件系统-历史

-18.2.2 EXT4文件系统-支持大容量存储

--18.2.2 EXT4文件系统-支持大容量存储

-18.2.3 EXT4文件系统-支持恢复异常

--18.2.3 EXT4文件系统-支持恢复异常

-18.3 ZFS文件系统

--18.3 ZFS文件系统

第十九讲 I/O子系统

-19.1 I/O特点

--19.1 I/O特点

-19.2 I/O结构

--19.2 I/O结构

-19.3 I/O数据传输

--19.3 I/O数据传输

-19.4 磁盘调度

--19.4 磁盘调度

-19.5 Linux I/O子系统

--19.5 Linux I/O子系统

第二十讲 内核与程序设计语言

-20.1 Linux内核错误分析

--20.1 Linux内核错误分析

-20.2.1 用rust写操作系统-系统编程语言rust

--20.2.1 用rust写操作系统-系统编程语言rust

-20.2.2 用rust写操作系统-rust与操作系统开发

--20.2.2 用rust写操作系统-rust与操作系统开发

第二十一讲 异步编程 (Asynchronous Programming)

-21.1 Background

--21.1 Background

-21.2 Futures in Rust

--21.2 Futures in Rust

-21.3 Generators and async/await

--21.3 Generators and async/await

-21.4 Self-Referential Structs & Pin

--21.4 Self-Referential Structs & Pin

-21.5 Waker and Reactor

--21.5 Waker and Reactor

第二十二讲 Virtual Machine Monitor

-22.1 Overview

--22.1 Overview

-22.2.1 How VMM works - CPU

--22.2.1 How VMM works - CPU

-22.2.2 How VMM works - memory & I/O

--22.2.2 How VMM works - memory & I/O

17.3 目录、文件别名和文件系统种类笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。