操作系统第四部分存储管理

文件系统接口

概念

文件——一组有意义的信息/数据的集合

文件的属性:

  • 文件名:创建文件的用户决定,方便用户找到文件。同一目录下不允许有重名文件
  • 标识符:文件的标识符唯一,对用户来说无可读性,用于操作系统区分文件
  • 类型
  • 位置:文件存放路径、在外存中的地址(用户不可见)
  • 保护信息:对文件进行保护的访问控制信息
  • 大小
  • 创建时间
  • 上次修改时间
  • ……

文件类型的作用?

  1. 便于让操作系统知道是否识别支持当前类型
  2. 通过文件类型确定哪种程序可以操作当前类型文件
  3. 确定文件的内部组织结构

OS提供的基本功能:

  • 创建文件(create系统调用)
  • 删除文件(delete系统调用)
  • 读文件(read系统调用)
  • 写文件(write系统调用)
  • 打开文件(open系统调用)
  • 关闭文件(close系统调用)

外存被划分为一个个块,以为单位进行数据交换。

文件的逻辑结构

文件分为无结构文件和有结构文件。

无结构文件:由一系列二进制或字符流组成,又称“流式文件”,如.txt

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录由若干个数据项组成,每条记录有一个数据项可作为关键字。
记录又可分为定长记录和可变长记录两种(参考数据库)

顺序文件:

文件中的记录一个接一个地顺序排列(逻辑上),各个记录在物理上可以顺序存储或链式存储。

  • 顺序存储——逻辑上相邻物理上也相邻
  • 链式存储——逻辑上相邻物理上不一定相邻

根据是否按照关键字排列又可分为 串结构和顺序结构。

  • 串结构——记录的顺序与关键字无关,通常按照记录存入的时间决定顺序
  • 顺序结构——按照关键字顺序排列

对比:
链式存储无法实现随机存取;
顺序存储 可变长记录无法实现随机存取
顺序存储 定长记录 能够实现随机存取
顺序存储 定长记录 顺序结构 可以快速找到某关键字对应的记录

索引文件

建立一张索引表,每条记录对应一个索引项。
索引表本身是定长记录地顺序文件,可以快速找到第i各记录对应的索引项。
用于对信息处理的及时性要求比较高的场合

索引顺序文件

索引文件和顺序文件的结合。为文件建立一张索引表,一组记录对应一个索引表项

在这里插入图片描述

多级索引文件:

在这里插入图片描述

文件目录

文件控制块:目录本身就是一种有结构文件,有一条条记录组成。每条记录对应一个放在该目录下的文件
在这里插入图片描述
在这里插入图片描述
文件控制块FCB的有序集合即为“文件目录”,一个FCB就是一个文件目录项
FCB包含了文件的基本信息,实现了文件名和文件之间的映射,使用户可以实现按名存取

目录结构

单级目录结构
整个系统中只有一张目录表,每个文件占一个目录表项。
优点:
能够实现按名存取,便于理解,便于支持,搜索高效
问题:
命名重复问题,用户分组问题,不同用户间文件共享问题

两级目录结构
分为主文件目录(MFD)和用户文件目录(UFD)。
在这里插入图片描述
优点:允许不同用户的文件重名,也可以在目录上实现访问限制,搜索高效
缺点:用户不能对自己的文件进行分类,系统文件多次备份的问题
解决方案:
定义一个特殊用户包含所有系统文件,当本地UFD 搜索不到文件时默认去特殊用户下搜索

多级目录结构(树形)
在这里插入图片描述
用户要访问文件时,要用文件路径名标识文件。
文件路径名是个字符串,各级目录间用 / 隔开。
绝对路径:从根目录出发的路径
在这里插入图片描述
相对路径:从当前目录出发的路径

在这里插入图片描述
优点:便于分类,层次结构清晰,能够有效地进行文件的管理和保护
缺点:不便于实现文件的共享

无环图目录结构
允许目录含有共享子目录和文件,共享文件(或目录)不同于文件的复制,对于一个共享文件,只存在一个真正的文件。当多用户在一个组工作时,只需要把共享文件目录设为每个用户目录(UFD)下的子目录就可完成分组共享
在这里插入图片描述
删除文件时,只是删除该用户的PCB,并使共享计数器 -1,并不会直接删除共享结点,除非共享计数器减为 0 .

问题:
(1) 同一文件拥有多个绝对路径,遍历时重复计数。
(2) 删除共享文件时,会留下悬空指针
(dangling pointers)
在这里插入图片描述在这里插入图片描述

通用图目录
优先考虑无环图的实现模式,遍历算法实现简单。
但当目录中允许环存在时,存在重复遍历问题和删除时出现因为自身引用,导致引用计数无法为 0 而永远无法被删除的问题。

在这里插入图片描述

