我想cat filepath > /dev/null
用作廉价的内存缓存机制。我想知道的是:如果我第二次调用它,并且文件已经在磁盘缓存中,那么操作系统是否足够聪明以至于什么都不做?
更新:我已经在 CIFS 卷上对此进行了测试,使用 fadvise POSIX_FADV_WILLNEED 在本地缓存文件(在命令行上使用 linux-ftools)。事实证明,该卷需要以读写模式安装才能正常工作。在只读模式下,fadvise 似乎被忽略了。这一定与 samba oplock 机制有关。
不,它不能。
确定一个程序是否什么都不做通常比仅仅运行它更复杂。
为什么你仍然需要控制内存缓存?如果绝对必要,请考虑使用 tmpfs 文件系统或使用 compcache(压缩的 RAM 块设备)
posix_fadvise(...,POSIX_FADV_WILLNEED) 比将文件分类到 /dev/null 更好 - 它需要更少的实际 IO,并且不需要将文件内容读入用户空间内存,从而破坏 CPU 缓存。
此外,如果文件的相关部分已经在缓存中,则 posix_fadvise 可能会比 cat file > /dev/null 做的工作少得多
如果你觉得你现在真的需要页面在核心,然后mmap文件的相关部分并mlock它(之后解锁它;如果内存压力紧张,它可能会立即被丢弃)。那需要root权限。
一般来说,做这种事情是一种悲观情绪,应该避免。强制内核按照你想要的方式运行可能会降低它刚刚优化实际工作负载的能力。
正如其他答案所说,它不会什么都不做。但如果你真正的意思是:
如果我第二次调用它,并且文件已经在磁盘缓存中,操作系统是否足够聪明,不会第二次从磁盘读取它?
...那么答案是肯定的1。毕竟,这就是磁盘缓存的工作方式。
1.只要有问题的文件系统使用页面缓存,无论如何。
它会很快,但它不会是空操作(如果是的话,系统调用将有正当理由做意想不到的事情而不是他们承诺的功能......)。但是,根据使用的文件系统驱动程序和内核选项,您可能会在接近内存带宽的情况下运行。