4.8.2 页高速缓存
页高速缓存用来加速对磁盘上的映像和数据的访问。页高速缓存用来缓存某个文件的逻辑内容,并通过文件的VFS索引节点和偏移量访问。页从磁盘上读到物理内存时就缓存在页高速缓存中。下面一段源代码就是把读入的页存于缓存中:
void add_to_page_cache_locked(struct page * page,struct address_space * mapping,
unsigned long index)
{
spinlock_t * pg_lock;
if(!PageLocked(page))
BUG();
page_cache_get(page);
pg_lock=__PAGECACHE_LOCK(mapping, index);
spin_lock(pg_lock);
page-〉index=index;
add_page_to_inode_queue(mapping, page);
add_page_to_hash_queue(page, page_hash(mapping, index));
lru_cache_add(page);
spin_unlock(pg_lock);
}
当一个磁盘块被调入内存时,它首先存放在一个buffer cache中,每个buffer cache与一个磁盘块对应,它相当于磁盘块在内存中的表示,每个buffer cache都有一个对应的描述符,叫做buffer_head。buffer_head的目的在于描述磁盘块和物理内存缓冲区之间的映射关系。因此,buffer_head作为I/O操作的单元,不仅描述了从磁盘到物理内存的映射,而且还是所有块I/O操作的容器。在2.6节中,I/O操作系统基本容器变为bio结构了。
page cache是由内存中的物理页组成的,缓存中的每一页对应着磁盘中的多个块。其核心数据结构为address_space。在执行I/O操作,比如read()操作,内核首先会检查数据是否已经在页高速缓存中,如果在,那么内核就可以马上从页高速缓存中得到所需要的页,而不需要从磁盘中读取数据了。
page cache是VFS的需要,buffer cache是面向设备的,buffer cache是以块为单位的,属于设备驱动层,page cache是以页为单位的,属于文件系统层,策略不同,联系不同,还可能没联系。内核中在多处使用了page cache策略,比如页面交换、磁盘文件的读取。
系统在读磁盘文件时,是以块为单位读取,并放在内存中(buffer cache),由buffer_head或bio记录其映射信息。由几个块构成一页(page cache),由address space记录页内容和inode(文件)之间的联系。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。