Existem coletores de lixo que consideram a paginação?

12

As coletas de lixo precisam visitar todos os objetos que estão vivos, para encontrar a memória que pode ser recuperada. (Ter muitas gerações atrasa um pouco isso)

Sendo tudo igual, é claramente melhor visitar primeiro o objeto que já está paginado na RAM, antes de paginar outro bloco e, portanto, paginar algum objeto.

Outra possibilidade é que, quando o sistema operacional deseja retirar uma página do ram do processo, primeiro o GC é perguntado se ele possui uma página que pode ser abandonada sem precisar ser paginada. O GC pode ser feito principalmente com o movimento de objetos de uma página, para que possa ser apagada dentro do prazo que o sistema operacional precisa para uma página.

No entanto, não consigo lembrar de nenhum coletor de lixo que se integre ao sistema de paginação do SO que conduz a ordem em que o GC trabalha.

Ian Ringrose
fonte
Não é exatamente a paginação, mas o ruby enterprise edition gc foi reescrito para reduzir o efeito do gc na cópia nas páginas de gravação, movendo os metadados do objeto para páginas separadas.
user1937198
Pergunta um pouco relacionada sobre implementações malloc / free: As implementações malloc retornarão memória livre para o sistema? , particularmente esta resposta . Além disso: free () remove o mapeamento da memória de um processo?
Paul A. Clayton
surpreendentemente, afaik / afaict, quase toda a literatura (?) gc não parece analisar a paginação do SO, exceto abstratamente. idéia: um sistema de alocação de memória que rastreie os ponteiros entre os objetos em uma estrutura separada dos objetos em si pode ser mais local / de paginação, porque apenas os ponteiros são percorridos (durante o GC) em um espaço compactado em vez de todos os objetos de objetos. tamanhos variados que podem ser espalhados na memória (e alguns acessados ​​com pouca frequência e assim paginados). pode haver alguma sobrecarga modesta, mas pode resultar em economia geral, dependendo da implementação.
vzn
As unidades flash precisam usar uma forma de copiar a coleta de lixo que leva em consideração o arranjo da memória em blocos, embora eu não saiba o quão bem essas coisas são discutidas na literatura acadêmica. Os problemas a serem resolvidos são muito diferentes (as unidades flash precisam de GC porque o espaço só pode ser reciclado em blocos muito grandes; portanto, se um bloco tiver poucas páginas ativas e muitas páginas mortas, os dados ativos deverão ser copiados em outro local antes da página pode ser reciclado), mas os princípios de consolidação de dados podem ser úteis.
precisa
1
Um padrão que eu usei nos casos em que os itens de dados eram pequenos em relação ao tamanho do meu pedaço de memória consistia em que cada item de dados consistisse em um cabeçalho de tamanho fixo que fosse alocado de frente para trás e dados de tamanho variável que ser alocado de trás para frente. Uma tabela mantinha endereços de chunk lógicos mapeados para endereços físicos e a quantidade de espaço livre em cada chunk; após cada varredura, ele também identificava quanto espaço estava morto. As referências foram armazenadas em flash, e cada referência tinha o formato "Item # 3 do pedaço lógico # 7". Um ciclo de GC copia todos os dados ao vivo de um pedaço para um novo, e ... #
317

Respostas:

8

Pelo que me lembro, os coletores de cópias devem ser amigáveis ​​para paginação, pois o rastreamento copiando tende a melhorar a localidade das referências de ponteiro. Isso tem um efeito positivo no programa (mutador) que causará menos falhas de página ao seguir os links e também melhorará o próximo ciclo de coleta, pois o rastreamento também causará menos falhas de página. A agenda de rastreamento (quais ponteiros devem ser processados ​​primeiro) pode ter um impacto na eficácia para melhorar a localização dos dados. Isso pode ser aprimorado medindo estatísticas sobre o número de acesso a diferentes ponteiros em diferentes tipos de células.

Agora, se você considerar um coletor de rastreamento em geral, geralmente deverá manter uma estrutura que controla os ponteiros que ainda não foram rastreados. Pode ser possível organizar essa estrutura para que todos os ponteiros em espera apontando na mesma página sejam mantidos juntos (embora isso possa exigir mais espaço, em alguns casos, dependendo das técnicas disponíveis para manter a lista desses ponteiros). Uma política possível é sempre rastrear primeiro o maior conjunto de ponteiros em espera apontando para a mesma página, quando não houver ponteiro em espera para as páginas na memória.

Em relação à pergunta do terceiro parágrafo, que foi adicionada após a resposta, a coleta de cópias é novamente uma resposta. O sistema operacional pode reduzir o número de páginas físicas alocadas no momento da coleta, pois as páginas são completamente liberadas. Com um coletor de marca e varredura, o evento de uma página inteira ficar livre é provavelmente muito mais raro, portanto não vale um machanismo específico a ser levado em consideração.

Esse tipo de idéia é natural e provavelmente é descrito em alguns dos documentos. Mas não me lembro de imediato. Eu acho que os primeiros artigos sobre o Lisp GC contêm algumas dessas idéias (como: carro ou cdr devem ser seguidos primeiro?).

