2015-08-25 50 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的情況。

相關問題