linux buff/cache
要理解下面内容,最好对操作系统存储有一定的了解,包括缺页中断等对于物理内存的使用方式和cpu操作硬盘的大概过程等。
linux存在系统buff/cache和CPU cache不同的缓存机制,系统的buff/cache是用于提高硬件IO的操作效率,cpu cache的左右是提高cpu操作内存的效率,这摘抄部分关于系统cache的内容,关于cpu内容的后续会补上。
我们在用户层面上对磁盘文件的各种访问,体现在内核里,则最终转化为针对磁盘(块设备)的一系列I/O操作。
扇区是块设备的基本单元,也是最小的寻址单元,但是内核却并不是按照扇区来执行磁盘操作,而是于扇区之上又抽象出了一个“块”的概念。内核执行的所有磁盘操作都是按照块来进行的,每个块的大小必须数倍于扇区,而且不能超过一个页面的长度,所以块通常的大小是512Byte、1KB或者4KB。
内核只能基于块来访问物理文件系统,所以与扇区是块设备的最小寻址单元相对应,块也被称为是文件系统的最小寻址单元。一个磁盘块被调入内存时,它需要存储在一个缓冲区中,这个缓冲区就是块在内存中的表示,它在内核中使用structbuffer_head来描述。每个块在内存中都与一个缓冲区相对应,同时都拥有一个buffer_head对象。
内核只能基于块来访问物理文件系统,所以与扇区是块设备的最小寻址单元相对应,块也被称为是文件系统的最小寻址单元。一个磁盘块被调入内存时,它需要存储在一个缓冲区中,这个缓冲区就是块在内存中的表示,它在内核中使用structbuffer_head来描述。每个块在内存中都与一个缓冲区相对应,同时都拥有一个buffer_head对象。
因为内核基于块来访问物理文件系统,而磁盘块与内存中的缓冲区又是一一对应的映射关系,所以为了提高对磁盘的存取效率,内核引入了缓冲区缓存的机制,将通过VFS访问的块的内容缓存在内存中。
在旧版本的内核中,page cache和buffer cache是两个独立的缓存, 前者缓存页,后者缓存块,但是一个磁盘块可以在两个缓存中同时存在,因此除了耗费了额外的内存外,还需要对两个缓存中的内容进行同步操作。 从2.4.10内核开始,buffer cache不再是一个独立的缓存,如图10.8所示的那样,它被包含在page cache中,通过page cache来实现。 对于4KB大小的page来说,根据不同的块大小,它可以包含1~8个缓冲区。
摘自《linux内核修炼之道》
2023-08-29 广告