本文主要涉及操作系统的简介、硬件结构、内存管理、进程管理、文件系统、设备管理等内容,可以作为学习操作系统的辅助文本记录。撰写本文的目的主要是针对操作系统整体做一个相对完整的梳理,以便后续回顾之用。
本文是第五篇,讲述操作系统的文件系统和I/O系统。
第一篇:操作系统(一)基础知识及操作系统启动
第二篇:操作系统(二)内存管理的基础知识
第三篇:操作系统(三)进程和线程的基础知识
第四篇:操作系统(四)进程和线程的调度算法、同步互斥、通信、死锁等
文件系统:操作系统中管理持久性数据的子系统,提供数据存储和访问功能
文件:具有符号名,由字节序列构成的数据项集合
文件系统的功能:
分配文件磁盘空间
管理文件块(位置和顺序)
管理空闲空间(位置)
分配算法(策略)
管理文件集合
定位:文件及其内容
命名:通过名字找到文件
文件系统结构:文件组织方式
数据可靠和安全
安全:多层次保护数据安全
可靠:持久保存文件;避免系统泵快、媒体错误、攻击等
文件属性:
名称、类型、位置、大小……
文件头:文件系统元数据中的文件信息
文件属性
文件存储位置和顺序
文件是以目录的方式组织起来
目录是一类特殊的文件
目录的内容是文件的索引表<文件名,指向文件的指针>
目录和文件的树形结构
早期的文件系统是扁平的(只有一层目录)
典型目录操作
搜索文件、创建文件、删除文件、列目录、重命名文件、遍历路径
操作系统应该只允许内核修改目录
确保映射的完整性
如果用户希望修改目录,只能通过系统调用访问目录
文件名的线性列表,包含指向数据块的指针
编程简单,但执行耗时
哈希表,哈希数据结构的线性表
减少目录搜索时间
名字解析:把逻辑名字转换为物理资源(如文件)
举例:解析“/bin/ls”
当前工作目录(PWD)
每个进程都会指向一个缺省的文件目录用于解析文件名
允许用户指定相对路径来代替绝对路径
如, 用PWD = "/bin"能够解析“ls”.
是为了面对多种文件系统,但是希望提供一个统一的文件访问和文件控制的接口
文件大小
文件分配:如何表示分配给一个文件数据块的位置和顺序
分配方式:连续分配、链式分配、索引分配
指标:
存储效率:外部碎片等
读写性能:访问速度等
数据少的时候,直接对应数据块;
数据大的话,增加索引块,一级索引,二级索引,……
效果:
提高了文件大小限制阈值;
动态分配数据块,文件扩展很容易
小文件开销小;
为大文件间接分配数据块,但查询速度会有所下降
用位图代表空闲数据块列表,0为空闲,1为已分配
使用简单但可能会是一个很大的向量表
160GB—40M数据块–5MB位图
查找空闲块的时间长
链表
链式索引
文件卷:一个拥有完整文件系统实例的外存空间通常常驻在磁盘的单个分区上
冗余磁盘阵列是磁盘管理技术
实现:
把数据块分成多个子块,存储在独立的磁盘中
通过独立磁盘上并行数据块访问提供更大的磁盘带宽
向两个磁盘写入,从任何一个读取
可靠性成倍增长;读取性能 线性增加
数据块级的磁盘条带化加专用奇偶校验磁盘;允许从任意一个故障磁盘中恢复
校验和分散,降低校验和磁盘的读写压力
上面的几种组合使用,如RAID0+1,并行并且可靠性增加
字符设备: 键盘/鼠标、串口等
访问特征:以字节为单位顺序访问
**块设备:**磁盘驱动器,磁带驱动器,光驱等
访问特征:以数据块为基本访问单位,数据访问均匀
**网络设备:**以太网、无线、蓝牙等
访问特征:格式化报文交换,比较复杂
每种设备都有一个设备控制器,控制器相当于一个小 CPU,它可以自己处理一些事情,当 CPU 给设备发送了一个指令,让设备控制器去读设备的数据,读完如何通知CPU?
轮询等待
控制器的寄存器一般会有状态标记位,用来标识输入或输出操作是否完成,,让 CPU 一直查寄存器的状态,直到状态标记为完成。显然CPU浪费了相当多时间。
中断
设备完成任务后触发中断到中断控制器,中断控制器就通知 CPU,一个中断产生了,CPU 需要停下当前手里的事情来处理中断。
DMA(Direct Memory Access)
中断的方式对于频繁读写数据的磁盘,并不友好,这样 CPU 容易经常被打断,会占用 CPU 大量的时间。DMA可以使得设备在 CPU 不参与的情况下,能够自行完成把设备 I/O 数据放入到内存。那要实现 DMA 功能要有 「DMA 控制器」硬件的支持。
Q: DMA是什么?
A: DMA(Direct Memory Access,直接内存存取)是计算机系统中一种用于高效地进行数据传输的技术。DMA允许外部设备(如硬盘驱动器、网络适配器等)直接和系统内存进行数据传输,而无需通过中央处理器(CPU)的干预,从而提高了系统的整体性能和效率。
在没有使用DMA的情况下,数据传输通常需要通过CPU来完成,这意味着CPU必须参与每一个数据传输操作,即使这些操作与CPU的主要任务无关。这样会占用CPU的时间和资源,并降低系统的整体性能。
而有了DMA技术,外部设备可以直接和系统内存进行数据传输,而无需CPU的直接参与。DMA控制器负责管理数据的传输过程,它可以独立地访问系统内存,读取或写入数据,而无需CPU的干预。这样一来,CPU就可以专注于执行其他任务,从而提高了系统的并发性和整体性能。
DMA 的工作方式如下:
可以看到, CPU 当要读取磁盘数据的时候,只需给 DMA 控制器发送指令,然后返回去做其他事情,当磁盘数据拷贝到内存后,DMA 控制机器通过中断的方式,告诉 CPU 数据已经准备好了,可以从内存读数据了。仅仅在传送开始和结束时需要 CPU 干预
操作系统需要了解设备状态
I/O操作完成时间
I/O操作遇到错误
两种方式:轮询和设备中断
磁盘工作机制
平均旋转延迟时间=磁盘旋转一周时间的一半
磁盘调度算法:
先来先服务(First-Come,First-Served,FCFS),顾名思义,先到来的请求,先被服务。这种算法,比较简单粗暴,但是如果大量进程竞争使用磁盘,请求访问的磁道可能会很分散,那先来先服务算法在性能上就会显得很差,因为寻道时间过长。
最短寻道时间优先(Shortest Seek First,SSF)算法的工作方式是,优先选择从当前磁头位置所需寻道时间最短的请求。
98,183,37,122,14,124,65,67
那么,那么根据距离磁头( 53 位置)最近的请求的算法,具体的请求则会是下列从左到右的顺序:
65,67,37,14,98,122,124,183
这个算法可能存在某些请求的饥饿,因为本次例子我们是静态的序列,看不出问题,假设是一个动态的请求,如果后续来的请求都是小于 183 磁道的,那么 183 磁道可能永远不会被响应,于是就产生了饥饿现象,这里产生饥饿的原因是磁头在一小块区域来回移动。
磁头在一个方向上移动,访问所有未完成的请求,直到磁头到达该方向上的最后的磁道,才调换方向,这就是扫描(Scan)算法。
扫描调度算法性能较好,不会产生饥饿现象,但是存在这样的问题,中间部分的磁道会比较占便宜,中间部分相比其他部分响应的频率会比较多,也就是说每个磁道的响应频率存在差异。
循环扫描(Circular Scan, CSCAN )规定:只有磁头朝某个特定方向移动时,才处理磁道访问请求,而返回时直接快速移动至最靠边缘的磁道,也就是复位磁头,这个过程是很快的,并且返回中途不处理任何请求,该算法的特点,就是磁道只响应一个方向上的请求。
循环扫描算法相比于扫描算法,对于各个位置磁道响应频率相对比较平均.
针对 SCAN 算法的优化则叫 LOOK 算法,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中会响应请求。
针对 C-SCAN 算法的优化则叫 C-LOOK,它的工作方式,磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中不会响应请求。
磁盘粘着(Arm Stickiness)现象
SSTF、SCAN以及CSCAN等算法中,可能出现磁头停留在某处不动的情况(因为一直在响应附近的请求)
N步扫描算法:
缓存:数据传输双方访问速度差异较大时,引入的速度匹配中间层
磁盘缓存是磁盘扇区在内存中的缓存区
单缓存(single Buffer Cache)
双缓存(Double Buffer Cache)
本节主要操作系统的进程和线程的调度算法、同步互斥、通信、死锁等。
本主要文参考:
如果您觉得我写的不错,麻烦给我一个免费的赞!如果内容中有错误,也欢迎向我反馈。