Memória Compatilhada Distribuída Bruno M. Carvalho Sala: 3F2 Horário: 35M34 Introdução • Como compartilhar informações entre processadores? – Mensagens em multicomputadores – Memória compartilhada em multiprocessadores • Comunicação através de mensagens cria novas preocupações, como mensagens perdidas, bufferização, bloqueios, etc. • Multicomputadores são fáceis de contruir mas difíceis de programar • Multiprocessadores são difíceis de construir mas fáceis de programar Memória Compartilhada • O uso de memória compartilhada distribuída (DSM) simula um espaço de endereçamento compartilhado por multicomputadores • Referências a páginas locais são feitas pelo hardware. Page faults de páginas remotas são atendidos pelo SO como se fossem um acesso ao disco local • Sistema fácil de contruir e programar, mas sua performance não é adequada em aplicações onde se tenha muitas page faults Memória Compartilhada • Pode-se compartilhar somente uma parte do espaço de endereçamento • Replicação de variáveis compartilhadas em várias máquinas. Leituras locais e escritas através de atualização de multicópias • Compartilhamento de objetos (dados mais métodos) Memória no Chip • Memória pode estar contida no chip com barramento conectando processadores a memória • Escalabilidade muito baixa • Complicado e caro Multiprocessadores de Barramento • Barramentos ligam CPUs a memória e outros dispositivos como E/S • Pode-se ligar várias CPUs ao mesmo bus • Para melhorar performance, usa-se caches nas CPUs • Caches write-trough snoopy (bisbilhoteiras) “escutam” barramento e sabem quando algum conteúdo de sua cache fica inválido (escrita por outra CPU) Multiprocessadores de Barramento • Conteúdo de uma posição de uma cache que foi escrita por outra CPU pode ser atualizada ou marcada como inválida • Protocolo write-once dá possessão temporária de posições da memória • Entradas podem ser inválidas, limpas ou sujas • Posições acessadas para leitura podem ser armazenadas em várias caches ao mesmo tempo • Em escritas, uma cache que quer escrever uma posição que outra está escrevento toma controle Multiprocessadores de Barramento • Entrada na nova cache é marcada como suja (dirty) e na antiga como inválida • Atualização na memória é feita quando posição da cache é retirada da mesma • Este protocolo tem três carcterísticas importantes: – A consistência é atingida usando-se caches snoopy – O protocolo pode ser construído na unidade de gerenciamento de memória – O algortimo inteiro é executado em menos que um ciclo de memória Multiprocessadores em Anel • Espaço de endereçamento único é dividido em partes privada e compartilhada, que é comum a todas máquinas (Memnet) • A interface do anel, a MMU (unidade de gerenciamento de memória), a cache e parte da memória são integradas no dispositivo Memnet • Não possui memória global centralizada, e cada bloco de 32 bytes no espaço compartilhado tem uma máquina home na qual memória está sempre reservada no campo memória home • Um bloco pode ser cached em outra máquina que não a home • Cada entrada na tabela do Memnet tem bits que indicando o estado do bloco da cache Multiprocessadores de Anel • Um bloco read-only pode estar presente em várias máquinas read-write só pode estar presente em uma máquina • Um bloco não precisa estar na sua máquina home • O dispositivo Memnet em cada máquina tem uma tabela que contém uma entrada para cada bloco, indexada pelo número dos blocos • Quando uma máquina precisa ler um bloco que não está presente localmente, uma mensagem é enviada ao anel (aapós adquirir o token) solicitando-o, e quando a mensagem retorna, o bloco está nela • No caso de escrita, blocos em outrs máquinas precisam ser invalidados primeiro Multiprocessadores Switched • Sistemas com barramento ou anel não tem boa escalabilidade • Pode-se melhorar escalabilidade diminuindo a comunicação necessária (cache) ou aumentando a capacidade de comunicação • Uma alternativa e se contruir um sistema hierárquico, com algumas CPUs em um barramento (cluster), conectá-los com barramentos intercluster, e criar outros níveis de hierarquia se necessário • Um exemplo é a máquina Dash (Stanford), onde cada cluster tem um diretório que controla quais clusters tem cópias dos seus blocos Multiprocessadores Switched • Dash tinha 16 clusters com 4 CPUs cada com 256MB de memória global (16 x 16) • Caching é feita em dois níveis, e cada cache de segundo nível monitora o barramento, e cada entrada da cache pode ser uncached, clean ou dirty • Protocolos são baseados em possessão e invalidação, pois em cada instante cada bloco de cache tem um único dono • Acessos a blocos são feitos de acordo com a hierarquia • Um simples acesso a memória pode requerer que várias mensagens sejam enviadas Multiprocessadores NUMA • Significa Acesso de Memória Não-Uniforme e não tenta esconder o fato de que acesso a memórias remotas são mais lentos do que a memória local, isto é caching não é usado • Código e dados são automaticamente movidos para onde são necessários. Performance depende de onde a página está localizada na memória • Page faults geram uma decisão pelo SO, se deve replicar a página sem mudar a página original (leitura), ou se devem mapeá-las como de acesso remoto ou transferi-las (escrita) • Decisão vai afetar performance enormemente Multiprocessadores NUMA • Caso decisão não tenha sido a melhor, SO pode corrigi-la usando scanners de páginas, que coleta estatísticas sobre uso das páginas e número de page-faults • Scanner pode desmapear páginas, gerando uma nova decisão quando for acessada novamente, ou congelá-las, bloquenado sua mudança • Scanners podem usar diferentes estratégias para relocação de páginas, como invalidar páginas que tiveram mais acessos remotos que locais Comparação de Sistemas de Memória Compartilhada • Sistemas de memória compartilhada vão de sistemas que mantém consistência: – inteiramente em hardware: multiprocessador com barramento único(sequent, firefly) ou comutados (dash, alewife) – gerenciada pelo SO: máquina NUMA (cm*, butterfly) ou DSM baseada em páginas (ivy, mirage) – gerenciada pelo sistema de execução da linguagem: DSM de variáveis compartilhadas (munin, midway) ou DSM baseada em objetos (linda, orca) Modelos de Consistência • Manter consistência perfeita é muito difícil, logo alguns DSMs aceitam consistências mais relaxadas dos dados na memória • Um modelo de consistência é um contrato entre o software e a memória, que diz que se o software obedecer certas regras a memória funcionará de acordo com o prometido • Modelos de consistência com maiores restrições são mais fáceis de programar mas são menos eficientes do que os modelos de consistência com menores restrições Consistência Estrita • Define que qualquer leitura de uma posição da memória x retorna o valor gravado pela mais recente escrita • Comum em sistemas uniprocessados • Quase impossível de se obter em um DSM, já que enquanto atualização de uma variável esteja sendo enviada pelo barramento ou rede, outro processador pode efetuar uma leitura • Exemplos: correto (esquerda) incorreto (direita) • W(x)1 • W(x)1 R(x)1 R(x)0 R(x)1 Consistência Sequencial • O resultado da execução é o mesmo como se as operações de todos os processadores foram executadas em alguma ordem sequencial e é igual em todos os processadores • Um método para expressar consistência sequencial é o seguinte: sequências de leituras e escritas do processo i são designadas Hi e o conjunto de todas elas é H • Strings de H são misturados em S onde cada operação aperece somente uma vez em S (ordem das operações caso memória fosse centralizada) Consistência Sequencial • Todos as sequências legais de S devem seguir as regras: – Ordem dos programas deve ser mantida (se A aparece antes de B em algum Hi, então A aparece antes de B em S) – Coerência da memória deve ser respeitada (leitura de x deve retornar valor mais recentemente escrito em x) Consistência Causal • Faz distinção entre eventos que são causamente relacionados e os que não são • Escritas que são causamente relaciondas devem ser vistas por todos os processos na mesma ordem. Escritas concorrentes podem ser vistas em ordens diferentes em máquinas diferentes • Implementação de consistência causal requer informação sobre quais processos viram quais escritas Consistência Causal • Exemplo: 1- W(x)b e W(x)c são concorrentes • Exemplo 2: sequência inválida (a) e sequência válida Consistência PRAM • Escritas feitas por um so processo são recebidas pelos outros processos na ordem em que ocorreram, mas escritas de processos diferentes podem ser vistas em ordens diferentes por processos diferentes • Nome significa Pipelined RAM, porque escritas por um processo podem ser pipelined • Fácil de se implementar, já que a única garantia de ordenação é em relação a escritas de um mesmo processo Consistência Fraca • Nem todas aplicações precisam ver todas as escritas, mesmo que desordenadas. Ex: em um processo em um loop dentro de uma região crítica, escritas são propagadas e nunca são usadas • Utiliza uma operação para a sincronização da memória • A consistência fraca tem as seguintes características: 1. Acessos a variáveis de sincronização são sequencialmente consistentes 2. Nenhum acesso a uma variável de sincronização pode ser feito até que todas as escritas anteriores sejam completadas em todos os locais 3. Nenhum acesso a dados (escrita ou leitura) pode ser feito até que acessos prévios a variáveis de sincronização sejam finalizados Consistência Fraca • • Estas características significam que: 1. Todos os processos veêm as variáveis de sincronização na mesma ordem 2. O acesso a uma variável de sincronização força a finalização de todas as escritas para todas as memórias 3. Quando uma variável é acessada para leitura ou escrita, todas as sincronizações prévias foram finalizadas Programador ou SO precisa bloquear e liberar dados Consistência de Liberação • Na consistência fraca, quando uma variável de sincronização é acessada, a memória não sabe se um processo está para acessar a variável ou se acabou de escrevê-la • A consistência de liberação divide sincronização nas fases de aquisição e liberação • Aquisição informa ao sistema de memória que uma região crítica está para ser iniciada • Liberação informa que uma região crítica foi finalizada • Podem ser usadas com barreiras (barriers) Consistência de Liberação • • Variáveis compartilhadas que são mantidas consistentes com as variáveis de sincronização são chamadas de protegidas Uma memória compartilhada distribuída tem consistência de liberação se: 1. 2. 3. Antes de um acesso comum a uma variável compartilhada é realizado, todos as aquisições prévias feitas pelo processo devem ter sido completadas com sucesso Antes de uma liberação ser permitida, todas as leituras e escritas prévias feitas pelo processo devem ter sido completadas Os acessos a aquisições e liberações devem ter consistência PRAM