CCoW: Otimizando Copy-on-Write Considerando a Localidade Espacial em Cargas de Trabalho Parte 2
Apr 02, 2024
O pequeno tamanho da página pode ser problemático à medida que os sistemas se tornam capazes de lidar com uma enorme quantidade de memória física. Com a organização hierárquica da tabela de páginas, cada tradução de endereço virtual requer múltiplos acessos à memória, um para cada nível da tabela de páginas, o que é inaceitável.
À medida que as pessoas envelhecem, a memória diminui gradualmente. Porém a memória física não é um dos fatores que afeta diretamente a nossa memória. A memória está relacionada à força das conexões entre os neurônios no cérebro, à saúde do cérebro e à frequência com que a memória é usada.
Em nossos cérebros, os neurônios estão conectados por sinapses. Essas sinapses nos incentivam a armazenar e recuperar informações. No entanto, à medida que envelhecemos, estas conexões sinápticas diminuem, causando a deterioração da nossa memória. Isso não ocorre porque nossa memória física esteja reduzida, mas porque nosso cérebro está passando por certas mudanças que afetam nossas habilidades.
No entanto, usar o cérebro pode nos ajudar a manter boas memórias. O cérebro precisa de exercício, assim como o corpo, precisa de lazer e exercício para se manter saudável. Desenvolver bons hábitos de pensamento ajudará a saúde e a eficiência do seu cérebro. Por exemplo, aprender coisas novas, usar técnicas de memória, jogar quebra-cabeças lógicos, etc. podem melhorar a qualidade e a eficiência do seu cérebro.
Portanto, a memória física é simplesmente a capacidade de armazenamento disponível para o cérebro. Nossa memória está intimamente ligada aos limites do que nosso cérebro pode alcançar. Ao exercitar constantemente nosso cérebro, podemos tornar nossa memória mais durável e mantê-la em alto nível. Para melhorar a memória, devemos nos concentrar em exercitar o cérebro, mantendo uma atitude positiva e bons hábitos de saúde. Percebe-se que precisamos melhorar a memória, e a Cistanche deserticola pode melhorar significativamente a memória, pois a Cistanche deserticola tem efeitos antioxidantes, antiinflamatórios e antienvelhecimento, que podem ajudar a reduzir a oxidação e as reações inflamatórias no cérebro, protegendo assim o saúde do sistema nervoso. Além disso, a Cistanche deserticola também pode promover o crescimento e a reparação das células nervosas, melhorando assim a conectividade e a função das redes neurais. Esses efeitos podem ajudar a melhorar a memória, o aprendizado e a velocidade de pensamento, e também podem prevenir o desenvolvimento de disfunções cognitivas e doenças neurodegenerativas.

Clique em conhecer maneiras de melhorar a função cerebral
Para mitigar a alta sobrecarga da tradução de endereços virtuais para físicos, muitas arquiteturas modernas incorporam um cache para tradução de endereços. TheMMU mantém vários resultados de tradução recentes em uma lógica de hardware chamada buffer de tradução, também conhecido como TLB.
Normalmente, os TLBs de arquiteturas modernas podem conter de 500 a 2.000 entradas [6,7]. As entradas são indexadas por hardware para que o núcleo do processador possa consultar a tradução muito rapidamente. Aproveitando a localidade das referências de memória, muitas traduções de endereços podem ser realizadas sem percorrer a tabela de paginação (referida como acerto TLB).
À medida que o consumo de memória para aplicativos com uso intensivo de memória cresce rapidamente, o número de mapeamentos de páginas virtuais para físicas para um processo também aumenta. No entanto, devido a limitações de hardware, o número de entradas TLB não consegue acompanhar o rápido crescimento do consumo de memória do aplicativo. Assim, as taxas de falta de TLB aumentam, causando gargalos no desempenho de aplicações com uso intensivo de memória [8–11].
Para superar essa limitação, algumas arquiteturas suportam tamanhos de página adicionais maiores que o tamanho das páginas base de 4 KB. Por exemplo, as arquiteturas Intel modernas suportam tamanhos de página de 2 MB e 1 GB [7]. Com um tamanho de página tão grande, uma tradução de endereço pode cobrir uma faixa de endereços mais ampla, aumentando efetivamente a cobertura que o TLB pode fornecer com o mesmo número de entradas.
Por exemplo, um sistema com 1.024 entradas TLB e um tamanho de página base de 4 KB pode fornecer cobertura TLB de 4 MB, enquanto o mesmo número de entradas com páginas enormes de 1 GB fornece cobertura de 1 TB. (THPs). Como o nome sugere, o Linux fornece implicitamente aos processos do usuário páginas enormes sempre que possível.
Se o THP não estiver ativado, o Linux alocará memória para processos na unidade de página base de 4 KB. Se o THP estiver habilitado, o Linux tenta alocar uma página enorme (2 MB de tamanho) em vez da página base, permitindo um mapeamento de página de granulação grossa. Essa grande granularidade permite o compartilhamento eficiente de páginas entre processos pai e filho por meio da bifurcação. Caso uma grande alocação de páginas não seja viável no momento, o Linux volta para a alocação de páginas base. O Linux verifica periodicamente os espaços de endereço do processo para encontrar páginas base e consolidá-las em páginas enormes.

