清华大学《操作系统》(二十二):文件系统

文件系统和文件:

  • 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能,组织、检索、读写访问数据。
  • 文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件的标识符号。

文件系统功能:

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

文件属性:

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

文件描述符:

文件访问方式:进程访问文件数据前必须先打开文件

内核跟踪进程打开的所有文件:操作系统为每个进程维护一个打开文件表,文件描述符是打开文件的标识,即 文件描述符是操作系统在打开文件表中维护的打开文件状态和信息,其中包括:

  • 文件指针:a. 最近一次读写位置;b.每个进程分别维护自己的打开文件指针 
  • 文件打开计数:a. 被打开文件当前被打开的次数,b. 最后一个进程关闭文件时,将其从打开文件表中移除
  • 文件磁盘位置:缓存数据访问信息 
  • 访问权限:a. 每个进程的文件访问模式(只读、可写等)

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

  • 文件的用户视图:持久的数据结构
  • 系统访问接口:a.字节序列的集合(UNIX);b. 系统不关心存储在磁盘上的数据结构,应用程序应该关心。
  • 操作系统内部视角 :a.数据块的集合,b.块是逻辑存储单元,而扇区是物理存储单元,c. 块大小与扇区大小可以不相等,通常是几个扇区构成一个数据块

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

  • 进程读文件:a. 获取字节所在的数据块,b. 返回数据块内对应内容
  • 进程写文件:a. 获取数据块,b. 修改数据块中对应内容,c. 写回数据块
  • 文件系统中的基本操作单位是数据块

访问模式:

  • 顺序访问:按字节顺序一次读取(大多数)
  • 随机访问:从中间读写(不常用,但很重要,比如虚拟内存中把内存页存储在文件)
  • 索引访问:依据数据特征索引,操作系统通常不提供文正索引访问,可以在上面建数据库,数据块建立索引内容

文件内部的结构(操作系统不关心):应用系统打开复杂文件,但对操作系统该文件可能很简单 

  • 无结构:单词、字节的队列 
  • 简单记录结构:列,固定/可变长度 
  • 复杂结构:格式化文档(MS Word, PDF),可执行文件

文件共享和访问控制:

  • 多用户系统中文件共享是很必要的,需要对访问进行控制:a. 每个用户能够获得哪些文件的哪些访问权限,b. 访问模式:读、些、执行、删除、列表等
  • 操作系统维护文件访问控制列表(ACL):a. 每个文件每个用户有哪些权限 <用户|组|所有人, 读|写|可执行>,b. 用户识别ID,识别用户,表明每个用户所允许的权限及保护模式,c. 组识别ID,允许用户组成组,指定组访问权限

语义一致性:

  • 规定多进程如何同时访问共享文件:a. 与同步算法相似:b. 因磁盘I/O和网络延迟而设计简单
  • 1.Unix文件系统(UFS)语义(将一致性问题甩给应用程序去处理):a. 对打开文件的写入内容立即对其他打开同一文件的其他用户可见,b. 共享文件指针允许多用户同时读取和写入文件
  • 2.会话语义:a. 写入内容只有当文件关闭时可见
  • 3.读写锁

目录:

文件以目录的形式组织起来,目录是一类特殊的文件,目录的内容是文件索引表<文件名,指向文件的指针>,目录和文件是树状结构。

目录的操作:搜索,创建,删除,枚举,重命名,在文件系统中遍历一个路径 

目录实现:

  • 文件名的线性列表,包含指向数据块的指针,编程简单,执行耗时
  • 哈希表,搜索快速,引起冲突,长度固定

文件别名:

硬链接与软链接:

  • 硬链接:多个文件项指向一个文件,删除到最后一个指向他的文件名时删除实体
  • 软链接:以快捷方式指向其他文件,删除快捷方式不影响实体,删除实体则快捷方式无效了

文件目录中的循环:

 

 避免方式:

  • 只允许到文件的链接,不允许到目录的链接
  • 增加链接时,用循环检测算法确定是否合理
  • 实际操作系统中通常限制路径可遍历文件目录的数量,超过指定长度停止检索

