Please enable JavaScript.
Coggle requires JavaScript to display documents.
Capítulo 18, Tópicos em gestão de memória - Coggle Diagram
Capítulo 18
Gabriel Bérti - 2127938
Luis Felipe Moro Coelho - 2128020
Tópicos em gestão de memória
Compartilhamento de Memória
O compartilhamento de código entre processos pode ser implementado de forma muito simples e transparente para os processos envolvidos, através dos mecanismos de tradução de endereços oferecidos pela MMU, como
segmentação
e
paginação.
No caso da
Segmentação
, basta fazer com que os segmentos de código dos processos apontem para o mesmo trecho da memória física; o compartilhamento é transparente para os processos - cada processo continua a acessar endereços lógicos em seu próprio segmento de código.
No caso da
Paginação
, a unidade básica de compartilhamento é a página. Assim, a tabela de páginas de cada processo envolvido é ajustada para referenciar os mesmos quadros de memória física. Embora referenciem os mesmos endereços físicos, as páginas compartilhadas podem ter endereços lógicos distintos.
O compartilhamento das seções de código permite proporcionar uma grande economia no uso da memória física, sobretudo em servidores e sistemas multiusuários.
Áreas de memória compartilhada também podem ser usadas para permitir a comunicação entre processos.
Para tal, dois ou mais processos solicitam ao núcleo o mapeamento de uma área de memória sobre a qual ambos podem ler e escrever.
Copy-On-Write (COW)
É uma estratégia usada quando o núcleo do SO precisa copiar páginas de um espaço de memória para outro.
Na técnica COW, ao invés de copiar as páginas do processo pai para o filho, o núcleo compartilha as páginas e as marca como “somente leitura” e “copy-on-write”, usando os flags das tabelas de página.
Principais Passos:
O processo
Pa
tenta escrever em uma página compartilhada;
A MMU nega o acesso e provoca uma falta de página, ativando o núcleo do SO;
O núcleo faz uma cópia da página em outro quadro de memória RAM;
Todo esse procedimento é feito de forma transparente para os processos envolvidos, visando compartilhar ao máximo as áreas de memória dos processos e assim otimizar o uso da RAM.
O núcleo ajusta a tabela de páginas de
Pa
para apontar para a cópia da página, limpa o flag COW e permite a escrita na cópia;
O processo
Pa
continua a executar e consegue completar sua operação de escrita;
Pb
continua a acessar o conteúdo original da página
Dois processos têm páginas compartilhadas pelo mecanismo CoW; as páginas somente podem ser acessadas em leitura;
Mais efetivo em sistemas baseados em páginas, porque normalmente as páginas são menores que os segmentos.
Linux, Windows, Solaris, FreeBSD, etc. usa esse mecanismo.
Mapeamento de arquivo em memória
Esse mapeamento consiste em associar uma área específica de memória do processo a um arquivo em disco: cada byte no arquivo corresponderá então a um byte naquela área de memória, sequencialmente.
O conteúdo do arquivo mapeado pode ser acessado pelo processo através de leitura e escrita de bytes naquela área de memória que o mapeia.
Mapeamento não implica em carregar o arquivo inteiro na memória. Ao invés disso, é criada uma área de memória com o mesmo tamanho do arquivo e suas páginas são ajustadas para “acesso proibido”, usando os flags da tabela de páginas.
Principais Passos:
A MMU nega o acesso e gera uma falta de página, ativando o núcleo do SO;
O núcleo carrega o conteúdo correspondente do arquivo na memória;
O processo
Pa
tenta acessar uma página da área mapeada;
O núcleo ajusta a tabela de páginas de
Pa
;
Um arquivo é mapeado em uma área de memória do processo; as páginas dessa área são marcadas como inacessíveis;
O processo
Pa
continua a executar e consegue completar seu acesso.
Operações de escrita
Mapeamentos Compartilhados
As escritas feitas pelo processo na área mapeada são copiadas no arquivo, para que possam ser vistas por outros processos que abrirem aquele arquivo.
Mapeamentos Privados
No mapeamento privado, é usada a técnica
copy on write
para não propagar as escritas ao arquivo mapeado, que permanece intacto.
Outra vantagem do mapeamento de arquivos em memória é o compartilhamento de código executável.
Caso mais processos que executem o mesmo programa sejam lançados, estes poderão usar as páginas já carregadas em memória pelo primeiro processo, gerando economia de memória e rapidez de carga.