文件读写操作详解
1. 文件预读机制
在文件读取过程中, page_cache_readahead() 函数在创建新窗口时,会启动对包含页面的读取操作。为了读取一组页面,它会调用 blockable_page_cache_readahead() 函数。该函数为减少内核开销,采用了以下策略:
- 避免在读取拥塞时操作 :若服务于块设备的请求队列处于读取拥塞状态,则不进行读取操作,因为增加拥塞并阻塞预读没有意义。
- 检查页面缓存 :对每个要读取的页面检查页面缓存,若页面已在缓存中,则直接跳过。
- 一次性分配页面帧 :在从磁盘读取之前,一次性分配读取请求所需的所有页面帧。若无法获取所有页面帧,则仅对可用页面执行预读操作,因为等待所有页面帧可用再进行预读意义不大。
- 使用多段生物描述符 :尽可能使用多段生物描述符将读取操作提交到通用块层。若地址空间对象定义了专门的 readpages 方法,则使用该方法;否则,重复调用 readpage 方法。
当预读策略效果不佳时,内核需要调整预读参数。以 do_generic_file_read() 函数为例,在步骤 4c 中调用 page_cache_readahead() 函数。根据流程图,请求的页面可能在当前窗口或提前窗口中,应已提前读取;若不在,则调用 blockable_pa
超级会员免费看
订阅专栏 解锁全文
1744

被折叠的 条评论
为什么被折叠?



