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()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值