操作系统中的块设备和字符设备

7 Jan 2025 | 11分钟阅读

在本文中,我们将讨论操作系统中的块设备字符设备,包括它们的组成部分、用例和示例。

设备简介

在操作系统领域,设备是处理数据输入和输出的硬件组件。这些设备对于计算机与其环境通信至关重要。换句话说,设备可分为几种类型。输入设备包括键盘和鼠标;输出设备包括显示器和打印机;存储设备包括硬盘驱动器。通信方面有网络接口等。这些各种设备之间的和谐运行对于操作系统的有效管理至关重要。

设备管理的重要性

控制和协调连接到计算机的各种硬件组件是操作系统的一个重要部分,称为设备管理。设备管理在获得最大系统性能、可靠性和可接受的用户体验方面具有最重要的意义。它使得操作系统与硬件设备之间的交互有了一个清晰的标准。

设备管理的一个重要方面涉及资源的分配方式,以便多个进程都能使用设备而不会发生冲突。此外,设备管理还涉及处理中断。中断是由硬件生成的信号,用于通知操作系统已发生特定事件,例如数据到达或任务完成。必须妥善处理这些中断,否则数据将无法及时准确地处理。

块设备和字符设备

由操作系统控制的设备可分为两大类:块设备字符设备。块设备以固定大小的块存储和检索数据,这允许真正的随机访问。此类包括硬盘驱动器和固态硬盘等存储设备,其中数据以块的形式排列。系统可以独立访问任何这些块来读取或写入数据。

然而,字符设备一次一个字符地串行处理数据。键盘和串行端口等设备的典型方向是流式数据。与块设备相反,字符设备不支持随机访问,并且数据是按接收顺序处理的。

块设备简介

块设备是操作系统的一种基本设备类型。它们以固定大小的块或数据块的形式存储和访问数据。它们通常有几千字节大小,代表可以在硬盘上读取或写入的最小单位。块设备在其数据访问功能方面有所不同。字符设备单独处理信息,而块类型可以随机读取或写入。

块设备的许多流行应用涉及长期存储;例如硬盘驱动器 (HDD)固态硬盘 (SSD),它们被称为大容量存储。

块设备操作

从块设备读取

  • 读取涉及从块设备的指定块获取数据。操作系统从存储介质读取数据,并将其传递给应用程序或必需的进程。读取通常指定将从中读取数据的块地址或位置。由于块设备是随机访问的,操作系统可以直接检索单个指定的块,而无需读取前面的块。
  • 检索存储的信息是应用程序的重要操作,例如需要从存储介质检索数据的​​文件系统,以便允许访问。

写入块设备

  • 将数据存储在指定块上称为写入块设备。操作系统通常负责读取和写入。它确保已知数据存储在其指定的块地址。块设备提供随机访问,因此操作系统可以写入任何块的数据,而不会破坏或更改其他块。
  • 保存对文件的更改: 对于创建或更新数据的应用程序(例如文件系统)的基本操作。

随机访问

  • 块设备有一个显着特征,即随机访问。操作系统可以读取或写入任何给定的数据块,而无需处理副本,例如存储在磁带上的副本。这与顺序访问设备不同,后者必须线性地读取或写入数据。计算机内存的随机访问能力提高了检索、存储或访问数据的效率和速度。

块设备接口的组成部分

块设备接口是一个复杂的系统,可简化操作系统与块设备之间的通信。设备驱动程序、I/O 调度程序和缓冲区缓存等组件结合在一起,提供了一种方便而有效的方式来处理多个块设备。现代操作系统具有灵活而强大的块设备处理结构。这是因为该接口支持 DMA、错误报告机制、热插拔功能等。

设备驱动程序

  • 设备接口严重依赖设备驱动程序。这些软件模块与操作系统和特定的块设备进行交互。设备驱动程序将操作系统通用的 I/O 请求转换为单个块设备可以理解的请求。设备特定细节的复杂性被抽象出来,以使操作系统不必为每种设备具有不同的命令集。

I/O 调度程序

  • 块设备接口采用 I/O 调度程序,该调度程序以最高效的顺序安排读写操作。它控制输入/输出请求的计时,从而提高整体系统性能。I/O 调度程序通过策略性地对请求进行排序以优化寻道时间和考虑局部性等因素,从而尝试减少延迟并提高从块设备到用户的 I/O 传输效率。

缓冲区缓存

  • 缓冲区缓存是一个临时缓冲区区域,其中包含从块设备最近访问或修改的数据块。它旨在通过充当缓存机制来加速读写操作。如果操作系统需要从块设备读取数据,它会首先查看缓冲区缓存。如果信息已存在,则可以比访问较慢的存储介质更快地从缓存中检索信息。

