Pergunta

Quando mapeamos um arquivo na memória, é necessária uma chamada do sistema. Os acessos subsequentes ao arquivo requerem chamadas do sistema ou a página de memória virtual do processo é mapeada para o cache da página real na memória?

atualizar: O que eu também quero saber é que, se vários processos estiverem acessando o mesmo arquivo através do MMAP. Eles estarão acessando a mesma porção de memória física gravar.

Foi útil?

Solução

Não há necessidade de chamadas adicionais do sistema (pelo seu processo), você apenas acessa como memória regular. Quando você terminar o arquivo, basta ligar munmap.

Valor de retorno

No sucesso, mmap()Retorna um ponteiro para a área mapeada. Em erro, o valor MAP_FAILED (isto é, (void *) -1) é retornado e o errno é definido adequadamente. No sucesso, munmap() retorna 0, na falha -1 e errno está definido (provavelmente para EINVAL).

Veja a página do homem aqui para obter detalhes.

Editar para esclarecimento:

Estou dizendo que a função mapeia o arquivo no espaço de memória do processo de chamada e retorna um ponteiro para o início do bloco de memória.

Por exemplo, se você tiver dois processos diferentes mapeiam o mesmo arquivo com o MAP_SHARED O sinalizador, em seguida, cada processo estará acessando a mesma memória física, mas essa memória pode ser mapeada em um local diferente no espaço de memória virtual de cada processo, ou seja, os ponteiros retornados pelo MMAP no espaço de memória virtual de cada processo podem não ser iguais.

Isso levanta o ponto de que se você, por exemplo Locais internos para o bloco / arquivo.

Outras dicas

Quando você mmap um arquivo, o Linux cria entradas na MMU (unidade de gerenciamento de memória). O MMU observa todas as leituras e escreve da CPU na verdadeira RAM. Dessa forma, ele sabe quando você acessa partes da memória que mmap() retornou. A leitura de peças que ainda não estão na RAM real causará falhas de página. O MMU os pegará e chamará uma rotina de kernel para carregar a parte direita do arquivo na RAM em algum lugar e, em seguida mmap() deu-te. De fato, estará em outro lugar, mas o MMU tornará isso completamente transparente.

Quando você escreve para a memória, o MMU marcará as páginas modificadas como "sujo". Quando eles são liberados (porque você acessa mais do arquivo ou porque você liga munmap()), as alterações serão gravadas no disco.

Portanto, toda vez que uma falha na página e uma descarga de página suja acontece, uma chamada do sistema acontece. Mas como as páginas são de 4 ou 8kb, elas acontecem raramente. Além disso, o kernel carregará mais de uma página por vez, portanto o número de chamadas do sistema é reduzido novamente. Por fim, o mesmo código é usado para implementar a troca, por isso é muito otimizado.

Todos esses efeitos tornam o MMAP tão eficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top