【操作系统/OS笔记20】打开文件、文件数据块分配、空闲空间管理、多磁盘管理(RAID)、磁盘调度算法概述
本次笔记内容:
12.12 打开文件的数据结构
12.13 文件的分配
12.14 空闲空间列表
12.15 多磁盘管理-RAID
12.16 磁盘调度
文章目录
- 打开文件
- 何谓“打开文件”
- 打开文件的锁的保护机制
- 文件分配
- 如何为一个文件分配数据块
- 方法一:连续分配
- 方法二:链式分配
- 方法三:索引分配
- 方法三扩展:大文件多级索引块
- 空闲空间管理
- 多磁盘管理-RAID(Redundant Arrays of Independent Drives)
- 磁盘调度
- 磁盘的性能
- 磁盘调度方法
- 先进先出
- 最短服务优先
- 扫描算法(SCAN,电梯算法)
- C-SCAN方法
- C-LOOK
- 其他算法
打开文件
何谓“打开文件”
打开文件描述:
- 每个被打开的文件一个;
- 文件状态信息;
- 目录项、当前文件指针、文件操作设置等。
文件被打开后,放入打开文件表中。
打开文件表:
- 一个进程一个;
- 一个系统级的;
- 每个卷控制块也会保存一个列表;
- 所以如果有文件被打开将不能被卸载。
如上图,可能两个进程同时打开一个文件,用文件打开表可以管理。
打开文件的锁的保护机制
- 一些操作系统和文件系统提供该功能;
- 调节对文件的访问;
- 强制和劝告:
- 强制:根据锁保持情况和需求拒绝访问;
- 劝告:进程可以查找锁的状态来决定怎么做。
文件分配
比如,如果要写文件,文件增大,空间如何分配?
大多数文件很小:
- 需要对小文件提供强力的支持;
- 块空间不能太大。
一些文件非常大:
- 必须支持大文件(64-bit 文件偏移);
- 大文件访问需要相当高效。
如何为一个文件分配数据块
分配方式:
- 连续分配;
- 链式分配;
- 索引分配。
指标:
- 高效:如存储利用(外部碎片);
- 表现:如访问速度。
方法一:连续分配
如上图,文件头指针会指定起始块位置和文件长度。
产生问题:如果A文件在B文件前,A增长了,则B需要后移。
对于CD-ROM来说,是一种好的分配方法。因其高效性、只读性。
方法二:链式分配
如上图,链式存储很灵活,如果增大,则只需将尾指针后移。
但是问题是,访问必须是串行访问(假设访问链中第二个数据块,必须先找到第一个)。并且,不可靠,如果丢失一个,链就断了。
方法三:索引分配
如上图,专门设置一个索引数据块,一般放在文件头里。文件大小变化时,大量的修改只需要在索引块中。
但是,如果文件本身很小,索引数据块冗余严重;如果文件本身很大,一个索引数据块不够装。
方法三扩展:大文件多级索引块
如上图,可以采用链式(线性扩展,不可靠、不推荐)或多级索引块(分层方式,推荐)对大文件数据块索引信息进行保存。
如上图,在早期Linux里,采用多级索引块方式。小文件直接放在一级索引块里,保证小文件不需要经过多级索引就可以访问。
空闲空间管理
空闲磁盘块,如何被文件系统组织?如何表示?
如上图,用位图代表空闲数据库。1代表磁盘扇区已经被使用。但是要定期扫描空间块,因为如果掉电,磁盘是否空闲的信息可能对不上。
如上图中,对于160GB的磁盘,一个数据库40MB,则内存中需要5MB的位图信息。
如上图,如果刚刚将bit[i]=1时突然掉电,则尽管误认为数据库i被写入了,但是没有丢失信息。如果先写信息,再将bit[i]赋为1,则有可能丢失信息。
如上图,有些文件系统使用链式列表或分组列表表示空闲块。
多磁盘管理-RAID(Redundant Arrays of Independent Drives)
前置知识:
- 磁盘读取中,最慢的是磁头的横向移动;
- 文件系统是分区的、分卷的。
在RAID提出之前,磁盘经常坏。有没有可能通过并行、冗余(多个磁盘存一个内容)提高可靠性?
因此提高RAID(冗余磁盘阵列)。
RAID从RAID0发展到了RAID5、6…数字指磁盘阵列组织方式。
RAID分为软RAID和硬RAID。软RAID是在磁盘之上进行抽象,硬RAID是在芯片层面做处理,操作系统所见到的是一个被映射出的大磁盘。
如上图,RAID0中,把一个数据分成三部分存在三个硬盘上,进行并行读取,时间变为三分之一。
如上图,RAID1中,硬盘起到一个镜像作用。两个磁盘写一个内容。
如上图,RIAD4中,既能提升效率又能保证可靠性。Disk1-4中,某一个出现故障,可以通过Parity Disk进行奇偶校验。
但是,由此,Parity Disk的开销会比其他Disk大很多。
如上图,RAID5中,每个Disk都具有校验能力。则每个Disk开销差不多。RAID5是RAID4的升级。但是RAID4、RAID5只能纠正一个磁盘出错的情况(两个及以上不行)。
如上图,RAID0和RAID1可以分层或嵌套,来获得更多特性。RAID相关的技术还有很多。
磁盘调度
在OS层面,重新组织I/O顺序,来有效减少访问的开销。
如上图,机械运动相比电路很慢,因此优化机械动作,很重要。
磁盘的性能
如上图,对于读或者写的表示,寻道时间+旋转延迟=磁盘访问时间。
如上图是访问时间的计算公式。
- 寻道时间是性能上区别的原因;
- 对单个磁盘,会有一个I/O请求数目;
- 如果请求是随机的,那么会表现得很差。
磁盘调度方法
先进先出
- 按顺序处理请求;
- 公平对待所用进程;
- 在有很多进程的情况下,接近随机调度的性能。
如上图,这种方法随机性很大,磁盘指针来回地条,移动距离很长,开销很大。
最短服务优先
如上图,动态情况下规划,下次访问时与现在磁头最近的位置。
但是,原处的区域可能只需得不到服务,出现“饥饿”现象。
扫描算法(SCAN,电梯算法)
如上图,移到一头,再回来。
C-SCAN方法
如上图,限制磁臂只能向一个方向移动。只能从高到低访问。
C-LOOK
到达最后一个请求处反转,而非最高点。
其他算法
如上图,还有许多算法,比如N-Step-SCAN。
如上图,FSCAN是对N-step-SCAN的简化,将N=2。
对于真实系统来讲,可能需要更复杂算法,或不需要设计算法,因为:
- 硬盘本身在变化;
- 已经有SSD硬盘;
- 硬盘已经高性能、智能化,软件方面可能作用不显著。
【操作系统/OS笔记20】打开文件、文件数据块分配、空闲空间管理、多磁盘管理(RAID)、磁盘调度算法概述相关推荐
- 【操作系统/OS笔记08】进程的定义、组成、PCB、生命周期管理、状态变化模型、挂起模型
本次笔记内容: 7.1 进程的定义 7.2 进程的组成 7.3 进程的特点 7.4 进程的控制结构 7.5 进程的生命期原理 7.6 进程状态变化模型 7.7 进程挂起 文章目录 进程的描述 进程(p ...
- 【操作系统/OS笔记17】文件系统基本概念、文件描述符、文件系统访问、文件别名、文件系统种类
本次笔记内容: 12.1 文件系统:总体介绍 12.2 基本概念 12.3 基本概念--文件系统和文件 12.4 基本概念--文件系统的功能 12.5 基本概念--文件和块 12.6 基本概念--文件 ...
- AI算法工程师 | 02人工智能基础-Python基础(四)os模块_打开读取文件
文章目录 Python基础语法 之 文件和流 os 模块 调用操作系统命令 操作文件和目录 案例-文件重命名 打开读取文件 打开文件 读取文件 补充-中文编码问题 Python基础语法 之 文件和流 ...
- python 使用os模块自动打开本地文件
import os os.system('path') #path为文件路径,本目录下可直接写文件名os 为本地模块不需再行安装 运行环境:python3.6 os.system('path') ...
- 【操作系统/OS笔记19】数据块缓存
本次笔记内容: 12.11 数据缓存 文章目录 数据缓存的目的 数据缓存的方式 基于分页的缓存机制 数据缓存的目的 如上图,从硬盘访问要比从内存访问慢很多,因此需要在内存中开辟一块缓存数据的区域.接下 ...
- 【操作系统/OS笔记09】线程、线程的实现、上下文切换、进程控制
本次笔记内容: 7.8 为什么使用线程 7.9 什么是线程 7.10 线程的实现 7.11 上下文切换 7.12 进程控制--创建进程 7.13 进程控制--加载和执行进程 7.14 进程控制--等待 ...
- 【操作系统/OS笔记18】虚拟文件系统概念
本次笔记内容: 12.10 虚拟文件系统 文章目录 虚拟文件系统抽象 虚拟文件系统的目的与功能 虚拟文件系统基本结构 虚拟文件系统如何保存 虚拟文件系统抽象 如上图,虚拟文件系统就是,将复杂系统抽象, ...
- 【操作系统/OS笔记01】课程概要、什么是操作系统
本次笔记内容: 1.1 课程概述 1.2 什么是操作系统 1.3 为什么学习操作系统 文章目录 课程概要 纲要 实验工具 预备知识 操作系统 什么是操作系统? 操作系统包含什么 OS Kernel的特 ...
- 操作系统学习笔记(二十八)~文件系统+连续分配+链接分配+索引分配+空闲空间管理
11.1 文件系统 1.下面有关文件系统的论述错误的是().D A.在存储设备上组织文件的方法和数据结构 B.操作系统中负责管理和存储文件信息的模块 C.负责文件检索.读写等操作 D.从系统角度来说, ...
最新文章
- TVM darknet yolov3算子优化与量化代码的配置方法
- 2021年大数据ELK(二十):FileBeat是如何工作的
- 如何在JavaScript中切片和拼接数组
- 如何将深度学习研究论文实现为代码的几个要点
- MySQL如何查看连接数和状态
- oledb32.dll的作用
- 变态最大值--nyoj题目811
- [转]详细介绍java中的数据结构
- 02.analyzer-tokenizer
- python大数据后期教学_大数据处理之道(十分钟学会Python)
- SQL游标使用方法SQL游标使用方法(转)
- linux内存管理_浅谈Linux内存管理
- mysql 非英文_非英文网站如何使用MySQL的字符集
- 雅可比迭代法和高斯赛德尔迭代法
- android ajax chrome,chrome浏览器ajax请求状态200,response为空的探索
- 精益生产管理专家——安岷老师
- 解析美团联盟,美团分销联盟,美团福利宝,外卖美天赚区别和玩法
- 不同证书格式Der 、Cer 、Pfx 、Pem区别
- 原创【歌词类】雪中吟
- Wifi_认证 、关联 和 四次握手(WPA/WPA2)
热门文章
- 浏览器乱码问题的具体解决
- Django 模板标签 换行导致异常的处理 linebreaksbr
- webpack+vue解决前端跨域问题
- QT学习之解决QT中QIcon图标不显示的问题
- 如何解决php 生成验证码图片不显示问题
- 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法
- 使用range()以相反的顺序打印列表?
- 由于AsyncTask是一个单独的类,如何使OnPostExecute()的结果进入主要活动?
- 如何将Git用于Unity3D源代码管理?
- 是否有唯一的Android设备ID?