linux页高速缓存

磁盘由于其速度慢和局部性原理(被访问后容易短时间再被访问),我们考虑对磁盘内容进行缓存
可以只缓存文件的一部分
读:我们考虑先缓存中读,无法命中就磁盘读并加入缓存,以后读相同数据就可以缓存命中了。
写:我们考虑写入缓存中,缓存中页面标记为脏,加入脏页链表,由其他进程合适时机写入磁盘(延迟写可以在以后时间合并更多数据和再一次刷新)

缓存大小可以动态调整,假设我们进行缓存回收(缩容或者给其他更重要项腾位置),那么回收谁呢
考虑lru算法,考虑双链(活跃链表和非活跃链表),只从非活跃链表头部移除数据。类似innodb内存池的lru列表(防止表扫把活跃数据也清除了,考虑数据如何在两部分之间移动)
加入活跃侧:页高速缓存?,innodb数据在内存中超过一定时间
活跃侧移到非活跃侧:页高速缓存活跃链表太多头页面移到非活跃链表,innodb?

页高速缓存:缓存各种文件和内存映射,由内存页面组成,单页内可能包含不连续的块
address_space: 含inode(如果缓存的是一个可以用inode描述的对象如文件,此域有值,否则为null),含页的radix(基)树,页总数
inode也含address_space
存在多个vm_area_struct(mmap)映射同一个address_space

find_get_page:在address_space(从其内部radix树)里根据page的偏移找特定page
实际读操作:读取某个文件的某个offset,files_struct -file-dentry-inode-address_space-radix树
文件位置offset可转换为address_space内的页偏移和页内位置:取模,固定的
文件位置offset转换为文件系统逻辑块号和磁盘扇区号:inode含i_blocks(块数),offset算出file block number,文件系统将某个文件和文件内的file block number换算成文件系统逻辑块号,驱动根据文件系统和系统内逻辑号换算出磁盘扇区号,固定的,取模
综上,某个偏移的页放哪些块的映射关系是固定的。
文件字节偏移量 --> 页偏移量 --> 文件系统块号 block --> 磁盘扇区号
读操作:先find_get_page,找不到page,分配一个新page并加入address_space,调用readpage从磁盘读取新页(用一个或多个bio,多个是因为页内含不连续的块)的内容
写操作:先find_get_page,找不到page,分配一个新page并加入address_space, 数据从用户空间拷贝到缓存中,

缓冲区高速缓存:我们看到page cache里一个page代表了文件的一部分内容,同时也代表了几个缓冲区,这两者如何统一呢,page struct 指向页内首个buffer_head,页内所有buffer_head链表连接,找出page里所有的缓冲区。
页高速缓存包含缓冲区高速缓存,避免同样的数据内存里放两份
在这里插入图片描述
在这里插入图片描述

脏页刷新时机:
1空闲内存不足(低于某阈值),刷新脏页以便释放内存
2周期性(宕机了,页面内容没有刷到磁盘上)
3sync和fsync
对于脏页链表的每个脏页,生成bio结构(一个或多个)加入块设备请求队列,加入过程本身调用I/O调度程序(是否合并和插入队列的位置)。
驱动程序从队列获取请求并实际操作是在什么时候什么线程内?

最早bdflush,kupdated:bdflush用于内存不足,只有一个线程,kupdated周期写脏页
然后pdflush:多个线程(线程数量根据io负载动态变化),每个线程都可服务于所有块设备,但可能所有线程都阻塞在某个设备的请求队列上,拥塞回避(尽量从没有拥塞的队列回写页)
目前flusher: 每个块设备一个,
低于阈值,唤醒flusher刷新脏页直到(高于阈值且已刷新指定数量脏页)
flusher周期性被唤醒(定时器,唤醒后重新初始化定时器)刷新超过指定时间脏页

一个块设备可以多个分区,每个分区可不同文件系统
脏页链表:暂时确定不了脏页链表一定会挂在哪几个上,是设备还是文件系统(超级块)还是文件(address_space)
不过address_space是有的,writepages函数刷新address_space的脏页链表

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值