在我们讨论有关细节pdflush
,kjournald, and
kswapd`,让我们首先得到究竟我们在Linux内核方面谈论的背景下,一些背景知识。
GNU / Linux架构
GNU / Linux的体系结构可以认为是两个空间:
在用户空间和内核空间之间是GNU C库(glibc
)。这提供了将内核连接到用户空间应用程序的系统调用接口。
内核空间可以进一步细分为3个级别:
顾名思义,系统调用接口在glibc
和内核之间提供接口。该建筑独立内核代码由逻辑单元,如VFS(虚拟文件系统)和VMM(虚拟内存管理)。该建筑相关代码是那些处理器和平台特有的代码对于给定的硬件体系结构的组件。
GNU / Linux架构图
在本文的其余部分,我们将集中精力在内核空间内的VFS和VMM逻辑单元上。
GNU / Linux内核的子系统
VFS子系统
通过对GNU / Linux内核的结构有一个高级概念,我们可以更深入地研究VFS子系统。该组件负责提供对各种块存储设备的访问,这些块存储设备最终映射到物理设备(HDD /等)上的文件系统(ext3 / ext4 /等)。
VFS图
该图显示write()
了用户流程中的a 如何遍历VFS,并最终向下到达设备驱动程序,然后将其写入物理存储介质。这是我们遇到的第一个地方pdflush
。这是一个后台驻留程序,负责将脏数据和元数据缓冲区块刷新到后台的存储介质中。该图未显示此内容,但还有一个守护程序,kjournald
位于旁边pdflush
,执行类似的任务,将脏日志块写入磁盘。注意:日志块是ext4和JFS之类的文件系统在进行更改之前如何跟踪文件中磁盘更改的方式。
上述细节在进一步讨论本文。
write()
步骤概述
为了提供I / O系统系统操作的简单概述,我们将使用一个示例,其中该函数write()
由User Space应用程序调用。
- 进程请求通过
write()
系统调用写入文件。
- 内核更新映射到文件的页面缓存。
- pdflush内核线程负责将页面缓存刷新到磁盘。
- 文件系统层将每个块缓冲区放在一起
bio struct
(请参见第23页的1.4.3,“块层”),然后向块设备层提交写请求。
- 块设备层从上层获取请求并执行I / O电梯操作,然后将请求放入I / O请求队列。
- 设备驱动程序(例如SCSI或其他设备特定的驱动程序)将负责写操作。
- 磁盘设备固件执行硬件操作,例如搜索头,旋转以及将数据传输到磁盘上的扇区。
VMM子系统
继续进行更深入的研究,我们现在可以研究VMM子系统。该组件负责维护主内存(RAM),交换和物理存储介质之间的一致性。保持一致性的主要机制是bdflush
。由于内存页被视为脏页,因此需要将其与存储介质上的数据同步。bdflush
将与pdflush
守护程序协调以将此数据与存储介质同步。
VMM图
交换
当系统内存不足或内核交换计时器到期时,kswapd
守护程序将尝试释放页面。只要可用页面数保持在之上free_pages_high
,kswapd
就什么都不做。但是,如果可用页面数降至以下,kswapd
则将开始页面回收过程。在kswapd
将页面标记为可重定位之后,bdflush
将注意通过pdflush
守护程序将所有未完成的更改同步到存储介质。
参考资料和进一步阅读