2008-12-03 28 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书被认为是这种东西的最佳参考。