原始 I/O 和直接 I/O

原始 I/O

原始 I/O,简称原始磁盘 I/O,涉及在最低级别与块设备进行交互。在块设备接口中,原始 I/O 意味着应用程序与块设备之间的直接交换,绕过了文件系统操作。

特性

  • 无文件系统中介: 原始 I/O 直接在块设备上工作,因此不需要文件系统结构。它允许应用程序访问设备上的原始数据;它忽略文件系统元数据和结构。
  • 性能提升:原始 I/O 没有与文件系统操作相关的开销,在某些应用程序中可以获得更好的性能。在需要对数据访问进行精细控制和进行低级磁盘操作非常重要的场景中,它尤其有利。

用例

操作系统中的原始 I/O 有多种用例。原始 I/O 的一些主要用例如下:

  • 数据库系统:许多数据库管理系统会绕过文件系统缓存,并使用原始 I/O 直接从存储设备读取数据。这提供了更好的数据放置控制,并可以提高数据库性能。
  • 专业应用程序:对性能有严格要求的应用程序,包括实时程序或数据密集型的科学模拟,可以选择原始 I/O 来实现对数据的更可预测和高效的访问。

直接 I/O

直接 I/O,或简称为直接磁盘 I/O (DIO),是一种允许应用程序直接在主内存中执行输入输出操作的技术,而无需通过操作系统缓冲区缓存。在块设备接口下,直接 I/O 提供了一种绕过缓冲区缓存并将数据直接从应用程序内存空间传输到块设备内存空间或从中传输的.。

特性

  • 绕过缓冲区缓存: 与传统操作不同,直接 I/O 不涉及在系统缓存中缓冲数据。由于数据直接在应用程序缓冲区和块设备之间传输,因此减少了缓存管理的开销。
  • 可预测的延迟: 对于必须保证对 I/O 操作进行精确控制的应用程序,直接 I/O 可提供更可预测的延迟。应用程序可以实现更稳定的性能,而不会出现缓存引入的变异。

用例

操作系统中的直接 I/O 有多种用例。直接 I/O 的一些主要用例如下:

  • 实时系统:然而,有实时要求的应用程序可以利用直接 I/O,因为保持一致的低延迟 I/O 操作极其重要。
  • 大数据传输:例如,在需要海量数据传输的情况下(例如用于多媒体流或科学计算),最大限度地减少原始内容的复制和高效地移动所有可能的来源至关重要。

与块设备接口的关系

与块设备的集成

设备接口与原始 I/O 和直接 I/O 密切相关。这些方法为应用程序访问块设备提供了替代通道,从而实现了直接和低级别的交互。

注意事项

  • 应用程序实现:使用原始 I/O 或直接 I/O 的应用程序必须自行处理这些低级细节。必须仔细实现以确保同步正确完成,并严格遵守块设备的某些特殊特性。
  • 安全性和可靠性:由于这些方法避免了更高级别的抽象,应用程序必须在实现中更明确地处理数据完整性问题、错误和安全问题。

块设备中的错误校正

  • ECC(纠错码):许多块设备,特别是那些处理关键数据的设备,例如企业存储系统,使用 ECC 来检测和纠正错误。由于ECC 添加了这些额外信息,系统可以检测和纠正由电磁干扰或介质退化等因素引起的错误。
  • 坏块管理:块设备还提供了处理坏块的方法,这些坏块是存储中变得不可靠的区域。设备中的某些块可能会随着时间的推移出现错误,而良好和坏块的管理需要确保这些故障区域不存储或检索任何数据。

块设备中的安全措施

  • 全盘加密:块设备可能包含全盘加密以提高数据安全性。这意味着块设备的所有内容都必须加密。
  • 安全擦除:一些块设备支持安全擦除功能,该功能可以彻底且不可逆地删除存储介质上的数据。在关闭设备时这一点尤为重要,这样就无法访问任何剩余数据。

算法优化

在块设备中,I/O 调度程序决定读写请求的服务顺序。高端调度程序使用算法来最大限度地减少磁盘访问的频率和距离,从而减少寻道时间,同时提高系统性能。示例包括CFQ(完全公平排队)、Deadline 和预期调度程序。

SSD 感知调度程序

随着固态硬盘的广泛使用,一些 I/O 调度程序将变得 SSD 感知。由于 SSD 没有机械部件,这些调度程序会考虑这种结构和 I/O 操作安排的差异,从而延长 SSD 产品的寿命并提高性能。

SCM 作为块设备

例如,3D XPoint 技术是一种介于传统 RAM 和存储之间的非易失性内存。与块设备一样,SCM 提供低延迟、字节可寻址的访问,类似于 RAM。