解决方案:
(1) 在无限循环的遍历中设置最大遍历次数,如果超过则自动跳出。
(2) 遍历两遍,第一遍标记所有可以访问到的空间,第二遍将没有访问到的空间加入空闲空间链表。(自引用的孤立节点没法访问到)

索引结点——改进FCB
在这里插入图片描述
当找到文件名的目录项时,才将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中存放的位置。
存放在外存中的索引结点为“磁盘索引结点”,当放入内存后为“内存索引结点”,内存索引结点要增加一些信息:如文件是否被修改、此时几个进程在访问

文件物理结构——分配方式

连续分配:

要求每个文件在磁盘上占有一组连续的块。
在这里插入图片描述
如何由(逻辑块号,块内地址)映射为(物理块号,块内地址)?
在文件目录中存放起始块号和长度(即总共占几个块)
在这里插入图片描述
物理块号=起始块号+逻辑块号

优点:
支持顺序访问和随机访问

由于读取磁盘块时,需要移动磁头,磁盘块距离越远,移动磁头所需时间越长。因此,连续分配的文件在顺序读/写时速度最快

缺点:不便于扩展;存储空间利用率低,会产生难以利用的外部碎片;可以用紧凑来处理碎片,但需要耗费很大的时间代价

链接分配:

隐式链接:
在FCB中记录起始块号和结束块号
在这里插入图片描述
优点:便于文件扩展(添加指针,修改FCB结束块号),不会有碎片问题,外存利用率高
缺点:只支持顺序访问,不支持随机访问,查找效率低。另外,指针也需要耗费少量的存储空间

显式链接:
把用于链接文件中各物理块的指针显式地存放在一张表中——文件分配表FAT。
那么FCB只需要存储起始块号即可。
在这里插入图片描述
一个磁盘设置一张FAT就够了。开机时,将FAT读入内存并常驻内存
FAT表项在物理上连续存储,且每一表项长度相同,因此物理块号字段可以隐藏(下标)

因此,逻辑块号转换为物理块号地过程不需要读磁盘

优点:
支持顺序访问,也支持随机访问。(只是在表上查,不需要真的去访问磁盘)
不需要访问磁盘,速度更快;
不会产生外部碎片;便于扩展

缺点:文件分配表需要占用一定空间

索引分配

允许文件离散地分配在各个磁盘中,系统为每个文件建立一张索引表,记录文件的各个逻辑块对应的物理块号。
索引表存放的磁盘块称为索引块;文件数据存放的磁盘块称为数据块。
FCB只需要记录索引块即可。
在这里插入图片描述
一个文件需要一个索引块,对应一张索引表
若用固定长度表示物理块号,则逻辑块号可以隐含。

索引表从外存读入内存,并查找索引表即可找到逻辑块存放的物理位置。

优点:支持随机访问,易于文件扩展(分配空闲块,增加索引表项)
缺点:索引表需要空间

若索引表太大,会出现一个磁盘块存不下地情况,解决方案:

  1. 链接方案——分配多个索引块,将它们链接起来
    在这里插入图片描述

  2. 多层索引
    在这里插入图片描述
    K层索引,且顶级索引未调入内存,则访问一个数据块需要K+1次读磁盘

  3. 混合索引——既包含直接索引,又包含一级索引、二级索引在这里插入图片描述
    分别需要读磁盘:2、3、4次,即对于小文件,只需要读磁盘很少的次数

存储空间的划分

将物理磁盘划分成一个个文件卷,每个文件卷划分为目录区和文件区:目录区主要存放文件目录信息、用于磁盘存储空间管理的信息;文件区用于存放文件数据。有的系统支持有多个物理磁盘组成一个文件卷。

存储空间管理

空闲表法:
适用于连续分配方式
在这里插入图片描述
分配:分配连续存储空间,利用算法,然后修改空闲表
回收:注意表项和合并问题,修改空闲表。

空闲链表法:
空闲盘块链——以盘块为单位组成空闲链
需要保存链头、链尾。
适用于离散分配。
分配时从链头开始分配,然后修改链头指针
回收时将盘块加至链尾,然后修改链尾指针

空闲盘区链——以盘区为单位组成空闲链
需要保存链头、链尾。

分配时从链头开始检索,使用算法找到第一个合适的空闲盘区分配给文件,若没有合适的连续块,也可以分配不同盘区的块。

回收时,注意区间合并问题,若不需要合并,将回收区作为单独的空闲盘区加到链尾
在这里插入图片描述

位图法:
二进制位表示已/未分配。
在这里插入图片描述
分配时,顺序扫描位示图,找到K个相邻/不相邻的 0 ,根据字号和位号 算出 对应的盘块号,将相应盘块分配给文件,0 改成 1;

回收时,根据盘块号 计算出字号,位号,将对应位置的1 改为 0

成组链接法:
文件卷的目录区中专门一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存,并保持内存与外存中的超级块数据一致