Existem estudos que tentam promover páginas enormes para desempenho, ao mesmo tempo que mascaram ainda mais suas deficiências. Ingens [12,13] propõe preparar páginas enormes de forma assíncrona e fora do caminho crítico.
Hawkeye [14] apresenta um esquema refinado de promoção de páginas enormes baseado em padrões de acesso à memória para maximizar o desempenho com um número mínimo de promoções de páginas enormes. Zhu et al. [15] generalizam os processos de utilização de páginas enormes e otimizam o ciclo de vida de páginas enormes. Parte et al. [16] permitem furos em páginas enormes, proporcionando flexibilidade no gerenciamento de memória com páginas enormes.
A página enorme, porém, é uma espada de lâmina dupla. Devido ao aumento do tamanho da unidade de gerenciamento, a alocação de páginas sofre fragmentação interna. Se um intervalo de endereços alocado for menor que o enorme tamanho da página, o restante da página não poderá ser utilizado e será desperdiçado. Esse chamado inchaço de memória pode diminuir significativamente a utilização de memória em sistemas com páginas enormes [12–17].
O aumento do tamanho da página também pode afetar negativamente o desempenho do programa. Os sistemas operacionais modernos adotam extensivamente o esquema copy-on-write para um compartilhamento eficiente de memória entre processos. O CoW, entretanto, é processado apenas na granularidade da página base.
Assim, para lidar com o CoW em uma página enorme, a página enorme é dividida em páginas base e apenas a página defeituosa é copiada. A quebra de páginas enormes leva um tempo considerável, resultando no tratamento intermitente de falhas em páginas longas. Nesse sentido, algumas aplicações, mesmo aquelas com uso intensivo de memória, não recomendam o uso de páginas grandes para desempenho estável e utilização de memória [4,18].
Em geral, existem intervalos de espaço de endereço no espaço de endereço do processo onde todas as páginas do intervalo têm a mesma permissão e características. Para gerenciamento, os sistemas operacionais modernos geralmente adotam o conceito de 'área de memória virtual (VMA)' para representar tais intervalos de espaço de endereço. Podemos classificar as páginas no espaço de endereçamento do processo de acordo com sua origem.

