Modelos de Consistência de Memória
Um modelo de consistência de memória especifica quais valores as leituras podem observar quando threads concorrentes acessam memória compartilhada, definindo as garantias de ordenação nas quais os programadores podem confiar.
Definition
Um modelo de consistência de memória é uma especificação formal dos valores que as operações de leitura podem retornar em uma execução concorrente, fixando as ordenações de acessos à memória que a linguagem, o compilador e o hardware devem respeitar.
Scope
Este tópico abrange o espectro de modelos de consistência, desde a consistência sequencial até modelos relaxados e fracos, a relação happens-before e garantias livres de corrida de dados, ordenações de memória de hardware (como ordem total de armazenamento), e modelos de memória em nível de linguagem para C++ e Java. Ele aborda por que modelos relaxados existem, como cercas (fences) e atômicos restauram a ordenação, e como raciocinar de forma sólida sobre memória concorrente.
Core questions
- Quais ordenações de operações de memória um programa pode observar legalmente?
- Por que existem modelos de memória relaxados e o que eles permitem?
- Como a garantia livre de corrida de dados simplifica o raciocínio?
- Como as cercas (fences) e operações atômicas impõem a ordenação?
Key theories
- Consistência sequencial
- Lamport definiu a consistência sequencial, na qual uma execução multiprocessador deve parecer como algum único entrelaçamento de operações que respeita a ordem do programa de cada processador, o modelo de linha de base intuitivo mais forte.
- Consistência relaxada e a garantia SC-for-DRF
- Adve e Gharachorloo explicam modelos relaxados e o princípio de que programas livres de corrida de dados se comportam como se fossem sequencialmente consistentes, conciliando desempenho com programabilidade.
- Modelos de memória em nível de linguagem
- Manson, Pugh e Adve formalizaram o modelo de memória Java usando uma relação happens-before, definindo quais otimizações são legais e quais garantias até mesmo programas com corrida de dados recebem.
Clinical relevance
Como processadores multicore e compiladores otimizadores reordenam operações de memória, os modelos de memória de linguagem são essenciais para escrever código concorrente correto e portátil. Eles informam aos programadores quando a sincronização é necessária e definem as garantias que bibliotecas e runtimes podem oferecer.
History
Lamport formalizou a consistência sequencial em 1979. À medida que o hardware adotava ordenações relaxadas para desempenho, o tutorial de Adve e Gharachorloo de 1996 codificou o panorama dos modelos de consistência e a estrutura livre de corrida de dados. Os projetistas de linguagem então incorporaram modelos de memória nas especificações, com o modelo de memória Java (2005) e o modelo de memória C++11 estabelecendo a abordagem moderna.
Debates
- Semântica de programas com corrida de dados
- Uma questão difícil é quais garantias, se houver, dar a programas que contêm corridas de dados; os modelos de linguagem devem prevenir valores 'do nada' (out-of-thin-air) enquanto ainda permitem otimizações agressivas de compilador e hardware.
Key figures
- Leslie Lamport
- Sarita Adve
- Kourosh Gharachorloo
- William Pugh
- Jeremy Manson
Related topics
Seminal works
- lamport1979
- adve1996
- manson2005
Frequently asked questions
- Por que nem todos os sistemas usam apenas consistência sequencial?
- A consistência sequencial proíbe muitas otimizações de compilador e hardware que melhoram o desempenho, então a maioria dos sistemas reais adota modelos relaxados e fornece primitivas de sincronização para recuperar uma ordenação mais forte apenas onde necessário.
- O que é a garantia livre de corrida de dados?
- Sob muitos modelos de memória de linguagem, um programa que não contém corridas de dados (todos os acessos conflitantes são devidamente sincronizados) tem a garantia de se comportar como se a memória fosse sequencialmente consistente.