Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从没有文件句柄的mem映射文件中清除OS缓存_Linux_Paging_Mmap_Oscache - Fatal编程技术网

Linux 从没有文件句柄的mem映射文件中清除OS缓存

Linux 从没有文件句柄的mem映射文件中清除OS缓存,linux,paging,mmap,oscache,Linux,Paging,Mmap,Oscache,我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,因此无法使用posix_fadvise 我们的应用程序通过将大量文件映射到内存来缓存它们。映射文件后(即,我们从mmap()获得指针),我们关闭文件。当以后我们需要清理缓存时,我们也要清理OS缓存中的页面。也就是说,我们希望取消映射文件,并执行类似于posix\u fadvise(posix\u FADV\u DONTNEED)的操作,但此时文件描述符不可用 流程如下所示: //caching stage fd = open("file

我需要强制操作系统清除用于映射文件的页面。我没有文件描述符,因此无法使用posix_fadvise

我们的应用程序通过将大量文件映射到内存来缓存它们。映射文件后(即,我们从
mmap()
获得指针),我们关闭文件。当以后我们需要清理缓存时,我们也要清理OS缓存中的页面。也就是说,我们希望取消映射文件,并执行类似于posix\u fadvise(posix\u FADV\u DONTNEED)的操作,但此时文件描述符不可用

流程如下所示:

//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);

//clean-up stage
munmap(data);
// posix_fadvise(???, POSIX_FADV_DONTNEED);
//缓存阶段
fd=打开(“文件”);
数据=mmap(fd,);
关闭(fd);
//清理阶段
地图(数据);
//posix_fadvise(?,posix_fadvise_DONTNEED);
有没有办法在没有文件描述符的情况下清除缓存的页面

我考虑过以下两种解决方法:

  • 保持文件打开,以便在清理时有有效的描述符。但是,可能有成千上万个文件,保持它们全部打开可能会影响操作系统的性能
  • 保留文件路径,然后重新打开它以获取描述符并调用
    posix_fadvise()
    。但问题是:旧映射区域是否与同一文件关联?在这种情况下,
    fadvise()
    会清除缓存页面吗

    • 第二种选择奏效了。稍后重新打开文件时,映射区域与之关联,并使用新文件描述符调用
      posix_fadvise
      ,卸载映射页面:

      //caching stage
      fd = open("file");
      data = mmap(fd, <mmap flags>);
      close(fd);
      
      //clean-up stage
      fd = open("file");
      munmap(data);
      posix_fadvise(fd, POSIX_FADV_DONTNEED);
      close(fd);
      
      //缓存阶段
      fd=打开(“文件”);
      数据=mmap(fd,);
      关闭(fd);
      //清理阶段
      fd=打开(“文件”);
      地图(数据);
      posix_fadvise(fd,posix_fadvise_DONTNEED);
      关闭(fd);
      
      第二个选项起作用了。稍后重新打开文件时,映射区域与之关联,并使用新文件描述符调用
      posix_fadvise
      ,卸载映射页面:

      //caching stage
      fd = open("file");
      data = mmap(fd, <mmap flags>);
      close(fd);
      
      //clean-up stage
      fd = open("file");
      munmap(data);
      posix_fadvise(fd, POSIX_FADV_DONTNEED);
      close(fd);
      
      //缓存阶段
      fd=打开(“文件”);
      数据=mmap(fd,);
      关闭(fd);
      //清理阶段
      fd=打开(“文件”);
      地图(数据);
      posix_fadvise(fd,posix_fadvise_DONTNEED);
      关闭(fd);
      
      缓存与文件关联,而不是特定的映射,因此我认为重新打开文件应该可以。我只是在munmap()的手册页中发现了这一点:关闭文件描述符不会取消映射区域。看起来该区域与该文件关联,并且在下次打开该文件时将与新fd关联。我将测试它并发布结果。您已经知道关闭描述符不会取消文件的映射,由于您的应用程序在关闭后继续使用映射。我误解了这一部分–我认为页面将失去与文件的链接,成为内存中的数据。大多数Linux系统使用统一的文件缓存。缓存与文件关联,而不是特定的映射,因此,我认为重新打开该文件应该有效。我刚刚在munmap()的手册页中发现:关闭文件描述符不会取消区域映射。看起来该区域与该文件关联,并且在下次打开该文件时将与新fd关联。我将对其进行测试并发布结果。您已经知道,关闭描述符并不会取消映射文件,因为您的应用程序在关闭后仍在使用映射。我误解了这一部分,我认为页面将失去与文件的链接,成为内存中的数据。大多数Linux系统使用统一的文件缓存。