在这里插入图片描述在这里插入图片描述在这里插入图片描述

文件的基本操作

create:
需要提供参数:所需的外存空间大小、文件存放路径、文件名。
OS:外存中找到文件所需空间、找到对应目录文件,创建该文件对应的FCB

delete:
提供参数:文件存放路径、文件名
OS:从目录中找到文件名对应的FCB、根据目录项记录的外存位置及文件大小,回收文件占用的磁盘块、删除FCB

open:
提供参数:文件存放路径、文件名、对文件的操作类型
OS:找到文件名对应的目录项,检验该用户是否有操作权限;将目录项复制到内存中的“打开文件表”,将对应表目的编号返回给用户,之后用户使用打开文件表的编号来指明要操作的文件。
在这里插入图片描述在这里插入图片描述

close:
进程的打开文件表项删除
回收分配给该文件的内存空间等资源
系统打开文件表的打开计数器-1,若 = 0,则删除对应表项

read:
指明是哪个文件(在打开文件表中直接找到索引号即可),指明读入多少数据,指明读入的数据要放在内存中的什么位置。

write:
指明是哪个文件(在打开文件表中直接找到索引号即可),指明写回多少数据,指明写回的数据要放在内存中的什么位置。
在这里插入图片描述

文件共享

多个用户共享同一个文件,即系统中只有一份文件数据,并且只要某个用户修改了文件数据,其他用户可以看到文件的变化。

基于索引结点的共享方式(硬链接)
在这里插入图片描述
用户删除:断指针、count-1

基于符号链的共享方式(软链接)
并不直接利用指针链接到想要访问的文件。
在这里插入图片描述
在这里插入图片描述

文件保护

一、口令保护
为文件设置一个口令,存放在PCB或索引结点中,用户请求访问文件时需要提供口令,若正确,则允许访问。

优点:空间开销小,验证时间开销小
缺点:正确的口令存放在系统内部,不安全

二、加密保护
使用某种“密码”对文件进行加密,在访问文件时需要提供正确的密码才能对文件进行正确的解密

在这里插入图片描述
三、访问控制
在文件的FCB或索引结点添加一个访问控制列表ACL,表中记录各个用户可以对文件执行的操作。

文件的拥有者规定文件的访问权限(访问用户;访问操作)
Unix 通过对 Read,Write,Execute 三种基本操作,对 owner,group,public 三组用户进行授权。对应相应的 3*3 位二进制表示,1 标示允许,0 标示拒绝。
100 010 001 表示对拥有者可读,对同组用户可写,对公共用户可执行。

文件系统的实现

逻辑块
文件系统将磁盘视为一个逻辑空间,该逻辑空间就象一个大的数组,数组的每个元素是文件系统操作的基本单位—逻辑块。比如数据库表里的每行记录就是一个逻辑记录。

  • 逻辑块是从 0 开始编址且逻辑块是连续的
  • 逻辑块的大小一般是扇区大小的 2 n 2^n 2n

物理块
物理块是数据在磁盘上的存取单位,也就是每进行一次 I/O 操作,最小传输的数据大小,一般情况下,一个物理块对应一个扇区 (有时也对应多个)
为了让整数 n 次 IO 读进来一个逻辑块,所以把逻辑块的大小一般设计成扇区大小的 2 n 2^n 2n 倍。

文件系统的分层:

为了实现从逻辑地址到物理磁盘地址的转换,采用分层设计,**上层(逻辑文件系统)**负责管理文件逻辑数据,**中间层(文件组织模块)**负责将逻辑地址转化为基本文件系统的物理块地址,**下层(基本文件系统)**对底层驱动程序发送物理地址读写指令。

逻辑文件系统(logical file system)通过文件控制块(FCB)管理文件的所有不包括具体数据(数据块内容)的结构数据,即元数据(metadata),维护文件的结构。

文件组织模块(file-organization module) 通过逻辑文件系统传入的 FCB,使用 FCB 中文件分配类型和文件的位置信息,算出基本文件系统所用的物理块地址。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

虚拟文件系统VFS:

在这里插入图片描述
不同的文件系统可能有不同的函数调用。
因此引入虚拟文件系统VFS——向上层用户进程提供统一的系统调用接口,屏蔽底层具体文件系统的差异

在这里插入图片描述
VFS要求下层的文件系统必须实现某些规定的函数功能,一个新的文件系统想要在某操作系统上被使用,就必须满足该系统VFS的要求

不同的文件系统有不同的数据结构,因此VFS统一使用vnode数据结构,信息复制过去;
每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件
在这里插入图片描述
函数功能指针指向 该文件所属的文件系统提供的函数功能列表,选择其中的功能执行。

文件系统的物理结构

