2015-08-25 26 views
0

假设我在磁盘上有一个大文件(或者只是原始存储,如果这在任何流行的操作系统中都是可行的),我将需要操作它。有没有办法让操作系统知道,我希望整个数据块都被急切地加载到内存中,而不是每次尝试访问一个段时都只有一小块最初加载到内存和页面错误中的内容尚未加载到内存中?我认为这对于内存映射文件来说可能更多,因为如果您正在进行顺序读取操作系统,可能已经预先加载了一些东西。我确信编写一个提供我所需功能的操作系统在技术上是可行的,但它是否存在于任何流行的操作系统中?另外,如果有额外的RAM可用,大多数操作系统是否已经预先将整个块预加载到内存中?如果操作系统提供此功能,那么访问此功能的编程语言支持是什么?多次从磁盘加载到内存而不是页错误

+2

如果您在文件中处理数据严格顺序,则很容易使你能保持你自己的“块”预读缓冲区。另外,大多数现代操作系统可能会进行一些内部预读,只是因为这种模式非常普遍。我认为你必须做一些分析和测量,以查看瓶颈是什么,并比较不同的方法(你在做预读,依靠操作系统,[内存映射整个或部分文件](https:// en.wikipedia.org/wiki/Memory-mapped_file),其他方法)。 –

+1

根据[这个(旧的但可能仍然相关)的Linux页面缓存教程](http://duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files/ ),至少Linux内核默认情况下会加载。我只是没有看到其他流行的操作系统不会这样做的原因。 –

回答

0

正如评论员指出的那样,对于连续读取的情况,现代操作系统已经执行了一个预读优化,可以为您做到这一点。

对于其他类型的输入,您可以使用异步I/O

  1. 如果你的程序知道它将来需要一些读取数据,但不需要立即它,它会发送一个异步输入数据的请求。

  2. 当程序前进到需要该数据的位置时,它检查异步请求的状态。

    • 如果请求已满足,优化工作,并且程序可以处理所请求的数据而不会阻塞。

    • 如果请求尚未得到满足,程序将阻塞,直到数据准备就绪。虽然程序仍然需要阻塞这种情况,但它被阻塞的时间长度将小于同步I/O的情况。

相关问题