文件系统的概念

文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能

文件是具有符号名,由字节序列构成的数据项集合

文件系统的功能

  1. 分配文件磁盘空间
  • 管理文件块(位置和顺序)
  • 管理空闲空间
  • 分配算法
  1. 管理文件集合
  • 定位:文件及其内容
  • 命名:通过名字找到文件
  • 文件系统结构:文件组织方式
  1. 数据可靠和安全
  • 安全:多层次保护数据安全
  • 可靠:持久保存文件,避免系统崩溃、媒体错误、攻击等

文件属性:名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间
文件头:文件系统元数据中的文件信息

  1. 文件属性
  2. 文件存储位置和顺序

文件描述符

  • 文件访问模式

进程访问文件数据前必须先“打开”文件

  • 内核跟踪进程打开的所有文件

操作系统为每个进程维护一个打开文件表,文件描述符是打开文件的标识


操作系统在打开文件表中维护的打开文件状态和信息

  • 文件指针

最近一次读写位置,每个进程分别维护自己打开的文件指针

  • 文件打开计数

当前打开文件的次数,最后一个进程关闭文件时,将其从打开文件表中移除

  • 文件的磁盘位置

缓存数据访问信息

  • 访问权限

每个进程的文件访问模式信息

文件的用户视图和系统视图

  • 文件的用户视图

持久的数据结构

  • 系统访问接口

字节序列的集合,系统不关心存储在磁盘上的数据结构

  • 操作系统的文件视图

数据块的集合,数据块是逻辑存储单元,而扇区是物理存储单元

用户视图到系统视图的转换

  • 进程读文件

获取字节所在的数据块,返回数据块内对应内容

  • 进程写文件

获取数据块,修改数据块的对应部分,写回数据块

访问模式

  1. 顺序访问: 按字节依次读取
  2. 随机访问: 从中间读写
  3. 索引访问: 依据数据特征索引

文件内部结构

  1. 无结构

单词和字节的序列

  1. 简单记录结构

分列、固定长度和可变长度

  1. 复杂结构

格式化文档、可执行文件等

文件系统种类

分层文件系统

文件以目录的方式组织起来

目录是一类特殊的文件,目录的内容是文件索引表<文件名, 指向文件的指针>

目录实现

  • 文件名的线性列表,包涵了指向数据块的指针

  • 哈希表 – 哈希数据结构的线性表

文件别名

  • 硬链接: 多个文件项指向一个文件
  • 软链接: 以“快捷方式”指向其他文件

种类

  • 磁盘文件系统
  • 数据库文件系统
  • 日志文件系统
  • 网络/分布式文件系统
  • 特殊/虚拟文件系统

文件系统的实现

分层结构

  • 虚拟(逻辑)文件系统(VFS, Virtual File System)

对所有不同文件系统的抽象,提供相同的文件系统接口,管理所有文件和文件系统关联的数据结构,与特定的文件模块进行交互

文件系统基本数据结构

文件卷控制块 (Unix: “superblock”)

  • 每个文件系统一个
  • 文件系统详细信息
  • 块、块大小、空余块、计数/指针等

文件控制块(Unix: “vnode” or “inode”)

  • 每个文件一个
  • 文件详细信息
  • 访问权限、拥有者、大小、数据块位置等

目录项 (Linux: “dentry”)

  • 每个目录项一个(目录和文件)
  • 将目录项数据结构及树型布局编码成树型数据结构
  • 指向文件控制块、父目录、子目录等

文件系统的存储结构

文件系统数据结构

  • 卷控制块 (每个文件系统一个)
  • 文件控制块 (每个文件一个)
  • 目录节点(每个目录项一个)

持久存储在外存中

  • 存储设备的数据块中

当需要时加载进内存

  • 卷控制模块 : 当文件系统挂载时进入内存
  • 文件控制块: 当文件被访问时进入每次
  • 目录节点: 在遍历一个文件路径时进入内存

数据块缓存

  • 数据块按需读入内存

提供read()操作
预读: 预先读取后面的数据块

  • 数据块使用后被缓存

假设数据将会再次用到
写操作可能被缓存和延迟写入

  • 两种数据块缓存方式