名字解析(路径遍历):

名字解析即把逻辑名字转换成物理资源,有两种方式:

  1. 依据路径名,在文件系统中找到实际文件位置,
  2. 进程设置当前工作目录,从工作目录开始往下解析,用相对路径代替绝对路径
  3. 例子:解析“/bin/ls”:读取根目录的文件头;读取根目录的数据块,搜索"bin“项;读取bin的文件头;读取bin的数据块,搜索"ls"项;读取ls的文件头。

文件系统挂载:

文件系统需要先挂载才能被访问,未挂载的文件系统被挂载到挂载点上才能被找到。

文件系统种类:

  1. 磁盘文件系统:a. 文件存储在数据存储设备上,如磁盘,b. 例如:FAT、NTFS、ext2/3,ISO9660等
  2. 数据块文件系统:a. 文件特征可悲寻址,b. 例如WinFS
  3. 日志文件系统:a. 记录文件系统的修改/事件
  4. 网络/分布式文件系统:a. 例如:NFS,SMB,AFS,GFS。 b. 文件可以通过网络被共享,文件位于远程服务器,客户端远程挂载服务器文件系统,标准系统文件访问被转换成远程访问,要有标准文件共享协议。c. 面临更多挑战,例如客户端用户辨别、一致性问题、错误处理模式。

文件系统的实现

分层结构:虚拟文件系统(VFS,Virtual File System)、特定文件系统模块

虚拟文件系统:

虚拟文件系统的提出是为了面对多种不同的文件系统对上提供一种统一的接口。

目的:
        1.对所有不同文件系统的抽象

 功能:
        1.提供相同的文件和文件系统接口(对上)

        2.管理所有文件和文件系统关联的数据结构

        3.高效查询历程,遍历文件系统

        4.与特定文件系统模块的交互(对下)

文件系统基本数据结构:

1.文件卷控制块(Unix:superblock)

             a. 每个文件系统一个

             b. 文件系统详细信息

             c. 块、块大小、空余块、计数/指针等

2.文件控制块(Unix:vnode || inode)

             a. 每个文件一个

             b. 文件详细信息

             c. 访问权限、拥有者、大小、数据块位置等

3.目录项(Linux:dentry)

             a. 每个目录项一个(目录和文件)

             b. 将目录项数据结构及树形布局编码成树形数据结构

             c. 指向文件控制块、父目录、子目录等

上述数据结构需要持久存储在外存中,当需要时加载进内存:

        1.卷控制块:当文件系统挂载时进入内存;

        2.文件控制块:当文件被访问时加载进内存

        3.目录项:便利一个文件路径时进入内存

文件缓存与打开文件: 

         多个位置都存在磁盘缓存,操作系统主要讨论内存中的数据块缓存。

数据块缓存:

1.数据块按需存入内存

            a. 提供read()操作

            b. 预读:预先读取后面的数据块

2.数据块使用后被缓存

            a. 假设数据将会再次用到

            b. 写操作可能被缓存和延迟写入

3.两种数据块缓存方式

            a. 数据块缓存

            b. 页缓存:同一缓存数据块和内存页

打开文件的数据结构:

          每个被打开的文件都有一个文件描述符,包含了文件状态信息:目录项、当前文件指针、文件操作设置等

          每个进程管理一个进程打开文件表,系统还维护一个系统级的打开文件表,有文件打开时,文件卷就不能被卸载。

打开文件锁

有了打开文件表,文件系统可以提供打开文件锁,用于协调多进程的文件访问:

         1.强制:根据锁保持情况和访问需求确定是否拒绝访问

         2.劝告:进程可以查找锁的状态来决定怎么做

文件大小:

        大多数文件都很小:

            a. 需要对小文件提供很好的支持

            b. 块空间不能太大

        一些非常大的文件

            a. 必须支持大文件(64位文件偏移)

            b. 大文件访问必须高效