块设备示例

操作系统中有多种块设备示例。其中一些如下:

1. 硬盘驱动器 (HDD)

块设备最常见的例子是硬盘驱动器。HDD 使用磁存储在旋转磁盘上的块中存储数据。此外,每个块都有一个不同的地址。这意味着操作系统可以任意访问数据。HDD 以其大存储容量而闻名;它们已被大规模生产并广泛用于个人计算机、服务器和其他计算设备中以存储长期数据。

2. 固态硬盘 (SSD)

另一种常见的块设备类型是固态硬盘,它因其速度和可靠性而越来越受欢迎。与 HDD 不同,SSD 使用基于 NAND 的闪存进行存储。HDD 和 SSD 的组织方式相同;它们以块的形式存储数据,操作系统可以对这些小单元进行随机读写操作。SSD 的数据访问时间更快、更稳定,因此适用于速度和稳定性很重要的应用程序。

3. USB 驱动器

USB 驱动器,也称为闪存U盘,是使用 NAND 闪存存储数据的便携式块设备。这些设备通过 USB 端口连接到计算机,通常用于数据传输、备份或便携式存储。与其他块设备一样,USB 驱动器可以随机访问存储的信息。您可以直接读取和写入特定文件,而无需像使用过时的顺序 I/O 操作的硬盘驱动器那样逐个或多个块读取的过程。

字符设备

一次一个字符地串行处理数据是操作系统中使用设备的根本。与以固定大小的块存储数据并具有随机访问能力的块设备不同,字符设备将数据作为连续流进行管理。当数据以线性方式处理或生成时,字符设备对于管理输入和输出至关重要。

键盘、鼠标和其他类似的输入单元通常属于此类。此类设备通过传递单个字符与操作系统进行通信,从而实现即时交互式数据处理。

字符设备操作

从字符设备读取

  • 要从字符设备读取数据,必须一次一个字符地检索信息。操作系统负责从系统中读取数据并将其发送到应用程序或过程。读取通常意味着按接收顺序一次读取一个字符。
  • 对于需要实时或交互式输入的应用程序(例如命令行界面或文本编辑器),从字符设备读取是必要的。操作系统会在接收到字符时对其进行缓冲,并使其可供应用程序读取。

写入字符设备

  • 字符设备涉及逐个字符地发送数据。操作系统负责写入过程,确保字符被正确发送到设备。字符设备上的数据是按顺序处理的,因为数据是单独接收的。
  • 将临时文件写入字符设备对于生成连续数据流输出的应用程序是必需的,例如将文本打印到打印机或在终端屏幕上显示信息。

顺序访问

  • 字符设备的主要功能之一是顺序访问。与允许以固定大小的块访问数据的块设备不同,字符设备以线性和顺序方式处理数据。信息按到达或离开的顺序读取和写入,因此与数据流中的特定位置没有直接的链接。
  • 键盘(一次键入一个字符)或打印机(以该方式打印)等设备非常适合顺序访问。

示例:键盘、鼠标、串行端口

输入子系统框架

大多数操作系统都有复杂的输入子系统框架,为处理字符设备提供事件驱动的结构。这些框架控制输入事件的流程,让应用程序监听特定的类型。输入事件包括键盘快捷键和基于手势的修改等。

输入设备抽象

输入子系统中的抽象层支持设备无关的编程。应用程序可以响应通用输入事件。然后,子系统会将这些事件转换为设备相关的函数,并为触摸屏、键盘和鼠标等不同字符设备提供统一的接口。

多路复用和解复用

许多字符设备可以支持多路复用,从而允许多个应用程序同时使用一个设备。例如,像tmux 这样的终端多路复用器允许您在一个字符设备上运行多个终端会话。解复用机制可以区分输入和输出并对其进行适当路由。

进程间通信 (IPC)

字符设备可以作为进程之间通信的通道。使用字符设备进行进程间通信可以非常有效地实现应用程序之间的数据交换和同步。例如,命名管道和 Unix 域套接字就是此类示例。

量子计算的影响

量子计算为块设备和字符设备带来了新的考虑。量子比特可能仅用于量子存储,即这些基本不同的架构可能会彻底改变经典系统所设定的边界。

NVMe 协议

NVMe 是一种用于操作系统与 PCI Express 上的固态硬盘 (SSD) 之间通信的新协议。它在低延迟、并行性和可伸缩性方面也提供了巨大的改进,非常适合当今的存储设备。

多队列支持

NVMe 引入了多队列支持的概念,该概念允许同时进行 I/O 操作,解决了传统存储协议的问题,并在包含多个核心或线程的环境中提供了改进的性能。