[Linux内存]页缓存和块缓存

本文详细介绍了Linux内核中的页缓存机制,包括页缓存的两种通用缓存方案:页缓存(pagecache)和块缓存,内核管理页缓存使用的数据结构基数树(radix tree),以及如何将修改后的数据回写到物理设备的方法。此外还深入探讨了地址空间(address_space)的概念及其在页缓存中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, 内核为设备提供了两种通用的缓存方案:
a, 页缓存(page cache)
b, 块缓存


2,内核管理页缓存所用的数据结构
内核通过基数树(radix tree)来管理页缓存的,


3,内核如何回写内存中修改的数据到物理设备
a, 内核的守护进程在后台运行,为pdflush,这些守护进程周期性激活,
b, pdflush的第二种运作模式是:如果缓存中修改的数据项目数目在短期内显著增加,则由内核激活pdflush.
c,内核提供了相关的系统调用,如sync()



4,地址空间的概念
页缓存中的页是通过地址空间(address_space)来和物理设备内存(如底层文件系统的struct inode结构)相互关联的。对应与page结构的struct address_space *mapping成员。
(1)       如果page->mapping等 于0,说明该页属于交换告诉缓存swap cache
(2)       如果page->mapping不 等于0,但第0位为0,说明该页为匿名也,此时mapping指向一个struct anon_vma结构变量;
(3)       如果page->mapping不 等于0,但第0位不为0,则apping指向一个struct address_space地址空间结构变量;

struct address_space {
	struct inode                 *host;           /*拥有节点*/
	struct radix_tree_root       page_tree;       /*包含全部页面的radix树 */
	spinlock_t                   tree_lock;       /*保护page_tree的自旋锁*/
	unsigned int                 i_mmap_writable;  /* VM_SHARED计数*/
	struct prio_tree_root        i_mmap;          /*私有映射链表*/
	struct list_head             i_mmap_nonlinear; /* VM_NONLINEAR 链表*/
	spinlock_t                   i_mmap_lock;      /* 保护i_mmap的自旋锁 */
	atomic_t                     truncate_count;   /* 截断计数*/
		 unsigned long                nrpages;          /* 页总数*/
	pgoff_t                      writeback_index;  /* 回写的起始偏移*/
	struct address_space_operations    *a_ops;     /* 操作表*/
	unsigned long                flags;           /* gfp_mask 掩码与错误标识*/
	struct backing_dev_info      *backing_dev_info;    /*预读信息*/
	spinlock_t                   private_lock;     /*私有address_space锁*/
	struct list_head              private_list;    /*私有address_space链表*/
	struct address_space         *assoc_mapping;  /*相关的缓冲*/

};
比如页高速缓存中页的拥有者是一个文件的时候,那么此时索引节点的i_mapping字段总是指向索引节点的数据页所有者的address_space.而address_space对象就嵌入在VFS索引节点对象的i_data字段中。而address_space中的字段host则指向它所有者的索引节点对象。



5,页缓存的常用操作函数

页高速缓存的还有几个常用处理函数:查找页,增加页,删除页更新页。

struct page * find_get_page(struct address_space *mapping, unsigned long offset)
unsigned find_get_pages(struct address_space *mapping, pgoff_t start,unsigned int nr_pages, struct page **pages)
struct page *find_lock_page(struct address_space *mapping,unsigned long offset)
struct page *find_trylock_page(struct address_space *mapping, unsigned long offset)
struct page *find_or_create_page(struct address_space *mapping,unsigned long index, unsigned int gfp_mask)
int add_to_page_cache(struct page *page, struct address_space *mapping,pgoff_t offset, int gfp_mask)
remove_from_page_cache(struct page *page)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值