2008-12-03 6 views
1

J'ai un problème avec le cache du système Windows. Exemple de code:Cache système Windows et fichiers volumineux

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; 
     } 
    } 
} 

si vous exécutez ce code et regardez la taille du cache du système, tout sera ok. Mais si vous ouvrez ce fichier (test_file.txt) pour lire dans une visionneuse (par exemple avec lister plugin pour le commandant total) pendant que ce programme est en cours d'exécution, vous verrez que la taille du cache système augmente, même si vous fermez déjà votre viewer programme. Cela ressemble à une fuite de mémoire. Ce comportement est-il normal?

Répondre

3

Le cache de fichiers Windows essayera de conserver autant de fichier dans la RAM que possible. Dans Windows NT, le chargement d'un très gros fichier pourrait déclencher un bug. Si le fichier ne rentrait pas dans le cache, il ne serait plus jamais libéré, forçant tout le reste en RAM dans le fichier d'échange jusqu'à ce que votre machine permute constamment.

Mais votre cas est plus simple. Ouvrir le fichier dans la visionneuse chargera le fichier dans le cache. Puisque vous l'écrivez toujours, l'élément cache augmentera en conséquence. Maintenant vous quittez la visionneuse, mais vous écrivez toujours. Que devrait faire Windows? Apparemment, il conserve le fichier dans le cache.

Il ne s'agit pas d'une fuite de mémoire à moins que le cache ne se rétrécisse jamais. Est-ce qu'il rétrécit a) lorsque vous manquez de RAM ou b) lorsque vous fermez le fichier dans le processus d'écriture?

0

Lorsque mon système à court de mémoire cache RAM ne se rétracte pas, le système décharger tout dans le fichier d'échange. Lorsque je ferme le fichier dans le processus d'écriture, le cache système rétrécit.

0

Si j'étais vous, j'essaierais de mieux comprendre le numéro de 'cache système' affiché par le gestionnaire de tâches. Je pense que ce n'est pas ce que vous pensez, et votre utilisation d'une expression comme «système décharger tout dans le fichier d'échange» me fait particulièrement me demander si vous essayez de transplanter l'expérience sur un système différent sur Windows.

Les livres Mark Russonovich sont considérés comme la meilleure référence pour ce genre de choses.

Questions connexes