1、磁盘上
磁盘可以整体用作一个操作系统,也可以在将一个磁盘分为几个磁盘分区或片(partition),每个分区上创立一个文件系统。这些分区可以组合成卷(Volume)的结构,在卷上创立文件系统,也就是说卷上的文件系统可以使用多个子文件系统(分区上的文件系统),这就开阔了之前安装(mount)的概念,当时为了直观举 U盘的例子,其实每个分区都是一个“U 盘”。
在这里插入图片描述
磁盘上,文件系统包含以下结构:

  • 卷的引导控制块(per volume boot control disk)
    该卷如果有操作系统,则存放引导信息,没有则为空,Unix 又称引导块(Boot
    Block)
  • 卷控制块(per volume volume control block)
    包括卷的详细信息,包括卷分区的块数,块的大小,空闲块的数量和指针,空闲
    FCB 的数量和指针,Unix 里又称超级块(Super Block)
  • 每个文件系统的目录结构(Directory structure per file system)
    就是目录表,一个文件系统一个,卷上的“大”文件系统也需要有一个目录结构,目录就存在这里,在想打开该文件系统的文件时,这一块需要先加载入内存。
  • 每个文件的 FCB(per file)
  • 具体文件的数据块

2、内存中
也就是说操作系统对文件系统的认识,它了解磁盘上的文件系统只能通过以下形式,当一个文件系统安装时装入这些结构,卸载时删除这些结构。

  • 安装表(mount table)
    包含指向安装设备文件系统超级块的指针
  • 目录结构缓存(directory-structure cache)
    实现目录对文件的查找
  • 系统范围内的打开文件表(system-wide open-file table)
    每个打开文件的 FCB 副本和其他信息
  • 每个进程的打开文件表(per-process open-file table)
    一个指向系统范围打开文件表中对应文件条目的指针和其他信息

文件系统的安装Mount

  1. 在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息,包括文件系统类型、容量大小等。
  2. 新挂载的文件系统,要向VFS提供一个函数地址列表。
  3. 将新文件系统加到挂载点,也就是将新文件系统挂载到某个父目录上

文件系统在被进程使用之前必须安装,具体说目录可以建立在多个文件系统 (卷 Volume)上,这些“子”文件系统必须使它们在这个多文件系统目录的命名空间内可以被访问到。

在这里插入图片描述

Unix中open和read的实现

一、open()操作:
用户给 open()传入一个文件的逻辑路径名,这时先将该文件系统的目录结构加载进内存,根据文件名,操作系统会首先对系统范围内的打开文件表进行搜索(节省时间)。
如果该文件已经被其他进程打开了,则直接将该进程的打开文件表中的指针指向系统范围打开文件表的这一项,同时,系统打开文件表该文件引用计数加 1。

如果该文件在系统范围文件表中不存在,说明该文件第一次打开,则对该文件系统的目录表进行搜索,依次查找到叶结点,叶结点包含了一个该文件控制节点(inode)号,即控制节点的物理位置指针,将这个指针返回给用户,同时在系统范围打开文件表中新注册一行这个文件的信息,将该进程的打开文件表中指针指向这条新信息,open()操作的任务就完成了。

二、read()操作
通过 open()操作返回的该文件的索引节点号从进程的打开文件表中的指针找到系统的打开文件表中该文件的 inode(FCB)物理位置指针,将该 FCB 读入内存,通过FCB 中文件存储类型和存储地址的信息算出数据块的存储地址,将数据块读入即可完成 read()操作。
在这里插入图片描述

磁盘分区:

生分区raw、熟分区cooked

生分区:
没有文件系统的磁盘分区,可以用作页帧对换区(swap space);数据库自己建文件系统管理自治一样
熟分区:
装有文件系统的磁盘分区,采取了逻辑格式化 Format,逻辑格式化 Format 可以创建文件系统

逻辑格式化 Format 做了哪些工作?

  • 划分磁盘块:将一定的扇区组织成磁盘块
  • 创建文件系统,建立文件系统在磁盘上的布局及建立文件系统所使用的数据结构,如引导块、超级块、目录表、FCB 表(索引结点表)、文件分配表(如 FAT)、空闲块索引表等

大容量存储器的结构

磁盘

概念:

  • 磁头与磁臂相连,磁臂能将所有磁头作为一个整体而一起移动。
  • 磁盘片表面被逻辑划分为圆形磁道,磁道进一步划分为扇区。
  • 统一磁臂位置的磁道集合形成柱面。

磁盘初始化:

  1. 低级格式化(物理格式化),将磁盘的各个磁道划分为扇区,一个扇区通常可分为头、数据区域、尾三个部分组成。管理扇区所需要的数据结构一般存放在头、尾两个部分,包括扇区校验码(奇偶校验、CRC循环冗余校验码等,用以校验扇区中的数据是否发生错误)

  2. 将磁盘分区,每个分区由若干柱面组成
    在这里插入图片描述

  3. 进行逻辑格式化,创建文件系统(包括创建文件系统的根目录、初始化存储空间管理所用的数据结构:位图、空闲分区表)
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

