我是靠谱客的博主 贪玩黑裤,最近开发中收集的这篇文章主要介绍13.5 就I/O模式向内核提出建议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

13.5  就I/O模式向内核提出建议

posix_fadvise()系统调用允许进程就自身访问文件数据时可能采取的模式通知内核。

内核可以(但不必非要)根据posix_fadvise()所提供的信息来优化对缓冲区高速缓存的使用,进而提高进程和整个系统的性能。调用posix_fadvise()对程序语义并无影响。

参数fd所指为一文件描述符,调用期望通知内核进程对fd指代文件的访问模式。参数offset和len确定了建议所适用的文件区域。offset指定了区域起始的偏移量,len指定了区域的大小(以字节数为单位)。len为0表示从offset开始,直至文件结尾。(在内核2.6.6版本之前,len为0就表示长度为0个字节。)

参数advice表示进程期望对文件采取的访问模式。具体为下列参数之一:

POSIX_FADV_NORMAL

进程对访问模式并无特别建议。如果没有建议,这就是默认行为。在Linux中,该操作将文件预读窗口大小置为默认值(128KB)。

POSIX_FADV_SEQUENTIAL

进程预计会从低偏移量到高偏移量顺序读取数据。在Linux中,该操作将文件预读窗口大小置为默认值的两倍。

POSIX_FADV_RANDOM

进程预计以随机顺序访问数据。在Linux中,该选项会禁用文件预读。

POSIX_FADV_WILLNEED

进程预计会在不久的将来访问指定的文件区域。内核将由offset和len指定区域的文件数据预先填充到缓冲区高速缓存中。后续对该文件的read()调用将不会阻塞磁盘I/O,只需从缓冲区高速缓存中抓取数据即可。对于从文件读取的数据在缓冲区高速缓存中能保留多长时间,内核并无保证。如果其他进程或内核的活动对内存存在强劲需求,那么最终会重用到这些页面。换言之,如果内存压力高,程序员就应该确保posix_fadvise()调用和后续read()调用间的总运行时长较短。(Linux特有的系统调用readahead()提供了与POSIX_FADV_WILLNEED操作等效的功能。)

POSIX_FADV_DONTNEED

进程预计在不久的将来将不会访问指定的文件区域。这一操作给内核的建议是释放相关的高速缓存页面(如果存在的话)。在Linux中,该操作将分两步执行。首先,如果底层设备目前没有挤满一系列排队的写操作请求,那么内核会对指定区域中已修改的页面进行刷新。之后,内核会尝试释放该区域的高速缓存页面。仅当该区域中已修改的页面在第一步中成功写入底层设备时,第二步才可能操作成功,也就是说,在该设备的写入操作请求没有发生拥塞的情况下。因为应用程序无法控制设备的拥塞(congestion),所以要确保释放高速缓存页面,变通的方法之一是在POSIX_FADV_DONTNEED操作之前对指定的参数fd调用sync()或fdatasync()。

POSIX_FADV_NOREUSE

进程预计会一次性地访问指定文件区域,不再复用。这等于提示内核对指定区域访问一次后即可释放页面。在Linux中,该操作目前不起作用。

对posix_fadvise()的规范是SUSv3中的新增内容,并非所有UNIX实现都支持该接口。Linux内核从2.6版本开始提供posix_fadvise()。

最后

以上就是贪玩黑裤为你收集整理的13.5 就I/O模式向内核提出建议的全部内容,希望文章能够帮你解决13.5 就I/O模式向内核提出建议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部