# 设备管理

image-20240116191002678

I/O 系统分为硬件和软件

# I/O 硬件原理

I/O 系统的基本功能

  • 隐藏物理细节
  • 与设备无关性
  • 提高设备利用率
  • 对 I/O 设备进行控制
  • 确保对设备的共享
  • 错误处理

# I/O 设备控制方式

I/O 设备控制方式有轮询、中断、DMA 和通道技术

# DMA (直接存储器存储)

  • CPU 对 DMA 控制器进行设置,给出需要传输的数据的源地址、目的地址、需要传输的数据个数,以及控制信息(如读 / 写),然后就继续其它工作;
  • DMA 控制器获得总线控制权(此时,CPU 无法获得总线),请求 I/O 控制器和内存进行数据读 / 写操作
  • I/O 控制器与内存通过 DAM 控制器进行数据读 / 写操作
  • 每传输一个字,DMA 控制器将计数器减 1,并重复上述操作,直至计数器递减为 0
  • DMA 控制器向 CPU 发出中断请求信号

# 通道技术

通道又称 I/O 处理器,主要解决 I/O 操作的独立性和硬部件工作的并行性

具有通道机制的计算机系统的主机、通道、控制器、设备和设备之间采用四级连接,实施三级控制

CPU 通过执行 I/O 指令对通道实施控制,通道通过执行通道命令对控制器实施控制,控制器发出动作序列对设备实施控制,设备执行相应的 I/O 操作

# I/O 系统设计目的

提高系统的通用性和高效性

  • 通用性

    • I/O 设备的多样化,操作方式各不相同,物理特性各异
    • 增加新的 I/O 设备而无需修改操作系统
    • 向应用程序和操作系统上层软件隐藏 I/O 操作的细节
  • 高效性

    • I/O 设备的速度远远低于 CPU 和 Memory 的速度,是系统的瓶颈所在
    • 提高 I/O 设备的并行性和效率能大大提高系统的整体性能

# I/O 软件原理

I/O 软件包括中断处理程序设备驱动程序独立于 I/O 设备的软件

# 设备驱动程序

实现 I/O 子系统通用性目标的关键技术

设备驱动程序向上提供标准的接口,屏蔽实现细节;向下通过与设备相关的代码控制设备控制器

# 独立于设备的 I/O 软件

  • 缓冲技术(buffering)
  • 缓存技术(caching)
  • 设备虚拟化技术(spooling)
  • I/O 调度

# 缓冲技术

buffering 技术主要用于解决:

  1. CPU、内存和设备之间传输速度不匹配问题
    • 将数据先写入缓冲区再逐一传输到目的设备
  2. 解决传输数据大小不一致问题
    • 网络分包与重组
    • 物理记录大小和逻辑记录大小不一致

# 磁盘调度

# 磁盘组成

image-20240116192733490

  • 盘片 (platter)
  • 磁道 (track)
  • 柱面 (cylinder)
  • 扇区 (sector)
  • 移动臂 (arm)
  • 读写磁头 (head)
  • 轴 (spindle)

# 磁盘块编址

逻辑上可以看做一维的磁盘块的数组

编址方案

  • 最外道柱面的第一个磁道的第一个扇区为 0 号块,第二个扇区为 1 号块
  • 当第一个磁道编完后,接着为同一柱面的第二个磁道编号
  • 当一个柱面的所有磁道都编完号后,为下一个柱面编号

# 磁盘格式化

一个新的磁盘是空的,无法存储数据

# 物理格式化

  • 将磁盘分成扇区,使得磁盘控制器能读写数据

  • 每个扇区是一个特殊数据结构

    • Header
    • data area:通常是 512 字节
    • Trailer
  • header, trailer 包含磁盘控制器所需的信息,如:

    • 扇区号
    • 纠错码 (ECC): 每次读写扇区时,设备控制器自动处理 ECC
  • 格式化过程还将识别包含硬件错误的柱面、以及为每个区预留备用柱面

# 分区与逻辑格式化

通常所说格式化磁盘指的是逻辑格式化

将磁盘的柱面分成一组或多组,每一组称为一个分区,操作系统可以将每个分区当作是一个单独的磁盘

每个分区可以使用不同的文件系统如文件分配表 (FAT), 新技术文件系统 (NTFS)。