文件分配:

        本质是如何表示分配给一个文件数据块的位置和顺序

        分配方式:

           a. 连续分配:

               文件头指定起始块和长度

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

               优点是文件读取表现好,高效的顺序和随机访问,缺点是碎片,文件增长问题,文件增大时的策略比较棘手

           b. 链式分配:

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

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

               优点是创建、增大、缩小都很容易,没有碎片,但是随机访问无法实现,效率低。可靠性较差,一个链被破坏,后面的数据块就丢失了。

           c. 索引分配:

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

               文件头包含了索引数据块指针

               优点是创建、增大、缩小容易,没有碎片,支持直接访问,缺点是文件很小时,存储索引开销大,大文件索引块可能大小不够。

        指标:

           a. 存储效率:外部碎片等

           b. 读写性能:访问速度

        实际文件系统中通常几种方式组合应用,例如对大文件索引块使用链表组织,多级索引。

空闲空间管理:

          空闲空间管理是指跟踪记录文件卷中未分配的数据块。

空闲空间组织方式:

         1.位图法:使用简单,但大磁盘需要一个很大的向量表记录空闲空间。

         2.链表法

         3.链式索引

典型的磁盘文件系统组织

分区:硬盘磁盘的一种适合操作系统指定格式的划分 

文件卷:一个拥有一个文件系统实例的可访问的外存空间 

冗余磁盘阵列RAID:

         希望使用多磁盘改善吞吐量、可靠性和可用性,以提高性能。如RAID0,RAID1,RAID4。

冗余磁盘阵列的实现:

         1.软件:操作系统内核的文件卷管理

         2.硬件:RAID硬件控制器(I/O)

RAID0(磁盘条带化):
         把数据块分成多个子块,存储在独立的磁盘中,通过独立磁盘上并行访问数据块提供更大的磁盘带宽

RAID1(磁盘镜像):
        同时向两个磁盘写入相同的数据,可靠性成倍增长,读取性能线性提升

RAID4(带校验的磁盘条带化):
         数据块级的磁盘条带化加专用奇偶校验磁盘,一个磁盘专用于奇偶校验,允许只有一个磁盘发生故障时进行数据恢复

RAID5(带分布式校验的磁盘条带化):
        数据块的校验和不单独存放在固定的一个磁盘中,而是分布在多个磁盘中,减少对RAID4中奇偶校验磁盘的读写压力

RAID6(每组条带有两个冗余块),允许两个磁盘出错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

python将字符串写入csv_用Python将字符串值写入CSV文件

我有一个很大的数据集&#xff0c;在第二列有句子和他们的情绪状态。我开发了代码来将它们读作numpy数组。我需要的是&#xff0c;如果一个句子的情感是中性的&#xff0c;那么返回为真&#xff0c;否则返回假。if-else条件返回的每个结果都应写入CSV文件。但是这里它只在CSV文…

加载静态文件,父模板的继承和扩展

用url_for加载静态文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 从static文件夹开始寻找可用于加载css, js, image文件继承和扩展把一些公共的代码放在父模板中&#xff0c;避免每个模板写同样的内容。base.html子模板继…

清华大学《操作系统》(二十三):I/O子系统

常见设备接口类型&#xff1a; 1、字符设备&#xff1a;键盘鼠标、串口 a.以字节为单位顺序访问 b.I/O命令通常使用文件访问接口和语义 2、块设备&#xff1a;磁盘、磁带、光驱 a.均匀的数据块访问 b.I/O命令通常使用文件系统接口&#xff0c;也可以使用内存映射访问 3、网络…

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK&#xff1f; 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口&#xff0c;您能够通过该套接口实现主要的地图功能&#xff0c;而且能够定制地图样式&#xff0c;实现个性化地图。 该接口提供下面功能&#xff…

mysql读写分离_MySQL基于amoeba读写分离实验

