Você parece confundir o mapeamento de memória com arquivos em memória residentes
sistemas de arquivos, juntamente com outros conceitos como como os processos mantêm o acesso a
arquivos, mesmo quando eles são movidos ao redor.
Vou fazer perguntas por pergunta para ver se consigo esclarecer as coisas.
- Let's say I browse to a directory in my file system and there is a file in
this directory. Is it possible that this file points to a region in the main
memory, instead of pointing to a region in the disk?
Aponta para a memória principal se estiver em um sistema de arquivos residindo na memória, como procfs
que normalmente é montado em / proc, ou sysfs que está em / sys, ou tmpfs que
às vezes está em / tmp.
- If this is possible, is this what we call 'memory-mapped file'?
Não. Como stephen-kitt disse, "mapeamento de memória" refere-se a uma maneira de acessar um arquivo por
"mapear" na memória principal e trabalhar com ela em vez de ler e ler
escrevendo pedaços de cada vez através de funções como read () e write ().
- What would be the meaning of moving such file around the file system (that
is, mving such file from a directory into another)? What I understand is,
since the file is memory mapped, the process(es) interacting with the file
always writes to a predefined region of the main memory, and when we open
that file (for example using vim), we read that region of main memory (so,
no disk is involved). Hence, no matter where we move the file, it will
always work correctly right? If yes, does moving the file around the file
system has any significance?
Se você movê-lo dentro do mesmo sistema de arquivos, você está apenas se movendo
em torno de uma referência, um inode de um diretório para outro. Se houver
programas que já tinham este arquivo aberto, eles ainda estarão acessando o mesmo
arquivo porque eles já têm o inode na mão através de um descritor de arquivo. Isto é
o que aconteceu com o arquivo table_name.idb que você mencionou em um comentário.
- Is there a command which would tell if a file is memory-mapped?
Wossname já respondeu isso para arquivos mapeados na memória. lsof
dirá a você
quais processos têm o arquivo mapeado na memória.
Para saber se um arquivo está em um sistema de arquivos que reside na memória, você pode usar df
ou
mount
para listar os sistemas de arquivos e seus pontos de montagem. Você só precisa saber
quais tipos de sistemas de arquivos residem na memória procurando-os (por exemplo,
wikipedia).
- Finally, if I open a memory-mapped file with vim, make some changes on it
and save and close vim, what will happen? Will my changes simply be written
to main memory? If that's the case, will other processes which use this file
will see the changes I have just made? In my experience, the other processes
did not see the changes I have made to the file when I made some changes on
the file with vim. What is the reason for this?
Pessoalmente, eu não usei a função mmap
em um programa em C, mas como eu
entendê-lo de skimming man mmap
e info mmap
, não há mágica
envolvidos na manutenção da representação na memória em sincronia. Na sua forma básica,
chamando mmap copia o conteúdo do arquivo para a memória e msync
é usado para escrevê-lo
de volta da memória para o disco. Se o arquivo no disco mudar, não há nada
lugar para detectar isso e modificar automaticamente a representação na memória em
todos os processos que o mapearam.
EDIT: Acontece que mmap () realmente tenta manter a representação na memória em sincronia sob algumas condições. Se o mapa só for lido, ele será mantido em sincronia mesmo quando outros processos gravarem no arquivo. Se for escrito para (atribuindo à região de memória), o que acontece depende de quais dos flags MAP_SHARED ou MAP_PRIVATE aparentemente obrigatórios são fornecidos para mmap (). Se MAP_PRIVATE for fornecido, o mapa será forjado a partir da representação em disco e ficará em sincronia até você usar msync (). Se MAP_SHARED for fornecido, as atualizações serão visíveis para outros processos que tenham o arquivo mapeado, bem como (embora isso não seja imediatamente imediato) a representação em disco.
Acabei de abrir o vim em um arquivo existente e
e executei o comando :w
, enquanto
tendo inotifywait -m .
em execução em outro terminal. Entre alguns bits estranhos,
esta é a parte importante que eu obtive de inotifywait
.
./ MOVED_FROM e
./ MOVED_TO e~
./ CREATE e
./ OPEN e
./ MODIFY e
./ CLOSE_WRITE,CLOSE e
./ ATTRIB e
./ ATTRIB e
./ DELETE e~
O Vim cria um novo arquivo e remove o antigo. Por que isso acontece em vez de
modificar o arquivo está além do escopo desta questão, mas o ponto é que
este é um novo arquivo e, portanto, tem um novo inode.
Agora, o que você quer dizer com outros processos usando esse arquivo? Se você quer dizer processos
que tinha o arquivo aberto enquanto você estava fazendo isso, não, eles não vão ver o
alterar. Isso porque, apesar de abrirem um arquivo com o mesmo caminho, eles
não são o mesmo arquivo. Se você quer dizer processos que podem abrir o arquivo depois de você
fez isso, então sim, eles verão as mudanças. Eles estarão abrindo o novo arquivo
você criou.
É importante observar que, embora os programas pareçam ter um arquivo aberto no
interface do usuário, que não significa necessariamente que eles mantêm o arquivo aberto
no processo. Vim é um exemplo disso, como mostrado acima.