Como projetar estruturas de dados simultâneas?

8

Eu já fiz essa pergunta no Programmers.SE , sem sucesso.

Estou procurando recursos escritos de aprendizado sobre como projetar estruturas de dados simultâneas. Estou mais interessado no processo de design (por exemplo, na identificação dos invariantes corretos) do que no produto final (uma lista de códigos completa).

Para um exemplo concreto: gostei muito do livro de Chris Okasaki, “Estruturas de Dados Puramente Funcionais”, porque é mais do que apenas uma referência - ele orienta o leitor no design de suas estruturas e algoritmos de dados. Freqüentemente, o livro motiva um design complicado ou não óbvio, primeiro fornecendo uma versão mais ingênua e refinando-a até a complexidade de tempo desejada (na pior das hipóteses ou amortizada). Esse é o tipo de coisa que estou procurando.

Assim:

  1. Quais técnicas ou heurísticas existem para projetar estruturas de dados simultâneas?

  2. Existem livros, artigos, postagens em blogs, tutoriais etc. explicando essas técnicas e heurísticas?

pyon
fonte

Respostas:

5

Embora não tenha lido profundamente nesta área, achei a arte da programação de multiprocessadores de Maurice Herlihy e Nir Shavit uma introdução e um levantamento de técnicas úteis. Ele explora diferentes algoritmos, razões sobre como eles funcionam e examina as compensações, recursos e limitações das diferentes abordagens. Embora tenha algum formalismo, espero que seja um texto bastante introdutório e acessível.

Para uma amostra do texto, aqui está a introdução à seção sobre registros atômicos da edição de 2008:

O ponto óbvio para começar é perguntar se podemos resolver o consenso usando registros atômicos. Surpreendentemente, talvez, a resposta seja não. Mostraremos que não há protocolo de consenso binário para dois threads. Deixamos como um exercício mostrar que, se dois threads não podem alcançar consenso em dois valores, então os nthreads não podem alcançar consenso em kvalores, onde n > 2e k > 2.

user650881
fonte
Não tenho medo do formalismo! :-)
pyon
3

A resposta não é tão simples quanto a programação funcional. Na programação funcional, aqui temos um conceito geral do que é programação funcional e a especificação das estruturas de dados em si não muda pelo fato de serem funcionais. No entanto, esse não é o caso da simultaneidade:

  1. Existem muitos modelos de computação distribuída / paralela / simultânea.

  2. Não há uma transformação geral que, dada a especificação de uma estrutura de dados sequencial, forneça a especificação de sua versão simultânea. Existem várias condições (geralmente categorizadas em condições de segurança e liberdade ) que podemos exigir de uma versão simultânea de uma estrutura de dados; há vários novos resultados (por exemplo, operações de pausa, operações de interrupção, falhas, etc.). Portanto, pode haver muitas especificações diferentes para versões simultâneas de uma estrutura de dados sequencial.

Algumas perguntas sobre referências em computação distribuída:

Veja também Por que não conseguimos desenvolver uma teoria da complexidade unificada da computação distribuída?

Kaveh
fonte
1

A primeira regra das estruturas de dados simultâneas é: Você não deseja simultaneidade.

No caso ideal, a computação distribuída / paralela / simultânea significa que você possui vários processos sequenciais completamente independentes. Cada processo possui seus próprios dados e recursos, e o processo nem sequer tem conhecimento de outros processos.

Na pior das hipóteses, você possui um sistema de memória compartilhada com vários encadeamentos consultando e atualizando as mesmas estruturas de dados simultaneamente. Provavelmente algo deu errado, se você está pensando seriamente nisso.

Obviamente, quando estamos falando sobre estruturas de dados concorrentes, é inevitável um certo grau de simultaneidade. Ainda queremos minimizá-lo. Quanto mais tempo um processo puder funcionar sequencialmente sem tocar em mutexes, executar operações atômicas ou transmitir mensagens, maior será a probabilidade de que tudo funcione corretamente e o desempenho seja aceitável.

Estruturas de dados estáticas com atualizações em lote requerem menos sincronização que estruturas de dados dinâmicas. Você deve tentar tornar estáticas as estruturas de dados simultâneas, ou pelo menos o mais próximo possível da estática. Se o seu algoritmo exigir intercalar consultas com atualizações, tente alterar o algoritmo antes de recorrer a estruturas dinâmicas compartilhadas.

O mesmo princípio de design também se aplica à atualização de estruturas de dados estáticas. Quanto mais independente você puder tornar os processos de atualização da estrutura, melhor tudo funcionará.

Jouni Sirén
fonte
O que você quer dizer com "estruturas de dados estáticas"?
pyon 29/02
@ EduardoLeón Estruturas que podem ser consultadas, mas não atualizadas com eficiência, por exemplo, matrizes ordenadas em vez de árvores de pesquisa. Como um benefício adicional, as estruturas estáticas tendem a ser menores e mais rápidas que as dinâmicas.
Jouni Sirén 29/02