As boas notícias nesta função de coleção de cópias também são que a paginação é amigável para copiar a coleção, pois aumenta o espaço de armazenamento disponível. Lembre-se de que o coletor de cópias requer, em princípio, o dobro do espaço usado para o armazenamento de dados real. Agora, o efeito da paginação depende também do espaço de endereço da máquina e da memória física disponível. No computador antigo, a memória física era muito menor que o espaço de endereço disponível, de modo que a paginação era realmente um bônus de espaço, permitindo políticas como copiar o GC. Mesmo quando o espaço físico é tão grande quanto o espaço de endereço, convém compartilhá-lo, para que o processo usando um GC tenha menos espaço de endereço sem paginação (consulte Paginação) Essas observações são um pouco substituídas pelo uso de coletores geracionais. Eles geralmente usam a coleção de cópias para a geração jovem precisamente por causa dessas qualidades e porque a geração jovem tem vida curta.

Então você tem todas as interações do GC geracional com o sistema de cache, que foram discutidas em uma pergunta anterior: Os coletores de lixo geracionais são inerentemente compatíveis com o cache?

Para obter mais informações sobre esse problema, eu pesquisaria na web, por exemplo, as palavras-chave coleta de lixo e localidade .

babou
fonte
sou duvidoso da idéia de colecionadores de cópias serem mais "locais" do que rastrear. coletores de cópias parecem conceitualmente bastante semelhantes na dinâmica de acesso à memória (talvez quase indistinguíveis) do rastreamento no "espaço antigo". acho que isso precisa de uma referência. Dito isto, existe alguma possibilidade do mecanismo de cópia melhorar a contiguidade no novo espaço. o novo espaço começa perfeitamente contíguo, mas essa "localidade" diminui ou se degrada com o tempo.
vzn
Bem, você encontrou a maior parte da resposta. Portanto, não seja duvidoso. Está nas referências básicas sobre o tópico. Localidade do fato de o armazenamento ser compactado e da cópia que substitui próximas umas das outras células de dados que são logicamente fechadas de acordo com a estrutura do ponteiro (que pode evoluir com a reatribuição do ponteiro).
babou
ainda sou cético / duvidoso. parece intuitivamente que o espaço antigo terá uma localidade e / ou contiguidade ruins quando o ciclo de cópia / gc for iniciado. A localidade está relacionada às leituras (do espaço antigo) e gravações (ao novo espaço). Para analisá-lo, o comportamento gestalt / emergente deve ser estudado. possivelmente muito disso só pode ser efetivamente / precisamente / realisticamente estudado empiricamente e não muito teoricamente.
vzn
Estou dizendo que está na literatura, como muitas outras coisas. Mas não tenho tempo para procurá-lo e acho que minha resposta é longa e cheia de informações., Você pode pesquisar no google: localidade da cópia da coleta de lixo e há uma referência a uma pergunta anterior. Desculpe por ser conciso, tenho que pegar um trem.
babou
Desculpe ... confunda esta pergunta com outra ... que tem mais.
babou
8

Emery Berger, Matthew Hertz e Yi Feng fizeram alguns trabalhos sobre isso.

A coleta de lixo oferece inúmeras vantagens de engenharia de software, mas interage mal com os gerenciadores de memória virtual. Os coletores de lixo existentes requerem muito mais páginas do que o conjunto de trabalho e as páginas de toque do aplicativo, independentemente de quais estão na memória, especialmente durante a coleta de lixo de heap completo. A paginação resultante pode fazer com que o rendimento caia e os tempos de pausa aumentem em segundos ou até minutos.

Apresento um coletor de lixo que evita paginação. Esse coletor de favoritos coopera com o gerenciador de memória virtual para orientar suas decisões de remoção.

Este é um vídeo da palestra de Emery e ele escreveu um artigo Coleta de Lixo Sem Paginação

Por algumas razões, parece não haver muito trabalho posterior, ou qualquer uso no mundo real. No final do artigo, diz: "Estamos desenvolvendo uma variante simultânea do algoritmo de coleta de favoritos" , mas não consigo identificá-lo.

CRAMM: O suporte de memória virtual para aplicativos coletados de lixo procura alterar o sistema operacional para fazer o GC criar menos paginação.

Usando a residência da página para equilibrar as compensações no rastreamento da coleta de lixo

Introduzimos uma extensão principalmente da coleção de cópias que usa a residência da página para determinar quando realocar objetos. Nosso colecionador promove páginas com alta residência no local, evitando trabalho desnecessário e espaço desperdiçado. Ele prediz a residência de cada página, mas quando suas previsões se mostram imprecisas, nosso coletor recupera espaço desocupado usando-o para satisfazer solicitações de alocação.Usando a residência, nosso coletor pode equilibrar dinamicamente as trocas de cópias e coleções que não são cópias. Nossa técnica requer menos espaço do que um coletor de cópia pura e oferece suporte à fixação de objetos sem sacrificar a capacidade de realocar objetos. Ao contrário de outros híbridos, nosso coletor não depende da configuração específica do aplicativo e pode responder rapidamente às mudanças no comportamento do aplicativo. Nossas medidas mostram que nosso híbrido tem um bom desempenho sob uma variedade de condições; prefere copiar a coleção quando houver amplo espaço de heap, mas recorre à coleção sem copiar quando o espaço se torna limitado.

Ian Ringrose
fonte