为什么是(柱面号,盘面号,扇区号)?而不是其他顺序?
在读取地址连续的磁盘块时,采用这种结构可以减少磁头移动消耗的时间
在这里插入图片描述在这里插入图片描述

磁盘速度有两部分:

  • 传输速率:驱动器和计算机之间的数据传输速率
  • 定位时间/随机访问时间:由寻道时间和旋转等待时间组成
    • 寻道时间:磁臂将磁头移动到包含目标扇区的柱面的时间
    • 旋转等待时间:磁盘需要将目标扇区转动到磁头下的时间

磁盘结构

现代磁盘驱动器可以看做一个一维逻辑块的数组,逻辑块是最小的传输单位,一维逻辑块数组按顺序映射到磁盘的扇区,理论上能将逻辑块号转换为磁盘内的柱面号、磁道号和扇区号。
但是事实上执行这种转换并不容易,因为:

  • 绝大多数磁盘都有一些缺陷扇区,映射必须要用磁盘上其他空闲扇区替代
  • 磁盘是圆的,磁道离中心越远长度越长。为此有两种解决方式,一种是增加外部扇区数并且随着磁头外移驱动器也会增加速度;另一种方式时降低外道的磁道密度

计算机访问磁盘存储的方式:

  • 主机附属存储:通过本地 I/O 端口访问的存储
  • 网络附属存储(NAS):客户通过远程进程调用接口来访问 NAS
  • 存储区域网络(SAN):服务器与存储单元之间有私有网络(采用存储协议而不是网络协议)

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

减少延迟时间的方法:

  • 交替编号:逻辑上相邻的扇区在物理上有一定的间隔在这里插入图片描述
  • 错位命名在这里插入图片描述在这里插入图片描述在这里插入图片描述

OS直接影响寻道时间
——磁盘调度

磁盘调度

操作系统任务之一就是有效使用硬件。
对磁盘驱动器来说就是要有较快的访问速度和较宽的磁盘带宽
访问时间主要包括寻道时间和旋转延迟

磁盘带宽:
所传递的总的字节数 除以 从服务请求开始到最后传递结束的总时间。
当一个进程需要对磁盘进行 I/O 操作时,它就会向操作系统发出一个系统调用,如果所需的磁盘驱动器和控制器忙,新的服务请求就会被加到该磁盘驱动器的待处理请求队列上。对于如何选择处理请求,操作系统有多个调度算法可供使用。

FCFS:
在这里插入图片描述
最短寻找时间优先SSTF:
优先处理与当前磁头最近的磁道,保证每次寻道时间最短,但并不能保证总的寻道时间最短(贪心算法思想)
在这里插入图片描述
产生饥饿的原因:磁头在一个小区域内来回移动

扫描算法SCAN:

只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。
在这里插入图片描述

LOOK调度算法:
在SCAN基础上,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。
边移动边观察。

在这里插入图片描述
循环扫描C-SCAN算法:
解决SCAN算法响应频率不均,规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求
在这里插入图片描述
C-LOOK算法:
改进C-SCAN算法,如果磁头移动的方向上已经没有磁道访问请求了,就可以立即掉头返回,并且只需要返回到有磁道请求的位置即可。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
磁盘调度算法的选择:

  • SSTF 或 LOOK 被认为是比较合理的默认算法
  • SCAN 和 C-SCAN 适合磁盘负荷较大的。
  • 除了算法以外,目录和索引的位置也很重要,因为它们经常被访问,一般放在中央柱面。
  • 另外需要注意,这里所描述的调度算法只考虑了寻道时间,旋转等待的时间和寻道时间几乎一样,但是操作系统比较难调度以改善旋转等待。

RAID结构

RADI——独立磁盘冗余技术redundant array of independent disks

通过冗余改善可靠性:
可靠性问题解决方案是引入冗余,即存储额外信息,在磁盘出错的时候可以用来重新修补损坏信息。引入冗余最简单的方法就是复制每个磁盘,这种技术称为**镜像。**但是价格比较昂贵

通过并行处理改善性能:
对于磁盘镜像,读请求处理速度加倍,因为有两个位置可以处理读。可见,对于多个磁盘,可以通过数据分散改善传输率。

  1. 位级分散:在多个磁盘上分散每个字节的各个位。如 8 个磁盘,每个磁盘存储一位,就会有 8 倍的传输率,因为每个磁盘每秒所能处理的访问数不变,但每次访问都能在同样时间读到单个磁盘系统 8 倍的数据,
  2. 块级分散:一个文件的块可以分散在多个磁盘上,读块只访问一个磁盘,可允许多个读访问并行处理,对于大量的读操作传输速度较高;大量写传输速度也高,因为数据和奇偶可以并行写。小于块大小的数据独立写不能并行进行。

