2008-12-03 24 views
1

我有一個Windows系統緩存的問題。 示例代碼:Windows系統緩存和巨大的文件

int main(int argc, char* argv[]) 
{ 
    HANDLE file_ = INVALID_HANDLE_VALUE; 
    file_ = CreateFile(
          "test_file.txt", 
          GENERIC_WRITE, 
          FILE_SHARE_READ, 
          0, 
          OPEN_ALWAYS, 
          FILE_FLAG_SEQUENTIAL_SCAN, 
          NULL 
          ); 
    if (file_ == INVALID_HANDLE_VALUE || file_ == NULL) 
    { 
     std::cout << "CreateFile error " << GetLastError() << std::endl; 
     return GetLastError(); 
    } 
    int counter = 0; 
    DWORD io_bytes = 0; 
    while(true) 
    { 
     char buffer[0x1000]; 
     int len = _snprintf_s(buffer, 0x1000, 0xffff, "test message %d\r\n", counter); 
     counter++; 
     if (!WriteFile(file_, buffer, len, &io_bytes, NULL)) 
     { 
      std::cout << "WriteFile error " << GetLastError() << std::endl; 
      return GetLastError(); 
     } 
     if (counter > 10000000) 
     { 
      system("pause"); 
      return 0; 
     } 
    } 
} 

,如果你運行這段代碼,看看系統緩存的大小,都將是好的。但是,如果您在該程序運行時打開該文件(test_file.txt)供某些查看器閱讀(例如用於總指揮官的列表插件),則即使您已關閉查看器,系統緩存大小也會增加程序。這看起來像內存泄漏。這種行爲是否正常?

回答

3

Windows文件緩存將嘗試儘可能多地將文件保存在RAM中。在Windows NT中,加載一個非常大的文件可能會觸發一個錯誤。如果文件不適合高速緩存,它將永遠不會再被釋放,從而將所有其他內存強制交換到交換文件中,直到您的機器不斷交換。

但是你的情況更簡單。在查看器中打開文件會將文件加載到緩存中。由於您仍在編寫它,因此緩存項目會相應增加。現在你退出了觀衆,但你還在寫作。 Windows應該做什麼?顯然,它將文件保存在緩存中。

這不是內存泄漏,除非緩存永不收縮。它是否縮小a)當你用完RAM時b)當你在寫入過程中關閉文件時?

0

當我的系統用完RAM緩存不收縮時,系統將所有內容卸載到交換文件中。當我在寫入過程中關閉文件時,系統緩存會縮小。

0

如果我是你,我會嘗試更好地理解構成任務管理器顯示的「系統緩存」編號的內容。

我懷疑這不是你在想什麼,你使用諸如「系統將所有內容卸載到交換文件」這樣的短語特別讓我懷疑你是否試圖將體驗移植到不同的系統上。

馬克Russonovich書被認爲是這種東西的最佳參考。