linux普通高速缓存,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值