镜像提高可靠性却昂贵;分散提供高数据传输率却未改善可靠性。
RAID 采用并行交叉存取及数据冗余校验来融合二者优点。

RAID 技术将数据按位级或者按块级分散写入到多个磁盘上,多个磁盘可以同时读写存取操作,实现数据的并行存取,提高了系统的性能;再结合数据冗余技术及校验技术,例如磁盘镜像、其它校验技术(CRC、Hamming 等),又提高系统的可靠性;

RAID级别:
在这里插入图片描述
P 为差错纠正位,C 为数据的第二副本

  1. RAID 0 无冗余磁盘阵列:
    数据块级分散,并行交叉存取,无数据冗余;磁盘不容错
  2. RAID 1 磁盘镜像
  3. RAID 2 内存方式的差错纠正代码结构
    奇偶校验:内存系统每个字节都有一个相关奇偶位以记录字节中置 1 的个数是偶数还是奇数。如果字节的一个位损坏或者奇偶位损坏就会出现不匹配然后被内存系统所检测
    RAID 2 采用了位级分散,即每一个字节的第 n 位位于第 n 个磁盘上,除了奇偶校验位以外,差错纠正方案还会存储两个或多个额外位,当单个位出错时可用来重新构造数据
  4. RAID 3 位交织奇偶结构
    与内存系统不同,磁盘控制器能检测到一个扇区是否正确读取,因为采用位级分散,所以每一位都在不同的磁盘上,单个奇偶位就足够进行差错检测,加上磁盘控制器检测的某个磁盘出错,就完全可以完成纠正了。
    因此级别 2 在实际中并不使用
    级别 3 的问题在于如果奇偶校验盘损坏,数据就无法恢复。
    另一个性能问题时关于奇偶校验的奇偶位需要计算和写。为了减少这样的性能损失,RAID 存储阵列包括一个专门奇偶计算硬件的控制器使CPU 奇偶计算转换到 RAID阵列。
  5. RAID 4 块交织奇偶结构
    块级分散,采用与 RAID0 一样的块级分散,另外在一独立磁盘上保存其他 N 个磁盘相应的奇偶块。允许磁盘无缝加到 RAID 集合:加入的磁盘块初始化为 0RAID 集合仍然正确
    但是若奇偶校验盘出错数据无法恢复;多个磁盘出错,数据无法恢复。
  6. RAID 5 块交织分布奇偶结构
    将数据和奇偶分布在所有 N+1 块磁盘上,即第 n 块磁盘的奇偶放在第(n mod 5)+1 块磁盘上,避免了级别 4 对单个奇偶盘使用过度,是最常见的奇偶校验 RAID 系统
  7. RAID 6 P+Q 冗余方案
    与级别 5 类似,也是将校验位分布在不同的磁盘上,但是不再使用奇偶校验,而是用公式生成 P、Q。P 为所有数值的异或,Q 是乘了系数的异或,其中系数是 n 个线性无关的数值。当只有一位出错时,用 P 就可以恢复(同 RAID5);当有两位出错时,可以用 P、Q 联立求解。
    核心思想就是有两份检验数据以保证两位数据出错也能保障数据安全
  8. RAID 0+1、 RAID 0 和 RAID 1 的组合,有更高的性能和可靠性,同时也更昂贵

适用性:

  • RAID 0-适于性能要求高但数据可靠性要求不高的应用;
  • RAID 1-适于可靠性要求高和快速恢复的应用;
  • RAID (0+1) 和 (1+0)-适于性能和可靠性要求都高的应用;例如小型数据库服务器;
  • RAID 5-用于存储量大的数据;
  • RAID 6-较少有支持

IO输入系统

IO设备可以将数据输入到计算机,或接收计算机输出数据的外部设备,属于计算机中的硬件部件。

按传输速率分类——低速设备、中速设备、高速设备…
按信息交换的单位分类——块设备(可寻址)、字符设备(不可寻址)

IO设备由机械部件、电子部件组成。
机械部件主要用来执行具体IO操作,如鼠标、键盘按钮、显示器屏幕、移动硬盘磁臂
电子部件通常是一块插入主板扩充槽的印刷电路板

IO控制器

CPU无法直接控制机械部件,因此电子部件作为CPU和IO设备的中介,实现CPU对设备的控制。这个电子部件就是IO控制器,也叫设备控制器
CPU控制IO控制器,IO控制器控制设备的机械部件。

IO控制器的功能:

  • 接受和识别CPU发出的命令(IO控制器中会有相应的控制寄存器来存放命令和参数)
  • 向CPU报告设备的状态(状态寄存器,记录IO设备当前状态)
  • 数据交换(数据寄存器,暂存数据)
  • 地址识别(给每个寄存器一个特定的地址,判断CPU要读写哪个寄存器)

