|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
研究 linux 内核 - 页高速缓存(cache)
1 g5 p" k( X( k8 Z
; b F% O/ t4 Q* A3 |4 H! n7 u, T5 b: Z( k: ~! G
9 S0 ~" L; {7 R# N; A6 Q% R4 V3 H
* ~5 H N1 @# y- q1,说在前面
3 [" l+ O$ x1 p7 {* Y/ H Z0 M5 k* v! X& s
' f) L. g* y q4 @0 e1》页高速缓存是内存的一部分,只是用途是用来缓存磁盘块的。7 y1 g6 X# I" x' P: `- L7 j# y
2》页高速缓存存在基于两方面因素,访问内存的速度要远远高于访问磁盘,临时局部原理(tmporal locality)$ F1 W+ K x f2 _
3》核心结构体:struct address_space。在<linux/fs.h>,可见跟文件系统关系紧密。
" f3 ^ o; H7 {5 K/ B; R' l7 s6 s( n' `5 h& i4 t. A+ I
0 h* x& G! E% Y( u
, U2 W0 n6 b+ l' L# N- o2,页高速缓存的原理和过程
5 m" P F& i @3 o
& L! S s% Q* c- Z5 f1 ]
. Z+ t% S( _, w1》应用程序调用文件I/O函数,C库封装,系统调用,VFS,文件系统操作方法产生I/O请求,块设备I/O层给请求队列排序
% [ ^% Q; `5 o* k9 \2》再加上页高速缓存,减少实际的磁盘访问量,提高I/O操作效率。来完成整个文件I/O过程。+ E; W8 K. S8 Z }
3》如果I/O请求的块(文件系统的最小操作单位),在页高速缓存中,则直接操作页高速缓存。4 n+ d- S( W4 `/ ~/ e
4》如果高速缓存中没有,则访问磁盘。
6 p6 W* u4 ?& H, }6 q1 G) `4 t5 N8 `3 N: j
0 ]# |$ b% O a* D# q! G( M2 r
. F- f# B# ?/ ?/ q2 j3 O
+ H& d+ d& W; `0 S/ q' d3,如何检查I/O请求的块是否在页高速缓存中' p0 B1 I! a- R, d
% O, P \6 a+ |* L6 r( ?) h
8 \( p; U8 e3 z8 u1》基于“基树”的搜索方法% ]! ] n7 W2 R( V# N) S. O
2》老的内核基于“页散列表”
U. @- } y V4 U7 X4 h) n" ^& F0 x4 Y. j3 T
( M+ G- _& B' c
- R, [$ B \2 c- n
7 O- c L3 j) `2 Z( X- \
4,页回写(pdflush线程组)- a: O6 W, ^. T; a% C' w# W
$ ~, o5 h" o7 m, x% Z' {0 z* R" l' u: R! ]
1》页回写,就是将页高速缓存的内容(脏页)写回磁盘(同步)7 } Y/ S, d, @, z
2》由于不能一直直接操作页高速缓存,所以在一定条件下要页回写。5 l& S' z- o" j' @- V |
3》有一个内核线程(pdflush)专门负责在适当时候执行页回写操作。; y0 ~' E' d$ \
4》适当时候就是,空闲内存小于阈值,脏页到一定时间。- k% h; b3 t: C9 _& p* R
5》如果页回写任务过重(阻塞1秒),则再起一个pdflush。否则就减少一个pdflush。
' s( H8 ^% d* s
# C0 k8 ~4 r+ s, [0 Q; L% y3 i- D0 y
% c8 l2 T4 S) o5 N% j/ k
# v6 Z8 J9 d* a$ `
9 f) ]0 w* J5 _! n! f1 U0 v- C
. @' ]; F+ Y3 ~* ?# `6 A
. W+ @2 e1 G& j
( G8 g: _' E; Y; h
8 I$ b. L; E' B- X7 M7 ?* u1 g1 C* M1 T8 p5 H
7 W' R; L8 ` ^* p" [9 L0 x |
|