# 操作系统的启动流程

  1. 上电自检(Power-On Self-Test,POST): 当计算机上电时,硬件(包括 CPU、内存、硬盘等)会进行自检。如果有硬件故障,系统可能会发出蜂鸣声或显示错误信息。
  2. BIOS 启动:
    • BIOS(Basic Input/Output System): 是计算机的基本输入 / 输出系统,存储在主板上的一个固化的芯片中。它包含了计算机启动时执行的基本硬件初始化和自检代码。
    • POST 完成后: BIOS 将查找可引导的设备,通常是硬盘。BIOS 加载存储在硬盘的引导扇区(Master Boot Record,MBR)中的引导加载程序(Boot Loader)。
  3. 引导加载程序(Boot Loader):
    • 引导加载程序是一个小型的程序,其任务是加载操作系统的核心部分到内存中。在 Windows 系统中,这可以是 NTLDR(New Technology Loader)或 BOOTMGR(Boot Manager);在 Linux 系统中,可能是 GRUB(GRand Unified Bootloader)等。
  4. 加载操作系统核心:
    • 引导加载程序读取操作系统内核文件,并将其加载到内存中。在 Windows 中,内核文件是 ntoskrnl.exe;在 Linux 中,通常是 vmlinuz。
  5. 初始化操作系统:
    • 操作系统内核被加载到内存后,它开始初始化系统的各个组件,包括设备驱动程序、文件系统、网络协议栈等。

# 磁盘数据存储和访问

磁盘物理记录的表示:柱面号,磁头号,扇区号

磁盘数据访问时间构成

  1. 寻道时间,磁盘机根据柱面号控制移动臂做横向机械移动,带动读写磁头到达指定柱面所需的时间
  2. 旋转等待时间,等待被访问的扇区旋转到读写磁头下所需的时间
  3. 数据传输时间,T=brN,b为需要传输的数据,N为一个磁道的数据总量,r为旋转速度T=\frac{b}{rN},b为需要传输的数据,N为一个磁道的数据总量,r为旋转速度

盘片旋转方向一般是逆时针

# 磁盘调度算法

# 移动臂调度算法

对于一组磁盘请求,寻道时间是优化整体性能的关键

目的是最小化磁头移动的距离

# 先来先服务算法 (FIFO)

按照请求柱面号顺序依次执行

image-20240116201747461

# 后来先服务 (LIFO)

按照请求柱面号逆序进行

# 最短服务时间优先算法 (SSTF)

选择距离当前磁头位置最近的请求进行服务

image-20240116201826898

# 扫描算法 (SCAN)
  • 磁头总是朝一个方向移动,服务其中遇到的请求
  • 当到达一端后,调转方向,向另一个方向移动,并服务遇到的请求

电梯调度算法

  • 并不每次沿着一个方向移动到末端,而是移动到当前方向没有请求为止
# 循环扫描算法 (C-SCAN)
  • 磁头从起始位置开始,向一个方向移动,服务遇到的请求
  • 当到达一端后,并不调转磁头移动方向,而是直接移动到起始位置,在返回过程中不服务任何请求
  • 本质上是将柱面看成是一个循环链表.

image-20240116202414582

# LOOK/C-LOOK

基于循环扫描算法,在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向

image-20240116203315972

# 独立磁盘冗余阵列 (RAID)

RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。

RAID 的目的:

  1. 增加容错能力
    • 通过在不同的磁盘上维护冗余数据增加容错能力
  2. 获得高性能
    • 通过把数据分布到多个磁盘,采用并行存取以加快数据传输速率来获得高性能

# 设备分配

# 设备独立性

用户不指定物理设备,而是指定逻辑设备,使得用户作业和物理设备分离开来。

设备独立性是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。

操作系统需要提供逻辑设备到物理设备映射表。

# 虚拟设备

# Spooling 技术

Spooling(Simultaneous Peripheral Operations On-Line)外围设备联机并行操作技术是一种操作系统和计算机系统中常用的一项技术,用于提高计算机系统对于输入输出设备的效率。

  • 用一类物理设备模拟另一类物理设备的技术,是使独占型设备变成共享设备的一种技术

  • 通过高速磁盘实现预输入和缓输出,使得作业执行 I/O 操作时不再需要和低速设备联系,而是和高速磁盘交互

# Spooling 技术应用 -- 共享打印机

打印机属于独占设备,利用 Spooling 技术,可将之改造为一台可供多个用户共享的设备

当用户进程请求打印输出时,SPOOLing 系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:

  1. 由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。
  2. 输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。如果还有进程要求打印输出,系统仍可接受该请求,也同样为该进程做上述两件事。