IO控制器的组成:

一个控制器可能会对应多个设备;
寄存器也可能有多个;
若让寄存器占用内存地址的一部分,称为内存映像IO;若采用专门的IO地址,就是寄存器独立编址
在这里插入图片描述
在这里插入图片描述
内存映像IO简化了指令,可以采用对内存进行操作的指令来对控制器进行操作
寄存器独立编址需要专门的指令来实现对控制器的操作,不仅要指明寄存器的地址,还要指明控制器的编号

IO控制方式:

程序直接控制方式:

在这里插入图片描述在这里插入图片描述
不仅IO操作开始前、后需要CPU介入,在等待IO完成的过程中CPU需要不断地完成轮询检查

数据传送单位——字
数据流向:
读:IO设备——>CPU(寄存器)——>内存
写:内存——>CPU——>IO设备

优点:实现简单
缺点:CPU和IO设备只能串行工作,CPU需要一直轮询检查,长期处于忙等状态,CPU利用率低

中断驱动方式:

引入中断机制。在CPU发出读写命令后,可将等待IO的进程阻塞,切换到别的进程执行。
当IO完成后,控制器向CPU发出中断信号,CPU转去执行中断处理程序,处理中断的过程中,CPU从IO控制器读取一个字的数据传送到CPU寄存器,再写入主存。
CPU恢复等待IO的进程的运行环境,然后继续执行
在这里插入图片描述
CPU在每个指令周期的末尾检查中断。
中断处理过程需要保存、恢复进程的运行环境,需要一定的时间开销。

在每次IO操作开始前、完成之后需要CPU干预。

数据流:
数据传送单位——字

数据流向:
读:IO设备——>CPU(寄存器)——>内存
写:内存——>CPU——>IO设备

优点:IO控制器通过中断信号主动报告IO已完成,不需要CPU轮询检查,实现了CPU和IO设备的并行工作,CPU利用率得到提升
缺点:每个字的传输都要经过CPU,频繁的中断处理会消耗较多的CPU时间,因此不适合大批量的数据传输

DMA方式:

DMA——直接存储器存取,主要用于块设备的IO控制。

数据传送单位——,每次读写的只能是一个块/多个连续的块
数据流向不需要经过CPU,而是从设备直接放入内存/从内存直接到设备。
仅在传送一个或多个数据块的开始和结束时,才需要CPU干预

在这里插入图片描述
在这里插入图片描述
优点:数据传输以块为单位,CPU介入频率进一步降低。CPU和IO设备并行性得到提升
缺点:CPU发出一条IO指令,只能读写一个或多个连续的数据块

通道控制方式:

通道是一种硬件,能够识别并执行一系列的通道指令
在这里插入图片描述在这里插入图片描述
CPU干预率极低,只有完成一组数据块的读写后才需要发出中断信号,请求CPU干预

数据传送单位——块
数据流向——IO设备<==>内存

优点:CPU、通道、IO设备可并行工作,资源利用率很高
缺点:实现复杂,需要专门的通道硬件支持

IO软件的层次:

用户层软件、设备独立性软件、设备驱动程序、中断处理程序、硬件
在这里插入图片描述
用户层软件:实现了与用户交互的接口,用户可直接使用该层提供的、与IO操作相关的库函数对设备进行操作。
用户层软件将用户请求翻译成IO请求后,通过系统调用请求OS内核服务。

设备独立性软件:
也叫设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现

功能:

  • 向上层提供统一的调用接口(read、write)
  • 实现设备的保护
  • 差错处理
  • 设备的分配和回收
  • 数据缓冲区管理
  • 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用响应的驱动程序

设备独立性文件需要通过“逻辑设备表”LUT来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序
在这里插入图片描述
设备驱动程序:
负责对硬件设备的具体控制,将上层发出的一系列命令转化成特定设备能懂的一系列操作(包括设置设备寄存器、检查设备状态等)
不同的IO设备有不同的硬件特性,因此厂家需要根据设备的硬件特性设计并提供相应的驱动程序

驱动程序一般会以一个独立进程的方式存在

中断处理程序:
进行中断处理
在这里插入图片描述

输入输出应用程序接口

分为三种:字符设备接口、块设备接口、网络设备接口
在这里插入图片描述
字符设备接口

  • get/put系统调用
  • 每次向字符设备读写一个字符

块设备接口

  • read/write系统调用——向块设备的读写指针位置读写多个字符
  • seek系统调用——修改读写指针位置

网络设备接口:又称网络套接字socket接口;创建一个网络套接字,需指明网络协议;

  • bind——将套接字绑定到某个本地端口
  • connect——将套接字连接到远程地址
  • read/write——从套接字读写数据
    在这里插入图片描述在这里插入图片描述

