一般文件I/O用法建议
可以调用posix_fadvise函数来设置一些操作文件的方式,比如要清楚一定区域内的缓存可以使用下面代码:
int main(){
int fd = open("test", O_RDWR);
int ret = posix_fadvise(fd, 0, 10, POSIX_FADV_DONTNEED);
printf("%d\n", ret);
if(ret == -1){
printf("posix_fadvise调用失败!\n");
}
close(fd);
return 0;
}
调用该函数后内核会把所指定的范围从页面缓冲区回收,也就是清除缓存。网上有人用这个来消除测试I/O的效率时cache的影响。advice的值可以是下面的几种:
- POSIX_FADV_NORMAL:没有任何意见;
- POSIX_FADV_RANDOM:程序打算随机读写,内核禁用预读功能,每次读取最少量的数据;
- POSIX_FADV_SEQUENTIALP:打算顺序的方式访问,内核把预读的大小扩大一倍;
- POSIX_FADV_WILLNEED:在不久的将来程序将访问该段内容,内核开启预读,把它们读入;
- POSIX_FADV_NOREUSE:将来打算访问当只访问一次,但内核行为如同4;
- POSIX_FADV_DONTNEED:在不久的将来应用程序不打算访问指定范围中的页面,内核从页缓冲中删除指定的范围。
对于POSIX_FADV_WILLNEED的情况linux有自己特有的一个接口,定义如下,就不具体给例子了:
ssize_t readahead(int fd, off64_t offset, size_t count);
有些时候这些建议会较大地提高效率,例如在播放视频文件的时候,播放过的内容就可以不放在内存里面了,可以空出内存给其他程序,这时候就可以设置POSIX_FADV_DONTNEED。又或者在顺序读取文件的时候设置POSIX_FADV_WILLNEED,那么下次访问的时候就不会阻塞。