Uma utilização trivial deste tipo de mecanismo é o próprio carregamento dos processos na memória, quando o SO pega o arquivo com o programa e carrega na área de texto.
Isto também é muito utilizado para compartilhamento entre processos. Quando dois processos acessam o mesmo arquivo, é preciso "reabrir" o arquivo a todo o momento, o mapeamento na memória evita esse tipo de problema, mas é essencial que os processos utilizem semáforos para evitar problemas de concorrência.
A chamada de sistema que realiza esta função é o mmap(...) que deve receber um arquivo que possui um descritor gerado com a chamada de sistema fopen(...).
Um exemplo de utilização é:
#include <unistd.h>Os parâmetros da função mmap são:
#include <sys/types.h>
#include <sys/mman.h>
int descritor_de_arquivo, tamanho_da_pagina;
char *dados;
descritor_de_arquivo = fopen("arquivo", O_RDONLY);
tamanho_da_pagina = getpagesize();
dados = mmap((caddr_t)0, 10*tamanho_da_pagina, PROT_READ, MAP_SHARED, descritor_de_arquivo, 0);
1) Endereço: Ao utilizar (caddr_t)0, por padrão o sistema atribui para um endereço que é retornado na chamada da função (caso contrário, a variável dados poderia receber o endereço pré-determinado e apontaria para a mesma região).
2) Tamanho: É a quantidade de dados que queremos mapear (preferencialmente utiliza-se um múltiplo do tamanho da página caso contrário será mapeada uma quantidade de 0's que complete o tamanho da página e que não será persistida no disco).
3) Proteção: Recebe os valores (PROT_READ|PROT_WRITE|PROT_EXEC) que podem ser separados por '|' caso sejam permitidos mais de um tipo de permissão de acesso. É importante ressaltar que a permissão do mapeamento deve ser coerente com a permissão encontrada no descritor do arquivo.
4) Flags: Há diversos tipos de flags que podem ser setados, mas sempre um de MAP_SHARED e MAP_PRIVATE deve ser citado (o primeiro é para mapeamentos compartilhados entre processos e o segundo para mapeamentos privados), outros valores para isso podem ser encontrados com uma descrição mais detalhada no site http://linux.die.net/man/2/mmap
5) Descritor de Arquivo: O descritor do arquivo que será mapeado e que deve ter sido inicializado anteriormente.
6) Endereço do Arquivo Inicial: Indica onde o mapeamento do arquivo deve iniciar, uma vez que é possível mapear apenas a parte desejada do arquivo.
Para desmapear o arquivo, pode-se terminar o processo ou utilizar a chamda munmap(...), no entanto, é interessante notar que acabar com o descritor não irá desmapear o arquivo.
A chamada ummap pode desmapear apenas parte do arquivo, veja os parâmetros que são passados:
1) Endereço: Pode ser o endereço recebido da função mmap ou esse valor acrescido do endereço no arquivo inicial do desmapeamento.
2) Comprimento: É o tamanho do bloco que será desmapeado.
Isto resume o mapeamento de memória no linux utilizado com foco no compartilhamento de dados entre processos.
Referências
http://www.ecst.csuchico.edu/~beej/guide/ipc/mmap.html
http://en.wikipedia.org/wiki/Memory-mapped_file
http://linux.die.net/man/2/mmap
Nenhum comentário:
Postar um comentário