zoukankan      html  css  js  c++  java
  • 一般文件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的值可以是下面的几种:

    1. POSIX_FADV_NORMAL:没有任何意见;
    2. POSIX_FADV_RANDOM:程序打算随机读写,内核禁用预读功能,每次读取最少量的数据;
    3. POSIX_FADV_SEQUENTIALP:打算顺序的方式访问,内核把预读的大小扩大一倍;
    4. POSIX_FADV_WILLNEED:在不久的将来程序将访问该段内容,内核开启预读,把它们读入;
    5. POSIX_FADV_NOREUSE:将来打算访问当只访问一次,但内核行为如同4;
    6. POSIX_FADV_DONTNEED:在不久的将来应用程序不打算访问指定范围中的页面,内核从页缓冲中删除指定的范围。

    对于POSIX_FADV_WILLNEED的情况linux有自己特有的一个接口,定义如下,就不具体给例子了:

    ssize_t readahead(int fd, off64_t offset, size_t count);

    有些时候这些建议会较大地提高效率,例如在播放视频文件的时候,播放过的内容就可以不放在内存里面了,可以空出内存给其他程序,这时候就可以设置POSIX_FADV_DONTNEED。又或者在顺序读取文件的时候设置POSIX_FADV_WILLNEED,那么下次访问的时候就不会阻塞。

  • 相关阅读:
    C# 中的委托和事件
    SQLserver2000与2005同时安装的问题
    又到毕业时
    WCF服务发布和调用IIS服务
    进销存取项目总结
    URL
    undefined reference to `android::Mutex::lock()'
    关于 ffmpeg ‘UINT64_C’ was not declared in this scope 的错误
    Ti 的 OMX_Core
    linux Perforce 使用
  • 原文地址:https://www.cnblogs.com/ggzwtj/p/2207726.html
Copyright © 2011-2022 走看看