读 Architecture and Design of the Linux Storage Stack

Online Transaction Processing (OLTP),存储的性能经常成为关注焦点。服务I/O请求的最小延迟都可能影响应用程序的总体响应。
任何用户空间应用程序想要访问内核空间的资源,都必须生成一个系统调用
用户和内核空间的这个概念深深植根于现代处理器的设计中。传统的x86 CPU使用保护域的概念,称为环(ring),来共享和限制对硬件资源的访问。处理器提供四个环或模式,编号从0到3。现代处理器设计为在这些模式中的两个,环0和环3,进行操作。用户空间应用程序在环3中处理,它对内核资源的访问受到限制。内核占据环0。这是内核代码执行和与底层硬件资源交互的地方。

- block filesystem: 块大小是文件系统的一个属性,在设备上创建文件系统时只能设置它。块大小指示文件系统在读取或写入数据时使用的大小。我们可以将其视为文件系统存储分配和检索的逻辑单位。因此,可以以块为单位访问的设备被称为块设备。任何连接到计算机的存储设备,无论是硬盘还是外部USB,都可以被归类为块设备。
- cluster filesystem: 集群文件系统允许单个文件系统被多个主机同时挂载和使用。集群文件系统基于共享存储的概念,这意味着多个主机可以同时访问同一个块设备。Linux中常用的集群文件系统有Red Hat的Global File System 2 (GFS2)和Oracle Clustered File System (OCFS)。
- network filesystem: NFS使用客户端和服务器的概念。后端存储由NFS服务器提供。NFS文件系统挂载的主机系统被称为客户端。客户端和服务器之间的连接使用传统的以太网实现。所有NFS客户端共享NFS服务器上的一个文件副本。NFS的性能不如块文件系统,但它仍然在企业环境中被使用,主要用于存储长期备份和共享公共数据
- pesudo filesystem: 存在于内核中,并动态生成其内容。它们不用于持久性地存储数据。它们的行为与如Ext4或XFS这样的常规磁盘文件系统不同。伪文件系统的主要目的是允许用户空间程序与内核交互。如/proc(procfs)和/sys(sysfs)这样的目录属于此类别
关于系统调用和应用程序编程接口(API)之间的差异,经常会有些混淆。API是一个程序使用的一组编程接口。这些接口定义了两个组件之间的通信方法。API在用户空间中实现,并概述如何获取特定的服务。系统调用是一个更低级的机制,它使用中断向内核明确请求。Linux中的标准C库提供了系统调用接口。
文件描述符是一个用于访问文件的整数。例如,当使用open()系统调用打开文件时,文件描述符会返回给调用进程。一旦文件被打开,程序使用文件描述符对文件执行操作。所有的读、写和其他操作都是使用文件描述符执行的。
每个进程始终至少打开了三个文件 - 标准输入、标准输出和标准错误 - 分别由0、1和2的文件描述符表示。下一个打开的文件将被分配文件描述符值3。