
🎉作者简介:👓 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 \textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容
📃 个人主页: \textcolor{gray}{个人主页:} 个人主页: 小呆鸟_coding
🔎 支持 : \textcolor{gray}{支持:} 支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦👍 就是给予我最大的支持! \textcolor{green}{就是给予我最大的支持!} 就是给予我最大的支持!🎁
💛本文摘要💛
本专栏主要是讲解操作系统的相关知识 本文主要讲解 文件系统管理
清华操作系统系列文章:可面试可复习
1. 操作系统—概述
2. 操作系统—中断、异常、系统调用
3. 操作系统—物理内存管理
4. 操作系统—非连续内存分配
5. 虚拟内存管理
6. 操作系统—虚拟内存管理技术页面置换算法
7. 进程管理
8. 调度算法
9. 同步与互斥
10. 信号量和管程
11. 死锁和进程通信
12. 文件系统管理
打开一个文件会返回一个文件描述符
f = open(name, flag);
...
... = read(f, ...);
...
close(f);

需要元数据来管理打开文件:
文件指针: 指向最近的一次读写位置,每个打开了这个文件的进程都这个指针文件打开计数: 记录文件打开的次数 - 当最后一个进程关闭了文件时,允许将其从打开文件表中移除文件磁盘位置: 缓存数据访问信息访问权限: 每个程序访问模式信息用户视图:
系统访问接口:
操作系统内部视角:
怎样将磁盘块和操作系统文件对应起来(映射关系),对于磁是以扇区进行读写,对于真正读写是以字节读写






典型操作:
操作系统应该只允许内核模式修改目录:
文件名的线性列表,包含了指向数据块的指针:
Hash表 - hash数据结构的线性表:
挂载

一个文件有多个名字(一个文件在不同的用户里,有不同的命名,这样便于分类和查找文件)
实现方式

如果删除一个有别名的文件会如何呢? :
Backpointers 方案:
添加一个间接层: 目录项数据结构


数据结构
抽象文件系统图



数据缓冲技术
访问硬盘的速度和访问内存的速度不一样,因为在内存中放一块缓存,把经常用到的或者是当前访问的数据,从硬盘读到内存中,接下来访问都是访问内存,提高效率··
数据缓冲的方式
将缓存和页管理结合,实现基于分页的缓存机制,使得数据更好的给上层使用


打开文件实际上是把存在硬盘上的文件的文件控制块的内容读进内存中,把关键和相关信息放在文件表中,文件表有专门的项,把项的索引index,返回给应用程序(fd = open(),fd就是索引,基于项找到系统的文件表)

总结:打开文件的具体步骤fd(也就是索引)index会指出在进程的打开文件表的具体位置,取出项read和write时,会有一个偏移量,找到具体位置offset会经过文件控制块的准换,转换成磁盘的扇区编号大多数文件都很小:
一些文件非常大:
如何为一个文件分配数据块
分配方式:
指标:



对大文件的管理

早起Unix管理方式使用的是多级索引块

1.跟踪在存储中的所有未分配的数据块
2.空闲空间列表存储在哪里?
3.空闲空间列表的最佳数据结构怎么样?
11111101101110111 i = 0表明数据块i是空闲的,反之是分配的将整个位图从磁盘导入到内存中去,定期需要将信息更新到硬盘上去,来保证数据的一致性(假如断电了,要及时更新到硬盘中去)
使用简单但是可能会是一个big vector:
160GB disk → 40M blocks → 5MB worth of bits
然而,如果空闲空间在磁盘中均匀分布,那么再找到"0"之前需要扫描 磁盘上数据块总数 / 空闲块的数目
问题:要确保内存和磁盘的一致性(因为位图最开始存在硬盘上的,为了提高效率将它读进内存中,在硬盘置位1后,结果1没有及时写到内存中去)解决办法:先在磁盘上置1,然后再分配bolck,在将内存的bit置为1
利用链表和分组的方式查找空闲空间列表

总结:
1. 虚拟文件系统:屏蔽底层具体的差异性,给上层应用一个更简洁的访问接口2. 数据块缓存:提高访问效率,减少对IO的访问次数,提高系统的整体效率3. 打开文件的数据结构:打开文件后通过文件描述符(fd),就能对文件进行读写4. 文件分配:文件中具体的内容,怎么分配,不同的分配方法应对不同的情况(随机读、顺序读、扩展、删除、只读等)5. 空闲空间:基于位图,基于链式管理空闲空间、数据块、磁盘块
注意:最慢的一部分就是磁头的前后移动(后续有一些方法来减少访问开销)

一个典型的文件系统是由分区组成的,磁盘可以分不同的分区,不同的分区由不同的文件系统组成
卷:把多个disk放到一个卷里管理,可以将一个文件系统扩展到多个磁盘上去分区: 硬件磁盘的一种适合操作系统指定格式的划分卷: 一个拥有一个文件系统实例的可访问的存储空间

- 文件系统位于不同的磁盘上,那可以俩个磁盘并行工作,来提升文件系统访问效率
- 如果俩个磁盘存放相同的内容,来提高磁盘的可靠性
为什么通过RAID来提升访问效率
- 将数据放到相互独立的硬盘中,而每个硬盘可以并行的工作,实现速度的并行访问
RAID-0(提高吞吐率)

RAID-1(提高可靠性)

RAID-4(可靠+吞吐)
Parity Disk中写数据Parity Disk读写频繁(可以将Parity Disk的开销均匀的分布在disk中,而不是集中在一个disk中)
RAID-5
每个条带快有一个奇偶校验块,允许有一个磁盘错误
RAID-6
两个冗余块,有一种特殊的编码方式,允许两个磁盘错误
将RAID1 和 RAID 0进行分层

- RAID提高磁盘访问效率
- 磁盘调度:在OS层面重新组织IO请求的顺序,来有效的减少磁盘的访问开销(减少IO操作)
平均旋转延迟时间 = 磁盘旋转一周时间的一半



从磁臂当前位置需要移动最少的IO请求缺点:(访问的不公平+不均匀)

磁头顺着一个方向移动,移到头,在移动回来,类似电梯,可以公平的让所有访问请求得到访问,但是他要到达disk的最高端和最低端
磁臂在一个方向上移动,满足所有为完成的请求,直到磁臂到达该方向上最后的磁道elevator algorithm
限制了仅在一个方向上扫描
当最后一个磁道也被访问过了后,磁臂快速返回到磁盘的最开始的位置再次进行扫描
skan有些请求靠近0的位置它等的时间长。而c-skan对请求的位置建立有序的过程

最后一个请求处,然后立即反转它不是到的磁盘的终点,而是到底磁盘的最后一个请求位置,然后反转
一共将了三种情况下的调度算法
CPU调度(进程调度)磁盘调度页面换入换出