阻塞IO与非阻塞IO
阻塞IO:应用程序发出IO系统调用,进程需转为阻塞态等待
e.g. 从键盘读字符get
非阻塞IO:应用程序发出IO系统调用,系统调用可迅速返回,进程无需阻塞等待
e.g. 往磁盘写数据write

设备驱动程序接口:
在这里插入图片描述在这里插入图片描述

IO核心子系统:

即IO软件中的设备独立性软件、设备驱动程序、中断处理程序。
假脱机技术一般在用户层实现
IO调度、设备保护、设备分配与回收、缓冲区管理在设备独立性软件实现。

假脱机技术spooling

一般在用户层软件实现;
脱机——脱离主机的控制进行的输入/输出操作

假脱机——用软件的方式模拟脱机技术
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

设备分配

设备的固有属性:

  • 独占设备
    一个时段只能分配给一个进程(如打印机)
  • 共享设备
    可同时分配给多个进程使用(如磁盘),个进程往往宏观上同时共享使用设备,而微观上交替使用
  • 虚拟设备
    采用SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程

设备分配的安全性:

  • 安全分配方式
    为进程分配一个设备后就将进程阻塞,本次IO完成后才将进程唤醒;
    一个时段每个进程只能使用一个设备,破坏了请求和保持,不会死锁;但CPU和IO设备只能串行工作
  • 不安全分配方式
    进程发出请求,系统分配IO设备,进程可继续执行,之后还可以发出IO请求,只有某个IO请求得不到满足时才将进程阻塞
    一个进程可同时使用多个设备;进程的计算任务和IO任务可以并行处理;但有可能发生死锁

设备分配方式:

  • 静态分配
    进程运行前为其分配全部所需资源,运行结束后归还资源;
    破坏了请求和保持条件,不会发生死锁
  • 动态分配
    进程运行过程中动态申请设备资源

设备分配管理中的数据结构:
在这里插入图片描述
设备控制表DCT——系统为每个设备配置一张DCT,用于记录设备情况。

在这里插入图片描述
控制器控制表COCT——每个设备控制器对应一张COCT,OS根据COCT的信息对控制器进行操作和管理
在这里插入图片描述

通道控制表CHCT——每个通道对应一张CHCT,OS根据其中的信息对通道进行操作和管理

在这里插入图片描述
系统设备表SDT——记录了系统中所有设备的情况,每个设备对应一个表目
在这里插入图片描述

设备分配的步骤:

  • 根据进程请求的物理设备名查找SDT
  • 根据SDT找到DCT,若设备忙碌则将进程PCB挂到设备等待队列,否则将设备分配给进程
  • 根据DCT找到COCT,若控制器忙碌则将PCB挂到控制器等待队列,否则将控制器分配给进程
  • 根据COCT找到CHCT,通道忙碌则挂到通道等待队列,否则分配给进程
  • 只有设备、控制器、通道三者都分配成功,才能启动IO设备进行数据传送

缺点:用户编程时必须使用物理设备名,不方便编程;若换了一个物理设备,则需要重新编程;若进程请求的物理设备正在忙碌,即使系统中还有同类型的设备,进程也必须阻塞等待。

改进:建立逻辑设备名与物理设备名的映射机制
在这里插入图片描述在这里插入图片描述

IO调度:

用某种算法确定一个好的顺序来处理各个IO请求,如磁盘调度(先来先服务、最短寻道优先、SCAN、CSCAN。。。)

设备保护:

设备被看作一种特殊的文件,系统根据FCB中的信息判断用户是否有访问权限

缓冲区管理

缓冲区是一个存储区域,可以由专门硬件寄存器组成,也可利用内存作为缓冲区。
硬件作缓冲区成本较高、容量较小,一般用在对速度要求非常高的场合;
一般情况下更多利用内存作为缓冲区。设备独立性软件的缓冲区管理就是要组织管理好这些缓冲区

缓冲区的作用:

  • 缓和CPU和IO设备之间速度不匹配的问题
  • 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
  • 解决数据粒度不匹配的问题
  • 提高CPU与IO设备之间的并行性

管理策略:
单缓冲:
若某用户进程请求设备读入若干块数据,OS会在主存中为其分配一个缓冲区。
只有当缓冲区为空时,才能冲入数据,并且必须把缓冲区充满后,才能将数据从缓冲区传出
在这里插入图片描述
在这里插入图片描述

双缓冲:
分配两个缓冲区

在这里插入图片描述
在这里插入图片描述

循环缓冲区:
在这里插入图片描述

缓冲池:
由系统中共用的缓冲区组成。
在这里插入图片描述

在这里插入图片描述

高速缓存cache:
高速缓存是可以保留数据副本的高速存储器

缓冲与高速缓存差别:
缓冲可能是数据项的唯一副本;
高速缓存只是提供了一个驻留在其他地方的数据在高速存储器上的一个副本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边懵懵'.ㅅ'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值