主从复制只是一个同步数据的方式读写分离&#xff1a;只在主的上面写&#xff0c;只在从的上面读读写分离方案&#xff1a;【1】基于程序代码内部 (生产环境中应用最广泛&#xff0c;性能最好&#xff0c;需要开发人员来实现)【2】基于中间代理层的实现amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所谓Django models模型&#xff0c;是指的对数据库的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在这里的意思是通过models&#xff0c;将数据库的借口抽象成python自己的一个类。然后在python Django框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的机制&#xff0c;在当前页使用MasterPage的情况下&#xff0c;放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找&#xff0c;原因何在&#xff1f;MSDN对FindControl的解释&#xff1a;在当前的命名容器…

ATT汇编语言与GCC内嵌汇编简介

AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 GCC内嵌汇编 2.1简介 2.2内嵌汇编举例 2.3语法 2.3.1汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破…

Python内存管理以及垃圾回收机制

垃圾回收&#xff1a;用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表&#xff0c;这个链表就比较厉害了&#xff0c;因为Python程序中一旦创建对象都会把这个对象添加到refchain这个链表中。也就是说他…

pythonfillcolor_openpyxl 填充颜色(单元格)

如果需要填充某个单元格的颜色需要3步&#xff1a;# 1-加载库文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一个工作簿wb Workbook()ws wb.active#随便赋个值d4 ws[D4]d4 43d4.value#3-设置样式&#xff0c;并且加载到对应单元格fill …

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

bug说明&#xff1a; Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 &#xff0c;在ios设备中滑动会触发点击事件&#xff1b; 解决方法&#xff1a; 我是按需引入&#xff0c;去项目中找到loadmore下的index.js&#xff0c;全部引入的要找mint下面mint-u…

【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的开源Web控件&#xff0c;包含有丰富的Ajax运用&#xff0c;其前身是Coolite。 下载地址&#xff1a;http://www.ext.net/download/ 示例地址&#xff1a;http://examples.ext.net/ 1.首先下载Ext.Net,地…

面试之操作系统

基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序&#xff0c;而并行则指同一时刻能运行多个指令。并行需要硬件支持&#xff0c;如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程&#xff0c;使得程序能够并发运行。 2. 共享 共享是指…

mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

在上一期图解 图解MySQL | MySQL DDL为什么成本高&#xff1f;中&#xff0c;我们介绍了&#xff1a;传统情况下&#xff0c;为表添加列需要对表进行重建腾讯团队为 MySQL 引入了 Instant Add Column 的方案(以下称为 "立刻加列" 功能)可以快速完成 为表添加列 的任务…

GCC for Win32开发环境介绍

GCC for Win32开发环境介绍(1) 第一章 在视窗操作系统下的GCC 第一节GCC家族概览 GCC是一个原本用于Unix-like系统下编程的编译器。不过&#xff0c;现在GCC也有了许多Win32下的移植版本。所以&#xff0c;也许对于许多Windows开发者来说&#xff0c;GCC还是一个比较陌生的东西…

包装函数

function wrap(object,method,wrapper){ //object:包装方法所属对象 method:方法名 wrapper:替换函数var fn object[method];return object[method] function(){return wrapper.apply(this,[fn.bind(this)].concat(Array.prototype.slice.call(arguments)));}; } 转载于…

JAR——pinyin4j-2.5.0

简介&#xff1a;将中文转为拼音&#xff1b; 使用&#xff1a; 123//返回的是字符串String pinyin[] PinyinHelper.toHanyuPinyinStringArray(chinese);//eg:你----ni3本文转自wauoen51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/7183397/1605894&#…

Android高效加载大图、多图解决方案,有效避免程序OOM

http://blog.csdn.net/guolin_blog/article/details/9316683转载于:https://www.cnblogs.com/jianglijs/p/7827524.html

Flask 上下文源码解析

简单来说&#xff0c;上下文包括request_ctx(封装了request和session),app_request(封装了app和g)&#xff0c;两个ctx都储存在一个叫做Local的数据结构中&#xff0c;这个结构的作用就是会自动根据不同的线程id返回对应的数据&#xff0c;然后通过一个叫做 LocalStark 的结构把…