É 'open ()', 'mmap ()', ou nenhuma, a função mais fundamental?

0

No kernel do Linux, é open() , mmap() ou nenhum dos dois, a maneira mais fundamental de acessar um arquivo? Por "fundamental", quero dizer "ou, em última instância, chama o outro ou uma simples função auxiliar do outro?".

Existem muitas perguntas na rede da pilha perguntando sobre o desempenho dessas duas funções. A esperança desta questão é obter o que está acontecendo dentro do kernel Linux a priori. O open() chama mmap() ou alguma função auxiliar que essencialmente implementa mmap() ? Alternativamente, mmap() chama open() ou chama alguma função auxiliar que essencialmente implementa open() ?

A essência da questão é se essas duas chamadas de sistema são diferentes ou se uma é uma "função de conveniência" da outra.

    
por Praxeolitic 11.08.2017 / 07:01

2 respostas

4

Observe que o mmap (2) geralmente deseja um descritor de arquivo geralmente fornecido por aberto (2) ; Nesse sentido, open é mais fundamental. Observe também que o espaço de endereçamento virtual de alguns processo é modificado não apenas por mmap , munmap , mprotect (2) mas também por outras chamadas de sistema (incluindo execve(2) ; veja também shm_overview (7) )

BTW, o kernel do Linux não usa mmap ou open , mas os fornece e implementa (para nível de aplicativo user-space programs).

Mas o kernel Linux gerencia os cache de páginas que é mais fundamental e relacionado a ambas chamadas de sistema . Veja também LinuxAteMyRam e considere talvez usando madvise (2) , posix_fadvise ( 2) , readahead (2) para dar dicas sobre o cache da página subsistema.

whether these two system calls are fundamentally different

Todas as chamadas do sistema (listadas em syscalls (2) ...) são diferente.

Leia também Programação Avançada em Linux e Sistemas Operacionais: Três Peças Fáceis (ambas podem ser baixadas gratuitamente).

    
por 11.08.2017 / 08:51
2

Como você está nomeando funções, assumimos que você já sabe que chamar mmap() em um arquivo requer um fd, que é normalmente (mas nem sempre) criado com open() .

A menos que você use O_DIRECT, em kernels como o Linux com um "cache de buffer unificado", read() e write() operam no mesmo cache de página que é mapeado por mmap() . No entanto, isso ignora as compensações de desempenho de cada método, portanto, não parece uma resposta muito útil.

Fora da obtenção de um livro, o Google encontra um bom e breve descrição de mmap e IO regular vs o cache da página . Não menciona o desempenho custos de mmap() , de acordo com o citação de Linus Torvalds que você provavelmente já viu.

    
por 11.08.2017 / 08:50

Tags