Lab8:文件系统
文件系统的概念
文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能
文件是具有符号名,由字节序列构成的数据项集合
文件系统的功能
- 分配文件磁盘空间
- 管理文件块(位置和顺序)
- 管理空闲空间
- 分配算法
- 管理文件集合
- 定位:文件及其内容
- 命名:通过名字找到文件
- 文件系统结构:文件组织方式
- 数据可靠和安全
- 安全:多层次保护数据安全
- 可靠:持久保存文件,避免系统崩溃、媒体错误、攻击等
文件属性:名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间
文件头:文件系统元数据中的文件信息
- 文件属性
- 文件存储位置和顺序
文件描述符
- 文件访问模式
进程访问文件数据前必须先“打开”文件
- 内核跟踪进程打开的所有文件
操作系统为每个进程维护一个打开文件表,文件描述符是打开文件的标识
操作系统在打开文件表中维护的打开文件状态和信息
- 文件指针
最近一次读写位置,每个进程分别维护自己打开的文件指针
- 文件打开计数
当前打开文件的次数,最后一个进程关闭文件时,将其从打开文件表中移除
- 文件的磁盘位置
缓存数据访问信息
- 访问权限
每个进程的文件访问模式信息
文件的用户视图和系统视图
- 文件的用户视图
持久的数据结构
- 系统访问接口
字节序列的集合,系统不关心存储在磁盘上的数据结构
- 操作系统的文件视图
数据块的集合,数据块是逻辑存储单元,而扇区是物理存储单元
用户视图到系统视图的转换
- 进程读文件
获取字节所在的数据块,返回数据块内对应内容
- 进程写文件
获取数据块,修改数据块的对应部分,写回数据块
访问模式:
- 顺序访问: 按字节依次读取
- 随机访问: 从中间读写
- 索引访问: 依据数据特征索引
文件内部结构
- 无结构
单词和字节的序列
- 简单记录结构
分列、固定长度和可变长度
- 复杂结构
格式化文档、可执行文件等
文件系统种类
分层文件系统
文件以目录的方式组织起来
目录是一类特殊的文件,目录的内容是文件索引表<文件名, 指向文件的指针>
目录实现
文件名的线性列表,包涵了指向数据块的指针
哈希表 – 哈希数据结构的线性表
文件别名
- 硬链接: 多个文件项指向一个文件
- 软链接: 以“快捷方式”指向其他文件
种类
- 磁盘文件系统
- 数据库文件系统
- 日志文件系统
- 网络/分布式文件系统
- 特殊/虚拟文件系统
文件系统的实现
分层结构
- 虚拟(逻辑)文件系统(VFS, Virtual File System)
对所有不同文件系统的抽象,提供相同的文件系统接口,管理所有文件和文件系统关联的数据结构,与特定的文件模块进行交互
文件系统基本数据结构
文件卷控制块 (Unix: “superblock”)
- 每个文件系统一个
- 文件系统详细信息
- 块、块大小、空余块、计数/指针等
文件控制块(Unix: “vnode” or “inode”)
- 每个文件一个
- 文件详细信息
- 访问权限、拥有者、大小、数据块位置等
目录项 (Linux: “dentry”)
- 每个目录项一个(目录和文件)
- 将目录项数据结构及树型布局编码成树型数据结构
- 指向文件控制块、父目录、子目录等
文件系统的存储结构
文件系统数据结构
- 卷控制块 (每个文件系统一个)
- 文件控制块 (每个文件一个)
- 目录节点(每个目录项一个)
持久存储在外存中
- 存储设备的数据块中
当需要时加载进内存
- 卷控制模块 : 当文件系统挂载时进入内存
- 文件控制块: 当文件被访问时进入每次
- 目录节点: 在遍历一个文件路径时进入内存
数据块缓存
- 数据块按需读入内存
提供read()操作
预读: 预先读取后面的数据块
- 数据块使用后被缓存
假设数据将会再次用到
写操作可能被缓存和延迟写入
- 两种数据块缓存方式
数据块缓存
页缓存: 统一缓存数据块和内存页
页缓存
- 虚拟页式存储
在虚拟地址空间中虚拟页面可映射到本地外存文件中
- 文件数据块的页缓存
在虚拟内存中文件数据块被映射成页,文件的读/写操作被转换成对内存的访问,可能导致缺页和/或设置为脏页
文件分配
连续分配
文件头指定起始块和长度
分配策略:最先匹配, 最佳匹配
文件读取表现好,高效的顺序和随机访问
链式分配
文件以数据块链表方式存储
文件头包含了到第一块和最后一块的指针
创建、增大、缩小很容易,没有碎片
索引分配
为每个文件创建一个索引数据块,指向文件数据块的指针列表,文件头包含了索引数据块指针
创建、增大、缩小很容易,没有碎片,支持直接访问
(续
Lab8:文件系统的更多相关文章
- ucore lab8 文件系统 学习笔记
最后一战果然过瘾.代码量够多,新机制够复杂度,都管饱.做这一课就像从高山上往下走,坡急且路险,还不知自己的方位,琢磨不透系统的架构.待到下了山,回头一看豁然开朗,原来方才自己所下的山是这般模样.在这里 ...
- 《Tsinghua os mooc》第21~22讲 文件系统
第二十一讲 文件系统 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能. 组织.检索.读写访问数据 大多数计算机系统都有文件系统 Google 也是一个文件系统 文件是具有符号名,由 ...
- 操作系统:ucore的部分Bug&挑战练习
ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...
- UCore-Lab0
日期:2019/3/31 内容:UCore-Lab0 一.UCore实验 实验 说明 关键词 Lab1 bootloader的实现 中断 Lab2 物理内存管理 x86分段/分页模式 Lab3 虚拟内 ...
- 《ucore lab8》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 练习1: 完成读文件操作的实现(需要编码) 题目 首先了解打开文件的处理流程,然后参考本实验后续的文件读写操作的过程分析,编写在sfs_inod ...
- MIT 6.S081 聊聊xv6中的文件系统(上)
前言 Lab一做一晚上,blog一写能写两天,比做Lab的时间还长( 这篇博文是半夜才写完的,本来打算写完后立刻发出来,但由于今天发现白天发博点击量会高点,就睡了一觉后才发(几十的点击量也是点击量啊T ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- Linux学习之探索文件系统
Linux,一起学习进步- ls With it, we can see directory contents and determine a variety of important file ...
- Linux之搭建自己的根文件系统
Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...
随机推荐
- Linux下mqttServer搭建
1.apache-apollo 创建服务 tar -zxvf apache-apollo-1.7-unix-distro.tar.gz cd /home/bk/apache-apollo-/bin . ...
- 浏览器安装Tampermonkey(俗称油猴子插件),实现免费观看Vip视频、免费下载付费资源等……
应用场景 说起浏览器,本人常用google,谷歌浏览器,速度快,里面有很多插件,可以实现用户百度云盘下载限制,破解vip视频.百度广告屏蔽,视频广告的屏蔽,百度网盘资源直接下载等实用功能.今天就来分享 ...
- shell基本运算符(五)
shell支持多种运算符,包括:算术运算符.关系运算符.布尔运算符.字符串运算符.文件测试运算符. 注意:条件表达式要放在方括号之间,并且要有空格,eg:[$a==$b] 是错误的,必须写成 [ $a ...
- 21.Linux系统服务之大坑
1.CentOS6启动流程 2.CentOS7启动流程 3.C6和C7的区别 4.运行级别C6&C7 0 关机 1 单用户模式 (超级权限 必须面对实体硬件) 2 暂未使用 3 字符界面(黑框 ...
- spring security原理-学习笔记1-整体概览
整体概述 运行时环境 Spring Security 3.0需要Java 5.0 Runtime Environment或更高版本. 核心组件 SecurityContextHolder,Securi ...
- JS单例对象与构造函数对象的区别
JavaScript对象有几种: 内置对象如Global,Math对象等等. 本地对象如Object.Function.Array.String.Boolean.Number.Date.RegExp. ...
- Java中常用的四种线程池
在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例,如何使用参见之前的文章Java线程池构造参数详解.不过,在Executors类中,为我们提供了常用线程 ...
- java代码实现MD5加密及验证方法
MD5加密 在我们的程序中,不管是什么,都会有安全问题,今天就说的是MD5加密的方法 MD5是哈希算法,也就是 从明文A到密文B很容易,但是从密文B到明文A几乎不可能 也就是说,给你密文,是几乎无法通 ...
- git jenkins SonarQube手动代码质检
SonarQube代码质检:1.提交代码-->gitlab-->jenkins抓取-->sonarqube质量检测-->maven编译-->shell-->web集 ...
- 用最简单的方式学Python单链表
Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...