readahead即预读,提前从块设备(如硬盘)里多读一些page缓存到page cache tree,以便下次读时能直接从page cache中命中,而不需要触发实际块设备的访问,提高IO效率。
那么什么时候readahead,readahead多少个page呢?
调用系统调用read时,先find page cache,若cache miss则进行sync readahead;若命中的page设置了PG_readahead标志则进行async readahead。sync readahead和async readahead都调用了ondemand_readahead函数,readahead的算法就是在这里实现的。
对于是否readahead和readahead多少page分以下几种情况 :
1.顺序读
从文件第一个page读假定为顺序读
当前读的page与上一次读的page相邻,则为顺序读 。
2.连续顺序读