Comportamento da memória mmap'd na pressão da memória

5

Eu tenho um arquivo tar grande (60GB) contendo arquivos de imagem. Estou usando mmap() neste arquivo inteiro para ler essas imagens, que são acessadas aleatoriamente.

Estou usando mmap() pelos seguintes motivos:

  1. Segurança de thread - não consigo procurar um ifstream de vários threads.
  2. posso evitar o buffer extra.
  3. Eu recebo algum armazenamento em cache (na forma de uma página solicitada já sendo residente.)

A questão é o que acontece quando eu leio todas as imagens desse arquivo de 60GB? Certamente nem todos das imagens estão sendo usadas de uma só vez - elas são lidas, exibidas e depois descartadas.

Minha chamada mmap() é:

mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0); 

Aqui está a pergunta: o kernel vê que mapeei páginas somente leitura apoiadas por um arquivo e simplesmente limpa as páginas não utilizadas na pressão da memória? Não tenho certeza se este caso é reconhecido. As páginas man indicam que MAP_NORESERVE não requer espaço de troca de apoio, mas não parece haver garantia alguma do que acontece com as páginas sob pressão de memória. Existe alguma garantia de que o kernel irá limpar minhas páginas desnecessárias antes de, digamos, limpar o cache do sistema de arquivos ou outro processo do OOM?

Obrigado!

    
por Devin Lane 14.09.2011 / 02:37

1 resposta

2

Um mmap somente leitura é equivalente a open seguido por lseek e read . Se um pedaço de memória mapeado em um processo é copiado por um arquivo, a cópia na RAM é considerada parte do cache de disco e será liberada sob pressão de memória, assim como uma entrada de cache de disco criada por read ing um arquivo.

Eu não verifiquei a fonte, mas acredito que MAP_NORESERVE não faz diferença para mapeamentos somente leitura.

    
por 15.09.2011 / 02:05