Algumas páginas podem ser carregadas a partir de um arquivo de backup no armazenamento secundário, conhecido como 'páginas de backup de arquivo'. Considerando que algumas páginas são preenchidas dinamicamente sem quaisquer dados de apoio. As páginas para pilha e heap são, neste caso, as chamadas 'páginas anônimas'.
2.2. Bifurcação e cópia na gravação
Fork é uma das chamadas de sistema padrão POSIX para criar um novo processo. Quando um processo invoca a chamada de sistema fork, um novo processo é criado como filho do processo chamador.
Nos bastidores, o sistema operacional cria o processo filho duplicando todo o espaço de endereço do processo de chamada. Isto implica que o processo filho deve começar com os mesmos dados do processo pai.
Para lidar com a duplicação do espaço de endereço de forma eficiente, a maioria dos sistemas operacionais modernos usa a técnica copy-on-write (CoW). Para duplicar o espaço de endereço do pai, o sistema operacional não copia cada página. Em vez disso, a tabela de páginas do processo filho é construída copiando a tabela de páginas do processo pai.
Isso efetivamente cria um mapeamento compartilhado para o espaço de endereço do pai. Ao fazer o mapeamento compartilhado, a permissão de gravação para cada página é eliminada limpando o bit de permissão no PTE correspondente.
Depois de copiar o mapeamento, tanto o pai quanto o filho poderão ler as páginas compartilhadas como suas páginas. Quando um dos processos faz acesso de escrita a uma página, a MMU, devido à falta de permissão de escrita, dispara uma falha de página. No manipulador de falhas de página, o sistema operacional aloca uma nova página, copia a página original e atualiza o mapeamento de página correspondente do processo causador da falha com permissão por escrito.
Neste ponto, o pai e o filho podem ter dados diferentes no mesmo endereço virtual. Este mecanismo de cópia na gravação é amplamente usado como o mecanismo chave fundamental para a realização de muitos recursos de memória virtual. Especificamente, leituras de heapregions não inicializadas são geralmente tratadas com mapeamento compartilhado para uma página zero, que é uma página especial contendo todos os zeros.
A mesclagem de mesma página do kernel (KSM) é a técnica de desduplicação das mesmas páginas no sistema. O sistema operacional verifica as páginas do sistema para identificar páginas com dados idênticos. Quando essas páginas são encontradas, o sistema operacional recupera todas as páginas, exceto uma, e atualiza as tabelas de páginas correspondentes para compartilhar a página restante.
No processamento, a permissão de gravação é eliminada para que o acesso de gravação subsequente à página seja identificado e copiado. Com a alta eficiência da cópia na gravação, a criação do processo torna-se eficiente, e alguns aplicativos com uso intensivo de dados aproveitam essa vantagem para criar uma cópia de dados .
O Redis, um dos populares serviços de armazenamento de valores-chave na memória [4], é um desses casos [19]. O Redisis foi projetado principalmente para manter os dados na memória para fornecer alto rendimento e baixa latência.
No entanto, alguns aplicativos exigem a persistência dos dados armazenados e redescomplementam o design na memória com uma bifurcação. O Redis aplica solicitações de entrada apenas ao índice da memória e às estruturas de dados e invoca periodicamente a chamada do sistema fork. Isso cria efetivamente um processo filho com conteúdo de memória duplicado do processo Redis original, e o processo de chamada (ou seja, o processo original) continua processando solicitações de entrada.
O processo filho desvia sua execução; usando o conteúdo atual da memória como um instantâneo, ele serializa as estruturas de dados na memória em arquivos, garantindo assim a persistência do instantâneo na memória. Depois de liberar o instantâneo, o processo filho é encerrado.
O processo original pode fazer outro instantâneo da mesma maneira e, em caso de falha do sistema, o Redis pode ser recuperado lendo o último instantâneo. Embora o fork seja uma chamada de sistema inestimável, sua sobrecarga foi criticada.

Baumann et al. [20] analisaram o fork e descobriram que ele causa degradação de desempenho em aplicações modernas. Por exemplo, à medida que os aplicativos modernos se tornam mais complexos, o sistema operacional deve considerar aproximadamente 25 casos especiais para começar a processar a chamada do sistema fork para estar em conformidade com a especificação POSIX. Eles resumiram os problemas da chamada do sistema fork e sugeriram os recursos que a chamada do sistema fork deveria ter para o computador moderno.
Eles também fornecem formas alternativas de substituir o garfo. Zhao et al. [19] apontaram que a implementação do fork nos sistemas atuais é ineficiente, uma vez que aplicações com grande consumo de memória requerem muito tempo para configurar a tabela de páginas. Como solução, eles generalizaram a técnica copy-on-write para que a tabela de páginas fosse copiada nas gravações tão bem quanto as páginas normais.
For more information:1950477648nn@gmail.com






