操作系统-文件系统基础
Posted wwoo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统-文件系统基础相关的知识,希望对你有一定的参考价值。
- 什么是文件,以计算机硬盘为载体的存储在计算上的信息集合,可以是图片,文本,视频等。
- 什么是文件系统,
- 文件系统需要完成哪些功能, 实现用户对文件增删改查功能
文件的概念
- 文件的定义: 文件是操作系统的一个重要概念,文件是以计算机硬盘为计算机硬盘为载体的存储在计算上的信息集合,文件可以是文本文档,图片,程序等。
- 与进程的区别:在系统运行时,计算机以进程为基本单位进行资源的调度和分配(线程是CPU的最小调度单元); 而在用户进行输入,输出过程中,则是以文件为基本单位。
- 大多数的应用程序的输入都是通过文件来实现的,其输出页都保存在文件中,以便长期存储将来的访问。
- 当用户将文件用于应用程序的输入和输出时,还希望可以访问文件,修改文件,和保存文件,实现对文件的管理和维护,需要操作系统提供一个文件管理系统,操作系统的文件就是用于实现用户这些管理要求
文件的组成
- 概念: 首先文件需要有一块存储空间用于记录数据,其次由于操作系统管理的数据很多,因此需要对浙西诶数据进行划分,然后贴上标签,以便用于分类和索引,所以必定包含分类信息和索引信息,最后由于不同的用户对数据有不同的访问权限,因此文件必然包含访问权限的信息.
如下图为Mac上的文件属性, 类型,大小,位置(路径),权限,默认打开位置,时间,注释等.
文件中的内容:
- 数据项: 数据项是文件系统中最低级的数据组织形式,可以分为两种类型
- 基本数据项目: 用于描述一个对象的某种属性的一个值,如姓名,日期,证件号,是数据中可命名的最小逻辑单位,及原子数据, 一个对象具有多个属性. 如
class Person{ ..... }
- 组合数据项目: 由多个数据项组合
- 基本数据项目: 用于描述一个对象的某种属性的一个值,如姓名,日期,证件号,是数据中可命名的最小逻辑单位,及原子数据, 一个对象具有多个属性. 如
- 记录: 记录是一组相关的数据项的集合,用于描述对象在某方面的属性,如一名考生的报名记录包括考生姓名,出生日期,报考学好号码,生份证号码等一系列组成。
- 文件: 文件是指由创建者所定义的一组相关信息的集合,逻辑上可分为由结构文件和无结构文件, 在有结构文件中文件由一组相似记录组成,如某学校所有考生的报名信息,又称为记录式文件; 而无结构文件则被视为一个字符流,比如一个二进制的文件或者字符文件(纯text,binary),又称为流式文件。
- 数据项: 数据项是文件系统中最低级的数据组织形式,可以分为两种类型
文件可以是数字,字母或者是二进制代码,基本访问单元可以是字节,行或记录,文件可以长期存储于硬盘或其他二级存储器中,允许可控制的进程间共享访问,能够被组织成复杂的文件结构
文件的属性(File Attributtes)
- 名称: 文件名称为宜,以容易读区的形式保存
- 标识符: 标示文件系统内文件的唯一标签,通常为数字,是对人不能说的一种秘密,计算机内部约定的一组名称
- 类型: 被支持不同类型的文件系统所使用
- 位置: 指向设备和设备上文件的指针
- 大小: 文件当前的大小(用字节bit,字或块表示),也可以包含文件允许的最大值信息(如A,B,C盘)
- 保护: 对文件进行保护的访问信息,如 分组保护,家长权限保护游戏文件夹权限
时间日期和用户标示: 文件创建,上次修改和上次访问的相关信息,用于保护和跟踪文件的使用
所有的文件都保存在目录结构中(熟称文件夹),而目录结构保存在外存上,文件信息在需要时菜调入内存,通常目录条目包括文件的名称和唯一标示符,而标示符定义文件的其它属性
文件的基本操作
- 创建文件: 在系统中查找到空间,在目录中为文件创建条目,该条目记录文件名称,在文件系统中的位置及其它可能的信息
- 写入文件: 为了写文件,执行一个系统调用,指名文件名称和写入文件的内容,对于给定文件名称,系统搜索目录以查找文件位置。 系统必须为该文件维护一个写位置的指针,每当发生写操作时,便更新写指针。
- 读文件: 为了读文件,执行一个系统调用,知名文件名称和要读入文件的内存位置。一个进程通常只能对一个文件读或者写,因此当前操作位置可以作为每个进程当前文件位置的指针,读写都使用同一个指针,节省了空间,也降低了系统的复杂度
- 文件重定位(文件寻址): 按某条搜索目录,将当前位置设置为给定值,并且不会读写文件
- 删除文件: 先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
- 截断文件: 允许文件属性不变,并删除文件部分内容
文件的打开于关闭
- 在系统在首次使用文件时,使用
open
将指明文件的属性(如 rw+,path),从外存复制到打开文件表的一个表目中,并将该表目的索引(编号)返回给用户。操作系统维护一个包含所有打开文件信息的表
(打开文件表, open file table
), - 当用户要操作一个文件时,可以通过该表的一个索引指定文件,因此省略了搜索缓解,当文件不在使用时,进程可以关闭它,操作系统在打开表中删除这一条目。
- 大部分操作系统要求在文件使用之前就显示的被打开,操作
open
会根据文件名搜索目录,并将目录条目复制到打开文件表中.而open通常返回一个打开文件表中的一个条目的指针
,通过该指针(而非文件名)进行所有的I/O
操作,并简化步骤节省资源。 - 系统打开文件表的每个文件时,采用计数器记录了
open count
,在close
的时候减少count,当count为0的时候,文件将被回收; 若文件被修改过,则将文件写会外存,并将系统打开文件表中的相应条目删除,最后释放文件的文件控制块(File Control Bloc, FCB) - 综上,每个打开文件所关联的信息:
- 文件指针: 跟踪上次读写位置作为当前文件位置的指针,对于打开文的某个进程来说时唯一的,因此必须于磁盘文件属性分开保存 (类似游标)
- 文件打开计数: 多个进程只能同时打开一个文件,所以需要跟踪打开和关闭的数量,计数为0时,系统关闭文件,删除该条目。
- 文件的磁盘位置: 避免重复读取
- 访问权限: 每个进程打开文件时都需要有一个访问模式(create, read,write,add,rw),该信息保存在打开文件表中,以便操作系统能够允许或拒绝之后的
I/O
请求。
- 在系统在首次使用文件时,使用
文件的逻辑姐筽股
- 无结构文件(流式文件): 字节流,只能穷举访问。 字符流,管理简单,方便用户操作,基本单位信息操作不多的文件采用字符流的无结构方式,如源文件,目标代码文件等。
有结构文件:
- 顺序文件: 顺序记录, (顺序存储,链式存储)
- 索引存储: 索引表存储,指针指向文件
索引号 长度 指针 i m0 。。。 索引顺序文件: 索引和顺序结合的两种方式, 将顺序文件中所有的记录分为若干组,为顺序文件建立一张索引表,在索引表中为每组中的第一条记录建立一个索引项,其中含有该记录的关键字和指向该记录的指针。
索引表
键 逻辑地址pr An Qi 逻辑文件
姓名 其它属性 An Qi
直接文件或三裂文件(Hash File): 给定记录的
key
通过散列函数转换的键值直接决定了物理地址,这种映射结构不同于顺序文件或索引文件,没有顺序的特性,散列文件有很高的存储速度,但是容易起冲突,即不同的关键字三裂函数值相同。
目录结构
文件控制块和索引结点: 与进程管理一样,为了实现目录管理,操作系统引入了文件控制块的数据结构
- 文件控制块: FCB,存储文件控制信息的数据结构,实现
按名存取
,PCB的有序集合称为文件目录,一个FCB
就是一个文件目录项目,为了创建一个新的文件,系统将分配一个FCB
并放在文件目录中,称为目录项。 - FCB包含以下几个信息:
- 基本信息: 如文件名,文件的物理位置,文件的逻辑结构,文件的物理结构
- 存取控制信息: 如文件的权限等
- 使用信息: 如文件的建立时间,修改时间
- 索引结点:
- FCB 64B,盘块大小1KB,因此每个盘块中可以包含16个PCB。在UNIX中一个目录只有16B,其中14B是文件名,2B是i结点指针(索引)
- 存放在磁盘上的索引结点称为磁盘索引结点,UNIX中每个文件都有一个唯一的磁盘索引结点,包括以下几个方面
- 文件的主标识符: 拥有该文件的个人或小组的标示符
- 文件类型: 包括普通文件,目录文件和特别文件
- 文件存储权限: 各类用户对该文件的存取权限
- 文件物理地址: 每个索引结点中含有13个地址项,iaddr(0)~iaddr(12),他们可以直接或者间接给出数据文件所在盘块的编号
- 文件长度,以字节为单位
- 文件链接计数
- 文件存取时间
- 文件被打开的时候又新增了一下内容
- 索引结点编号: 用于表示内存索引结点
- 状态: 只是i结点是否上锁或者修改
- 访问计数器: +/-1
- 逻辑设备号: 文件所属文件系统的逻辑设备号
- 链接指针: 设置分别指向空闲表和三裂队列的指针
- 文件控制块: FCB,存储文件控制信息的数据结构,实现
目录结构
- 搜索,创建文件,删除文件,显示文件,修改目录
- 单级目录结构: 整个文件系统中只建立一张目录表
- 两级目录结构
- 多集目录结构
- 无环图目录结构,如快捷共享,可能一个文件被多处引用,如快捷方式,不便于管理,容易出错,方便共享
文件共享
- 基于索引结点的共享方式(硬链接)
- 利用符号链接实现文件共享(软链接)
文件保护
- 访问类型: w,r,+,-,file list
- 访问控制: Access Control
- User
- Group
- Other: 口令和密码 ,
文件系统的实现
常见的文件系统有FAT32,NTFS,ext2,ext3,ext4 ...
文件系统层次结构
由上至下依次执行
- 用户调用接口, a/d/s/u
- 文件目录系统: PCB查找
- 存取控制验证模块: PCB访问权限检查
- 逻辑文件系统与文件信息缓冲区:
- 逻辑文件系统与文件信息缓冲区的主要功能是,根据文件的逻辑结构将用户要读写的逻辑记录转换为文件逻辑结构内的相应块号
- 物理文件系统:
- 把逻辑记录所在的相对块号转换成实际的物理地址
- 辅助分配模块,分配辅助空间和回收辅存空间
- 设备管理程序模块
- 设备管理程序模块的主要功能是分配设备,分配设备读写缓冲区,磁盘调度,启动设备,处理设备中断,释放设备读写缓冲区,释放设备等。
目录实现
- 线性表
- 哈希表
文件的实现
- 分配方式
- 连续分配: 顺序链表
- 链接分配: 链式存储
- 索引分配
- 链接方案: 一个索引块通常称为一个磁盘块,因此它本身能直接读写,为了处理大文件,可以将多个索引块链接起来
- 多层索引
- 混合索引
- 文件存储空间管理
- 文件存储空间的划分与初始化
- 文件存储器空间管理, 文件存储设备分为许多大小相同的物理块,并以块为单位交换信息。空闲块的组织,分配与回收
- 空闲表法:属于连续分配方式,与动态内存类似,同样可以使用 首次适应算法,循环首次算法。
- 空闲链表法: 空闲块被组成一个链表,回收的空间插入链尾
- 位图表示法: 采用一个二进制位来表示磁盘块的使用情况
- 扫描位图,找出其值为0的二进制位
- 查找块号 b=n(i-1)+j (块号=每行的位数(行数-1)+j列)
- 位图修改: m[i,j] = 1
- 回收块号,下标从0开始
i = (b-1)DIV n + 1
j = (b-1)MOD n + 1 - 修改位图
map[i,j]=0
- 成组链接法: 减少链表的长度,兼容大型的文件系统
磁盘的组织管理
- Disk: 是由表面涂油磁性物质的金属或塑料构成的原型盘片,通过一个称为磁头的导线圈从磁盘存取数据,在读写操作期间,磁头固定,磁盘在下面高速旋转,磁盘面上的数据存储在一组同心圆中,称为磁道,一个盘面上有上千个磁道,磁道又划分为几百个扇区,每个扇区固定存储大小,通常为(512M),相邻的扇区和磁道存在一定的空隙,避免精度误差, 从外到里越来越密集,受限于内道最大记录的密度
- 磁盘安装在一个驱动上: 由磁头臂,用于旋转磁盘的主轴和用于输入和输出的电子设置组成,多个盘面堆叠,组成磁盘组,每个盘片对应一个磁头,所有磁头固定在一起,与磁盘中心的距离相同且一起移动
- 概念
磁头(head)
磁道(track)
柱面(cylinder)
扇区(sector)
圆盘(platter)
磁盘调度算法:
TODO:
以上是关于操作系统-文件系统基础的主要内容,如果未能解决你的问题,请参考以下文章
[vscode]--HTML代码片段(基础版,reactvuejquery)
为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?
我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段
我的Android进阶之旅关于Android平台获取文件的mime类型:为啥不传小写后缀名就获取不到mimeType?为啥android 4.4系统获取不到webp格式的mimeType呢?(代码片段