此cache中的块缓冲由设备标志符以及缓冲对应的块号来唯一的表示 。它由两个功能部分组成 。其一是空闲块缓冲链表 。它为每个可支持的块大小提供了一个链表并且系统中的空闲块缓冲在创建或者被丢弃时都被排入此链表中 。当前可支持的块大小为512、1024、2048、4096与8192字节 。其二是cache自身 。它是用一组指向具有相同散列索引值的缓冲链的散列表 。这个散列索引值通过其自身的设备标志符与数据块设备的块号来产生 。图9.7给出了一个带有一些入口的散列表 。块缓冲要么在空闲链表中要么在此buffer cache中 。如果在buffer cache中则它们按照最近最少使用(LRU)链表来排列 。对于每种缓冲类型都有一个LRU链表,系统使用它们来对某种缓冲进行操作,如将带新数据的缓冲写入到磁盘上 。缓冲的类型表示其当前状态,Linux现在支持以下集中类型:
clean
未使用的新缓冲
locked
等待写入且加锁的缓冲
dirty
dirty缓冲 。它们包含新的有效数据,但目前没被调度执行写操作 。
shared
共享缓冲
unshared
以前被共享但现在没有被共享的缓冲
当文件系统需要从其底层物理设备读取一个缓冲块时,它将首先在buffer cache里寻找 。如果在此buffer cache中找不到则它将从适当大小的空闲链表中取得一个clean状态的节点, 同时将新缓冲添加到buffer cache 中去 。如果所需的缓冲位于buffer cache中,那么它可能已经或没有更新 。如果没有被更新或者它为新块则文件系统必须请求相应的数据驱动从磁盘中读取该数据块 。
为了让此buffer cache运行更加有效并且在使用此buffer cache的块设备之间合理的分配cache入口,系统必须对其进行维护 。Linux使用bdflush核心后台进行来对此cache执行许多琐碎工作,但有时作为使用cache 的结构自动进行 。
9.3.1bdflush 核心后台进程
bdflush是对过多的dirty缓冲系统提供动态响应的简单核心后台进程;这些缓冲块中包含必须被写入到硬盘上的数据 。它在系统启动时作为一个核心线程运行,其名字叫"kflushd" 。你可以使用ps命令看到此系统进程 。通常情况下此进程一直在睡眠直到系统中的dirty缓冲数目增大到一定数目 。当分配与丢弃缓冲时,系统中dirty缓冲的数目将做一个统计 。如果其数目超过某个数值则唤醒bdflush进程 。缺省的阀值为60%,但是如果系统急需缓冲则任何时刻都可能唤醒bdflush 。使用update命令可以看到和改变这个数值 。
# update -d
bdflush version 1.4
0:60 Max fraction of LRU list to examine for dirty blocks
1: 500 Max number of dirty blocks to write each time bdflush activated
2:64 Num of clean buffers to be loaded onto free list by refill_freelist
3: 256 Dirty block threshold for activating bdflush in refill_freelist
4:15 Percentage of cache to scan for free clusters
5:3000 Time for data buffers to age before flushing
6: 500 Time for non-data (dir, bitmap, etc) buffers to age before flushing
7:1884 Time buffer cache load average constant
8: 2 LAV ratio (used to determine threshold for buffer fratricide).
但有数据写入缓冲使之变成dirty时,所有的dirty缓冲被连接到一个BUF_DIRTY LRU链表中,bdflush会将适当数目的缓冲块写到磁盘上 。这个数值的缺省值为500 。
9.3.2update进程
update命令不仅仅是一个命令;它还是一个后台进程 。当作为超级用户运行时(在系统初始化时)它将周期性调用系统服务例程将老的dirty缓冲冲刷到磁盘上去 。它所完成的这个工作与bdflush类似 。当一个dirty缓冲完成此操作后, 它将把本应写入到各自磁盘上的时间标记到其中 。update每次运行时它将在系统的所有dirty缓冲中查找那些冲刷时间已过期的 。这些过期缓冲都被写入到磁盘 。
- 诺基亚将在更多产品上采用Linux操作系统
- 蛤蟆皮的功效与作用 蛤蟆皮的功效
- Linux 核心--7.PCI设备
- Linux 核心--8.中断与中断处理
- 椰子汤的功效与作用 椰子汤有什么功效
- Linux操作系统如何限制SSH密码尝试次数
- 微软公司对Linux操作系统使出的各种杀招
- Linux 核心--4.内存管理
- 以Linux做路由器的问题
- Linux 核心--1.前言
