文件系统: 一种用于持久性存储的系统抽象
文件: 文件系统中的一个单元的相关数据在操作系统中的抽象
文件和块:
名称,类型,位置,大小,保护,创建者,创建时间,最久修改时间…
文件头:
在存储元数据中保存了每个文件的信息,保存文件的属性,跟踪哪一块存储块属于逻辑上文件结构的哪个偏移
使用程序必须在使用前先”打开”文件 open(name, flag)
3_1. 用户视图: 持久的数据结构
3_2. 系统访问接口
字节的集合(UNIX)
系统不会关心你想存储在磁盘上的任何的数据结构
3_3. 操作系统内部视角:
块的集合(块是逻辑转换单元,而扇区是物理转换单元)
块大小<> 扇区大小: 在UNIX中, 块的大小是 4KB
getc() putc() 即使每次只访问1字节的数据,也会缓存目标数据4096字节(一个磁盘块)
在系统层面需要知道用户的访问模式
多用户系统中的文件共享是很必要的
谁能够获得哪些文件的哪些访问权限
访问模式: 读,写,执行,删除,列举等
<文件实体, 权限>
多个系统/用户如何同时访问文件
对打开文件的写入内容立即对其他打开同一文件的其他用户可见
共享文件指针允许多用户同时读取和写入文件
会话语义:
写入内容只有当文件关闭时可见
锁:
一些操作系统和文件系统提供该功能
文件以目录的方式组织起来
目录是一类特殊的文件:
每个目录都包含了一张表<name, pointer to file header>
目录和文件的树形结构:
早期的文件系统是扁平的(只有一层目录)
层次名称空间:
具体操作 :
操作系统应该只允许内核模式修改目录(root用户)
为 确保映射的完整性; 应用程序能够读目录(ls)
编程简单 ; 执行耗时
Hash表 - hash数据结构的线性表:
减少目录搜索时间;碰撞;固定大小
逻辑名字转换成物理资源(如文件)的过程:
: 这个别名将成为一个悬空指针
相对于方案二 他会形成一个环。
如何保证没有循环呢 ?
文件存储在数据存储设备上,如磁盘; 例如: FAT,NTFS,ext2,3,ISO9660等
文件根据其特征是可被寻址的; 例如: WinFS
记录文件系统的修改,事件; 例如: journaling file system
例如: NFS,SMB,AFS,GFS
网址等
目的: 对所有不同文件系统的抽象
功能:
在分配在存储设备中的数据块中
各种缓存方式
分页要求: 当需要一个页时才将其载入内存
支持存储: 一个页(在虚拟地址空间中)可以被映射到一个本地文件中(在二级存储中)
我们都知道打开文件我们就可以对文件进行读写, 但是打开文件时操作系统干了那些事情就是这次需要学习的.
强制 - 根据锁保持情况和需求拒绝访问
劝告 - 进程可以查找锁的状态来决定怎么做
打开文件后我们需要对文件进行相关的操作, 这些操作的背后是操作系统对内存/文件等的分配数据块
只需要知道 文件头指定起始块和长度
位置/分配策略: 最先匹配,最佳匹配,…
优势: 文件读取表现好;高效的顺序和随机访问
缺点: 碎片;文件增长问题
类似数组的形式。
文件以数据块链表方式存储
文件头包含了到第一块和最后一块的指针
优势: 创建,增大,缩小很容易;没有碎片
劣势: 不可能进行真正的随机访问;可靠性
为每个文件创建一个名为索引数据块的非数据数据块(到文件数据块的指针列表)
文件头包含了索引数据块
优势: 创建,增大,缩小很容易;没有碎片;支持直接访问
劣势: 当文件很小时,存储索引的开销大;处理大文件难
两种索引:
早期Unix阶段的文件索引块:
可以看出如果文件容量小的很容易就能找到, 但是对于大容量的文件就非常麻烦, 对于性能及其数据块的开销等等都是有着很大的影响。
站在磁盘的角度, 我们需要对文件进行分配空闲空间块, 对于空闲空间块一定是从空闲的磁盘块中来的。 但是空闲的磁盘块他不是属于文件的,与此同时他还需要被文件系统管理起来(类比我不是你们公司的人, 但是我需要和你们公司合作, 所以需要遵守贵公司的规定,,., )
操作系统需要有效并且快速的将这些空闲的空间组织起来供文件系统去查找 及其分配等等 ,这些都是我们操作系统的文件系统需要去解决的问题。
11111101101110111
如果 i = 0表明数据块i 是空闲的, 反之是分配的
必须保存在磁盘上;
在内存和磁盘拷贝可能有所不同;
不允许block[i]在内存中的状态为bit[i]=1而在磁盘中bit[i]=0
解决:
在磁盘上设置bit[i] = 1;
分配block[i];
在内存中设置bit[i] = 1
通常磁盘通过分区来最大限度减小寻道时间:
分区: 硬件磁盘的一种适合操作系统指定格式的划分
卷: 一个拥有一个文件系统实例的可访问的存储空间
(通常常驻在磁盘的单个分区上)
各种磁盘管理技术;RAID levels: 不同RAID分类,
如RAID-0,RAID-1,RAID-5
在操作系统内核: 存储,卷管理; RAID硬件控制器(IO)
答 :我们将数据放在相对独立的硬盘里面, 每个硬盘可以相对独立的并行工作。 这样就可以实现数据并行的访问。
数据块分成多个子块, 存储在独立的磁盘中: 和内存交叉相似
通过更大的有效块大小来提供更大的磁盘带宽
可靠性成倍增长
读取性能线性增加(向两个磁盘写入,从任何一个读取)
数据块级磁带配有专用奇偶校验磁盘: 允许从任意一个故障磁盘中恢复
条带化和奇偶校验按byte-by-byte或者bit-by-bit: RAID-0,4,5: block-wise ;RAID-3: bit-wise
每个条带快有一个奇偶校验块,允许有一个磁盘错误
两个冗余块,有一种特殊的编码方式,允许两个磁盘错误
磁盘性能优化的另一个层面(一个是RAID上一章) :
通过重新组织IO的顺序来有效的减少磁盘的访问开销
平均旋转延迟时间 = 磁盘旋转一周时间的一半
对单个磁盘,会有一个IO请求数目
如果请求是随机的,那么会表现很差
虽然上述的FIFO是一种简洁的方式 ,但是它并不高效。 所以需要另一种方法 :
选择从磁臂当前位置需要移动最少的IO请求
总是选择最短寻道时间
磁臂先到达该方向上最后一个请求处,然后立即反转
还有很多其他的方式:
SSTF、SCAN、CSCAN等几种调度算法。这几种就自己网上查具体实现的方式。
这几种算法也就是解决了机械硬盘的访问读写慢的问题, 性能的差异解决。 想要从根本上解决问题, 那么就买SSD固态硬盘吧…..