最近要接触相关领域,学习一下共勉!!本文档使用linux为linux-4.4.4版本
- 磁盘高速缓存:是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问不用再访问磁盘而能尽快得到满足。
- 一种对完整的数据页进行操作的磁盘高速缓存。
- 几乎所有的文件读和写操作都依赖于页高速缓存。只有在O_DIRECT标志被置位而进程打开文件的情况下才会出现例外:此时,IO数据绕过了页高速缓存,而使用了进程用户态地址空间的缓冲区;少数数据库应用软件为了能采用自己的磁盘高速缓存算法而使用O_DIRECT标志。
- 使用页高速缓存目的:
- 快速定位含有给定所有者相关数据的特定页。为了尽可能充分发挥页高速缓存的优势,对它采用高速的搜索操作。
- 记录在读或写页中的数据时应当如何处理高速缓存中的每个页。例如:从普通文件、块设备文件或交换区读一个数据页必须用不同的实现方式。因此内核必须根据页的所有者选择适当的操作。
address_space 对象
页高速缓存的核心数据结构是address_space对象-----是一个嵌入在页所有者的索引节点对象中的数据结构。
- 每个页描述符都包括把页链接到页高速缓存的两个字段mapping和index。mapping字段指向拥有页的索引节点的address_space对象,index字段表示在所有者的地址空间中以页大小为单位的偏移量,也就是在所有者的磁盘映像中页中数据位置。在页高速缓存中查找页时使用这两个字段。
- address_space 对象的字段
struct address_space {
struct inode *host; /* owner: inode, block_device 指向拥有该对象的索引节点的指针*/
struct radix_tree_root page_tree; /* radix tree of all pages 表示拥有者页的基数radix tree 的根*/
spinlock_t tree_lock; /* and lock protecting it 保护基树的自旋锁 */
atomic_t i_mmap_writable;/* count VM_SHARED mappings 地址空间中共享内存映射的个数*/
struct rb_root i_mmap; /* tree of private and shared mappings radix优先搜索树的根 */
struct rw_semaphore i_mmap_rwsem;