数据块缓存
页缓存: 统一缓存数据块和内存页

页缓存

  • 虚拟页式存储

在虚拟地址空间中虚拟页面可映射到本地外存文件中

  • 文件数据块的页缓存

在虚拟内存中文件数据块被映射成页,文件的读/写操作被转换成对内存的访问,可能导致缺页和/或设置为脏页

文件分配

连续分配

文件头指定起始块和长度

分配策略:最先匹配, 最佳匹配

文件读取表现好,高效的顺序和随机访问

链式分配

文件以数据块链表方式存储

文件头包含了到第一块和最后一块的指针

创建、增大、缩小很容易,没有碎片

索引分配

为每个文件创建一个索引数据块,指向文件数据块的指针列表,文件头包含了索引数据块指针

创建、增大、缩小很容易,没有碎片,支持直接访问

(续

Lab8:文件系统的更多相关文章

  1. ucore lab8 文件系统 学习笔记

    最后一战果然过瘾.代码量够多,新机制够复杂度,都管饱.做这一课就像从高山上往下走,坡急且路险,还不知自己的方位,琢磨不透系统的架构.待到下了山,回头一看豁然开朗,原来方才自己所下的山是这般模样.在这里 ...

  2. 《Tsinghua os mooc》第21~22讲 文件系统

    第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...

  3. 操作系统:ucore的部分Bug&挑战练习

    ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...

  4. UCore-Lab0

    日期:2019/3/31 内容:UCore-Lab0 一.UCore实验 实验 说明 关键词 Lab1 bootloader的实现 中断 Lab2 物理内存管理 x86分段/分页模式 Lab3 虚拟内 ...

  5. 《ucore lab8》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1: 完成读文件操作的实现(需要编码) 题目 首先了解打开文件的处理流程,然后参考本实验后续的文件读写操作的过程分析,编写在sfs_inod ...

  6. MIT 6.S081 聊聊xv6中的文件系统(上)

    前言 Lab一做一晚上,blog一写能写两天,比做Lab的时间还长( 这篇博文是半夜才写完的,本来打算写完后立刻发出来,但由于今天发现白天发博点击量会高点,就睡了一觉后才发(几十的点击量也是点击量啊T ...

  7. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  8. Linux学习之探索文件系统

    Linux,一起学习进步-    ls With it, we can see directory contents and determine a variety of important file ...

  9. Linux之搭建自己的根文件系统

    Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...

随机推荐

  1. vue实现简单学生信息管理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. c#菜单动态合并

    说明 在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单.开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并.这是如何实现的呢?本例实现了将两个弹出 ...

  3. 聊聊缓存淘汰算法-LRU 实现原理

    前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...

  4. 音视频入门-11-PNG文件格式详解

    * 音视频入门文章目录 * PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节 ...

  5. ExtJs 扩展类CheckColumn修改源码,支持按条件禁用启用下拉框功能

    长话短说,具体的请看图 需求如图: 修改CheckColumn.js源码,添加鼠标点击改变事件 完整JS脚本 Ext.ns('Ext.ux.grid'); Ext.ux.grid.CheckColum ...

  6. 自定义表头Datagrid

    自定义的一个表头 <bp:BasePage x:Class="NetReform.Pages.RealProbabiTableCompare" xmlns="htt ...

  7. 像使用SQL一样对List对象集合进行排序

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...

  8. MyBatis与Spring的整合实例详解

    从之前的代码中可以看出直接使用 MyBatis 框架的 SqlSession 访问数据库并不简便.MyBatis 框架的重点是 SQL 映射文件,为方便后续学习,本节讲解 MyBatis 与 Spri ...

  9. 解决SAP740 GUI 搜索帮助(F4)回填值乱码的问题

    SAP 740客户端引入了搜索帮助增强功能,并且默认是开启该功能的,在带有F4搜索帮助的字段输入框中输入字段的前两个字符,可以自动以下拉框的方式带出包含包含所输入字符的条目,从而实现快速的输入帮助,如 ...

  10. 重邮二进制群-pwn1

    给学弟们练手的题目,做的过程中接触一些基本概念 #include <stdio.h> #include <unistd.h> int main() { ]; welcome() ...