文章目录
沉淀、分享、成长,让自己和他人都能有所收获!😄
📢本篇将介绍 Linux 存储系统的 I/O 原理。
Linux 驱动课程火热更新中,限时优惠!!!
放大招!瑞芯微底层驱动课程~|
一、Linux 存储系统全景
我们可以把 Linux 存储系统的 I/O 栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。

根据这张 I/O 栈的全景图,我们可以更清楚地理解,存储系统 I/O 的工作原理。
- 文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
- 通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。
- 设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。
存储系统的 I/O ,通常是整个系统中最慢的一环。所以, Linux 通过多种缓存机制来优化 I/O 效率。
比方说,为了优化文件访问的性能,会使用页缓存、索引节点缓存、目录项缓存等多种缓存机制,以减少对下层块设备的直接调用。
同样,为了优化块设备的访问效率,会使用缓冲区,来缓存块设备的数据。
二、Linux 存储系统的缓存
缓存机制在优化 I/O(输入/输出)效率方面起着关键作用,它可以显著提高数据访问速度并降低对底层存储设备的频繁访问。以下是缓存如何优化 I/O 效率的几个方面:
- 读缓存: 当应用程序从存储设备读取数据时,数据首先被加载到内核的缓存中(Page Cache)。如果同一块数据被多次请求,内核可以直接从缓存中返回数据,而不必再次访问慢速的存储设备,从而大大减少读取延迟。
- 写缓存(延迟写): 当应用程序执行写操作时,数据首先被写入缓存,然后内核在适当的时机将数据异步地刷新到实际的存储设备。这种延迟写的机制可以减少频繁的磁盘写入操作,从而提高写入操作的性能。
- 脏页管理: 缓存中的数据可能会被修改,这些修改后的数据称为脏页。内核会在适当的时机将脏页刷新到磁盘,以保持缓存和磁盘数据的一致性。
- 预读取(Read-Ahead): 内核可以根据访问模式预测应用程序接下来可能读取的数据,然后提前将这些数据读取到缓存中。这可以减少后续读取操作的等待时间。
- 写时复制(Copy-On-Write): 在某些情况下,如果多个进程共享同一块数据,内核可以使用写时复制机制,只在数据被修改时复制数据,从而减少不必要的数据复制。
- 热数据缓存: 缓存机制还可以通过识别频繁访问的“热数据”并将其保留在缓存中来提高性能。这可以通过缓存算法和机制来实现,例如LRU(最近最少使用)算法。
- 透明性: 缓存对应用程序来说是透明的,应用程序无需关心数据是否在缓存中,因为内核会处理缓存和实际存储设备之间的数据传输。
尽管缓存机制可以显著提高I/O性能,但也需要注意以下几点: - 缓存一致性: 缓存和实际存储设备之间的数据一致性是重要的,因此需要确保缓存中的数据在合适的时机被刷新到存储设备。
- 内存管理: 缓存需要占用系统内存。如果缓存占用过多内存,可能会导致系统的可用内存减少,从而影响其他应用程序的性能。
- 数据持久性: 延迟写的机制可能会导致数据在写入缓存后暂时丢失,因此在涉及到数据持久性要求的情况下,需要谨慎使用缓存机制。