概述
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模式向内核提出建议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复