Pergunta

Recentemente, eu encontrei-me ter de escrever-se algumas preocupações que tenho sobre as condições de corrida em um aplicativo que está em desenvolvimento (não por mim). Este provavelmente será levado ao conhecimento dos interessados, que são não-técnica e com quem eu não tenho uma linha direta de comunicação, por isso as minhas necessidades explicação para a forma escrita.

Eu já fez uma tentativa neste write-up. I encobrir as especificidades técnicas da melhor maneira que pode, dar um exemplo de como uma condição de corrida iria ocorrer na aplicação, e descrever o seu impacto. Eu sinto que fiz muito bem, mas está longe de ser perfeito.

O problema é que, tanto quanto eu tento proteger o leitor de ciência da computação, eu ainda têm encontrado dificuldades para eliminar frases como "threads de execução" e "exclusão mútua" sem perder a exatidão e substância. O risco é que, com demasiada acenando lado, essas preocupações podem ser demitidos como um bicho-papão fez-up.

De qualquer forma, a minha pergunta é esta:? Como seria você explicar as condições de corrida para um público não técnico Você teria coragem de explicar escalonamento de CPU? Será que você chamar os filósofos jantar ?

Você não tem que trabalhar dentro das limitações de minha situação (mas seria impressionante útil se você fez).

Foi útil?

Solução

Empresa X tem US $ 1.000 no banco. X paga uma renda de US $ 2.000 e recebeu um pagamento de US $ 10.000 por serviços prestados à empresa Y. No entanto, devido a uma condição de corrida, X está em déficit de US $ 1.000 e agora está aplicando para a bancarrota. = (

Você pode querer explicar como conta a alças bancárias companhia de X desta forma: funcionários do Banco A pega o valor atual de US $ 1.000 e adiciona US $ 10.000 para ele. funcionários do banco B recebe o valor atual de US $ 1.000 e subtrai $ 2.000 a partir dele. funcionários do Banco A atualiza o valor de US $ 11.000. funcionários do Banco B atualiza o valor para -. $ 1.000

Outras dicas

Eu acho transações bancárias pode ser um bom exemplo, tanto porque é fácil ver que um resultado incorreto é mau e porque as condições de corrida são fáceis de criar em tal ambiente.

Eu tenho US $ 500 em minha conta. Alguém transferências $ 200 para mim, ao mesmo tempo que eu retirar $ 50.

Agora, se o banco não lidar com as condições de corrida corretamente, eles vão fazer o seguinte (assumindo que as transações são processadas manualmente, é claro) Clerk Um verá a solicitação para adicionar US $ 200 para o meu equilíbrio, e nota que o equilíbrio é atualmente de US $ 500. Clerk B vai ver o pedido para subtrair $ 50 do meu equilíbrio, e nota que o equilíbrio é atualmente de US $ 500 (balconista A ainda não transferiu o dinheiro).

Clerk A termina a papelada e define saldo da minha conta para US $ 700 (500 + 200 ele deveria adicionar). E, em seguida, um minuto depois (porque funcionário B só tinha que pegar uma xícara de café), funcionário B termina-se a outra transação e define o meu saldo para US $ 450 (o 500 que eu tinha quando ele verificou, menos o 50 ele estava destinado a subtrair ).

Meu equilíbrio é agora $ 450, quando deveria ter sido de US $ 650, por causa de uma condição de corrida. O resultado depende da ordem em que foram realizados diferentes partes das duas operações.

Essa é a descrição geral de como as condições de corrida são maus. Agora dizer que em vez de funcionários, temos o nosso aplicativo de processamento de duas tarefas distintas ao mesmo tempo (que é o seu 'threads de execução'), e, assim como acima, ambos ler um valor, modificar o valor que que ler, e, em seguida, escrevê-lo de volta. Uma das modificações podem então ser perdido se isso acontece na ordem mostrada acima. Isso deve relacioná-la com os problemas específicos na sua aplicação.

Gostaria de ir para um jantar abordagem Philosopher's-esque, mas dependendo do meu público, eu tentaria analogia ao contexto do meu público. Você está falando com executivos de negócios? Então analogize lo para algo como alocar uma sala de reunião ou um carro corporativo ou reservar um quarto de hotel ou qualquer outra coisa. Você está falando com as pessoas comuns? Em seguida, o exemplo do filósofo de jantar é bom, ou você pode pensar em uma situação semelhante envolvendo cuidar de animais de fazenda ou sentados em cadeiras ou qualquer outra coisa.

Se você seqüestrar exemplo do filósofo jantar, ou fazer a sua própria, definitivamente usar uma metáfora.

Se você está escrevendo para um público não técnico, você vai querer simplificar suas explicações e relacioná-la com algo que eles possam entender. Uma explicação retirados das Analogias de papel para o ensino de computação paralela para programadores inexperientes ( http: // portal ? .acm.org / citation.cfm doid = 1189136.1189172 ) explica em termos de um jogo de caneta:

Vamos jogar um jogo chamado o Jogo Pen. As regras são simples: eu sou vai segurar uma caneta na minha mão, e então eu vou dizer “Um, dois, três, ir.” Quando eu digo “ir,” tomar a caneta da minha mão. Quem recebe as vitórias de caneta. Pronto? Um, dois, três, ir.

Você, então, perguntar se o resultado deste jogo pode ser previsto com antecedência. Se ele não pode ser previsto, podemos garantir um resultado correto? Isso deve levar à conclusão de que é possível obter resultados incorretos para gravações simultâneas para o mesmo pedaço de memória.

Eu ia recomendar o jantar dos filósofos, mas eu vejo que você já descobriu que um. Então, como uma alternativa, como sobre o uso impasse como uma analogia?

Imagine o tráfego normal condução ao longo das quatro ruas ao lado de um único bloco cidade (ave do Norte, ave do Sul, rua do leste e da rua Oeste). Quando há apenas um ou dois carros na estrada, tudo se move suavemente. Quando há tráfego constante, alguns carros vai ter que parar e esperar por outros carros para mover passado, mas este é um problema administrável. Um carro pára para esperar por um outro carro para ir, e, em seguida, continua em seu caminho alegre.

Agora, imagem da hora do rush tráfego no mesmo local. Vamos dizer que um carro de condução do Sul, na West Street, não pode fazê-lo todo o caminho através do cruzamento no canto noroeste do nosso bloco cidade. Esse carro agora bloqueia todo o tráfego cruz Westbound no Norte av. Ele não leva muito tempo antes de um tentativas carro Westbound para torná-lo através do canto intersecção Nordeste e fica preso, bloqueando todo o tráfego sentido norte na rua Médio. Quando esta situação torna todo o caminho em torno dos quatro cruzamentos, nenhum carro pode mover! Cada um está à espera dos carros na frente dele para seguir em frente, mas não há nenhuma maneira para que o impasse seja releived sem puxar carros fora para trás.

A comparação com a computação deve ser simples. Os carros são segmentos ou processos, ruas e avenidas são processadores, tampões ou núcleos. O conceito de bloquear pode ser descrito usando semáforos ou sinais de parada, ea coisa toda começa a fazer sentido intuitivo, mesmo para os não-programadores.

Escreva um programa:

  1. Aguarde salário.
  2. Vá para fazer compras.
  3. Comprar alimentos.
  4. Ligue a placa.
  5. Coloque comida no prato.
  6. placa manter por 20 minutos.
  7. Coma.
  8. Vá para a cama.

Agora tente ter dois threads (você, esposa) executá-lo sem sincronização.

  • Você:. Aguarde salário
  • Esposa: Vá para a loja sem dinheiro, queda

  • Você:. Ligue a placa

  • Você: Mantenha placa por 20 minutos.
  • Você:. Ir para a cama

  • Esposa:. Comer em lugar de outra pessoa

  • Esposa: ir para a cama.

Peter quer sair de sua garagem. Ele verifica que nada está no caminho de seu carro, em seguida, entra. Seu filho Frank, em seguida, se esconde atrás do carro. Peter não pode vê-lo e corre-o.

O importante aqui é que, para um computador, "inspecionar" e "modificar" tendem a ser duas ações separadas, de modo que um exemplo onde você não pode verificar algo quando você modificá-lo é uma boa.

Como sobre a planície óbvio?

A condição de corrida é, literalmente, uma corrida entre duas pessoas.

A empresa está oferecendo em um projeto. Dois funcionários que trabalham de forma independente em licitações enviá-los para o cliente, mas um dos funcionários tem informações desatualizadas. Não conhecem empregado que o outro está no processo de submeter uma oferta, portanto, dependendo de quem é mais rápido, a primeira oferta pode ser substituído com o funcionário mais lento. Isto irá causar confusão como o lance pode ter mudado ao longo do tempo.

É preciso haver comunicação entre os dois funcionários, quer trabalhar em conjunto ou paragem de um deles.

Uma dificuldade em explicar o conceito geral é que as condições de corrida se manifestam em uma ampla variedade de situações. Se seu objetivo é dar o seu público não-técnico no sentido de que este é um tipo de problema genérico, você deve tentar oferecer mais do que um exemplo.

Uma imagem vale mais que mil palavras. É verdade. Se você desenhar uma linha do tempo e colocar alguma entidade sobre ele, e mostrar suas mudanças de estado com o tempo você pode demonstrar uma corrida condição muito facilmente em um diagrama. Pode demorar alguns redos para obter a imagem apenas para a direita, mas eu sempre achei que o desenho-lo tem o meu ponto de vista must mais rápido do que descrevê-lo.

Eu acho que é difícil de explicar isso de uma maneira simples, porque o pensamento sobre a simultaneidade é inerentemente difícil. A idéia básica de uma operação financeira pode ser um bom lugar para começar, uma vez que as pessoas vão ter alguma familiaridade com as crianças da vida real.

Em qualquer tipo de transação, você precisa fazer entradas simultâneas em dois lugares - débitos e créditos. Se a transação for interrompido no meio por alguém tentando executar outra operação, eles vão ver o equilíbrio errado em uma ou outra das contas.

Há um grande exemplo no Programação Concorrente Estruturado com os sistemas operacionais Aplicações ( se bem me lembro)

No país empobrecido de Bezerkistan, duas linhas se fundem em uma única faixa em um túnel. Houve colisões e junta no poder precisa de uma solução.

A questão é que é montanhoso e os engenheiros são cegos. Há muito pouco aviso prévio de dois trens prestes a colidir no túnel.

Aqui está o plano.

  1. Coloque uma tigela grande na junção.

  2. Dê a cada engenheiro de um pequeno macaco de bronze.

Quando você está prestes a entrar no túnel, você parar o trem. Você pat em torno da tigela para ver se um macaco de bronze é na tigela.

Se há um macaco, alguém está usando o túnel, então você tem que esperar até que o trem é inteiramente no túnel, momento em que o condutor sai do vagão e pega o macaco da tigela.

Se não houver macaco, ninguém mais está usando o túnel. Assim, você pode pegar o seu macaco do compartimento do motor, coloque-o na tigela e unidade através do túnel, sabendo que você tenha adquirido acesso exclusivo para a pista. Claro, você parar brevemente para permitir que o condutor para recuperar o macaco de bronze.

Adivinha o quê?

Eles ainda tinha colisões!

Por quê? Qual é a situação ou sequência de ações que faz com que isso falhar?


Isso é uma condição de corrida.

Em um documento escrito, você pode explicar como os fios de condição de corrida a um acidente.

Em uma apresentação, você pode treinar o público através de raciocínio sobre concorrência e bloqueio.

Gostaria de usar um exemplo conta bancária memória compartilhada de uma condição de corrida de dados.

explicar que o computador faz algo como: equilíbrio de carga; adicione 1; equilíbrio loja ;. considerar dois tópicos que estão modificando o seu saldo de conta bancária (você e sua esposa são ambos depositar um dólar, ao mesmo tempo).

Se ambas as linhas se interuupted após o: balanceamento de carga; e em seguida, retomar, você pode perder um dólar.

ver: http://wasp.cs.washington.edu/atomeclipse/handouts .pdf

Como você mencionou, muitas vezes você precisa introduzir outros conceitos (exclusão mútua, threads de execução) para descrever com precisão as condições de corrida, mesmo em uma metáfora. Portanto, tente definir estes termos (ou, pelo menos, ficando a ideia de diâmetro) em primeiro lugar, usando metáfora.

Como um exemplo simples, vamos usar um cruzamento de 4-way (definido em um país onde você dirige à direita). Divida a interseção em 4 quadrantes: Norte-Oeste, Nordeste, Sudeste e Sul-Oeste. Agora chamar cada quadrante um recurso, e chamar cada carro um segmento de execução. Estes carros respeitam somente a sistemas de tráfego, e uma vez que não há sinais de parada ou semáforos neste cruzamento, os carros barril direita no meio sem abrandar ou considerando o tráfego.

Você pode facilmente mostrar que o uso simultâneo de um desses quadrantes por mais de um carro é ruim, e resulta em um acidente de carro. Uma solução óbvia é a instalação de um sistema de tráfego. Os garante sistema que não mais do que um carro está passando por um quadrante ao mesmo tempo. Ele pode fazer isso intrinsecamente, sem ocupar todos os recursos. Por exemplo, deixando os carros que vêm do Sul vire à esquerda para a cabeça Oeste (usando Sudeste e quadrantes norte-oeste), ao deixar os carros que vêm do Ocidente fazer uma curva à direita para a cabeça do Sul (com o quadrante sudoeste) . O sistema de tráfego está fornecendo exclusão mútua, ou prevenir o uso simultâneo (por vários carros) de um recurso comum (o quadrante de estrada no cruzamento).

Esta, pelo menos, fornece as idéias por trás dessas definições, a ideia de que o acesso a recursos compartilhados simultaneamente pode ser ruim, e que a exclusão mútua pode resolver este problema. Depois que isso for estabelecido, você precisa mapear estes a uma metáfora mais apropriada para mostrar o que é uma condição de corrida é e como ele é uma daquelas coisas ruins que resulta da falta de exclusão mútua para um recurso comum.

É preciso um pouco mais longo, mas concede alguma familiaridade com termos e o retrato grande antes de perfurar para baixo em uma metáfora mais complexa.

Falando de dinheiro com suas partes interessadas pode enviá-los em pânico, especialmente se eles assumem que estão a perder dinheiro real por isso, que não é exatamente ideal, se o problema não especificamente resultar em uma perda líquida de lucros, então aqui está um menos financeiramente orientados história sobre como você pode explicar uma condição de corrida a ninguém.

Esta história não aborda o conceito de impasse , mas o cenário condição de corrida mais tradicional e consequências.

história começa aqui:

O Ambiente: Existem 3 cidades conectadas por uma rede ferroviária. Os trens não têm quaisquer sinais sobre elas indicando qual cidade eles estão vindo e qual cidade eles vão, porque eles estão sendo usados ??entre todos os 3 cidades e da rede ferroviária não querem lidar com o incômodo de sinais mudando o Tempo. Como a rede é pequena não há nenhuma agenda concreta sobre quando os trens chegam e saem. Os superintendentes estação apenas receber um telefonema de outros supervisores da estação da cidade quando um trem parte, o superintendente toma nota do momento em que ele deixou e desde que todos os trens são os mesmos modelos que dirigem na mesma velocidade, por isso, quando o supervisor recebe um telefonema de outras cidades que anunciar ao povo a estação que: "o próximo trem vai ser a posição para a cidade de C". Então, as pessoas que pretendam viajar para a cidade de C esperam o trem, hop on e passeio alegremente a cidade C.

O Problema: Mas um dia, como um trem estava planejando sua rota de A para B para C, ele quebrou a meio caminho entre A e B. Felizmente, os técnicos são muito qualificados e faria ser capaz de reparar o trem em um curto tempo. No entanto, naquele mesmo dia um outro trem também estava planejando uma rota diferente de C para B para A. O superintendente na estação B recebeu um telefonema de um que um trem está chegando, e pouco depois recebeu outra chamada de C que outro trem também estava por vir. A estação de superintendente, em seguida, anunciou aos passageiros que aguardam na estação: "O primeiro trem chegando vai ser a posição para a estação C, e logo após o trem depois que vai ser a posição para a estação A." Como os passageiros se reuniram a sua bagagem e foi para suas respectivas plataformas. O superintendente vi um trem vindo e redirecionou os trilhos para a plataforma onde as pessoas estavam planejando a cabeça para a cidade C. Mal sabiam eles que o trem estava indo realmente para a cidade Um vez. O outro trem, depois de ter fixado os seus problemas mecânicos também chegou à estação e o supervisor feliz dirigiu para a plataforma que contém os passageiros que desejam ir para a cidade A. Escusado será dizer que nenhum dos passageiros chegou onde planejavam, tudo por causa do superintendente assumiu que eles iriam chegar em ordem, como de costume.

O problema com as condições de corrida e muitas muitas construções de ciência da computação é que as pessoas não são computadores. Toda vez que eu explicar um algoritmo para meus alunos que eles dizem "mas não faz sentido fazê-lo dessa maneira", ao qual eu respondo "computadores não têm senso comum, todos eles têm são instruções". Isso de lado, você deve explicar uma condição de corrida como uma corrida, e isso faz mais sentido para que as pessoas realmente tentar a corrida, se puderem. Dessa forma, eles podem ver como as coisas vão mal. Mas ... eles não estão autorizados a usar o senso comum.

Então, vamos supor que temos um jogo onde 2 pessoas encher-se pilhas de blocos coloridos, a fim vermelho, laranja, amarelo. Eles têm muitas vermelho, laranja e blocos amarelos. Todas as pilhas precisam ser exatamente três blocos de altura.

No primeiro jogo tanto tentar fazer isso o mais rápido possível, mas eles só trabalho em suas próprias pilhas.

No segundo jogo eles tentam trabalhar em conjunto, permitindo-se a também bloqueia pilha em cada outras das pilhas. No entanto, eles não estão autorizados a alterar o bloco que eles têm em suas mãos, e eles têm que colocar um bloco planejado.

Você pode imaginar uma situação como esta ocorre na pilha 1:

player 1 grabs a red block
player 1 places red block         - player 2 grabs an orange block
player 1 grabs an orange block    - player 2 places an orange block
player 1 places an orange block

Então, agora temos uma pilha com dois blocos de laranja. É óbvio que com um jogo humano que isso nunca iria acontecer, porque as pessoas têm o senso comum:. Vêem que o bloco de laranja já está colocado, e reverter a sua decisão de também colocar um bloco de laranja

Além disso, você pode mostrar-lhes este vídeo: https://www.youtube.com/watch? v = TcGwNdbsAbc

Vamos usar um quadro branco para fazer uma tarefa de contabilidade trivial. Temos US $ 100 na mão -. Write-lo no quadro branco

Alice tem dezenas de faturas que somam US $ 100, então ela vai notar que US $ 100, ir e adicionar até sua lista e voltar em 5 minutos e escrever $ 200 no tabuleiro.

sido compras de Bob. Ele vai levar esse número a partir do quadro e ir e subtrair $ 50 no valor das compras, em seguida, ele vai escrever $ 50 no tabuleiro.

Se Bob recebe de volta em primeiro lugar, vamos ver $ 200 após Alice escreve seu resultado. Se Alice recebe de volta primeiro vamos ver $ 50, também errado. O que nós deseja para ver é de US $ 150, e precisamos adicionar algumas precauções em algum lugar para que isso aconteça.

Isso deve ser suficiente para scaffold uma discussão de soluções técnicas com intuições razoáveis.

Por exemplo, um meio mutex você trancar a porta do quarto com o quadro nele, e torná-los fazer o seu trabalho lá. Um meio de soluções otimistas você pegá-los tanto para verificar e começar de novo se o número mudou enquanto eles estavam fora. Se você quiser falar sobre impasses, você pode rir sobre Bob chamando Alice de dentro da sala trancada para pedir-lhe para se apressar.

Enviá-los para Condição de corrida na Wikipedia.

A primeira parte vai fazer algum sentido, eo resto (não mostrado abaixo) vai fazer você parecer inteligente, já que eles vão assumir que você compreendê-lo.

"condição Uma raça ou perigo corrida é uma falha num sistema ou processo em que a saída e / ou resultado do processo é inesperadamente e criticamente dependente da sequência ou temporização de outros eventos. O termo origina com a ideia de dois sinais competindo entre si para influenciar a saída primeiro ".

Eu acho que o ponto-chave para obter toda é que o seu mais frequentemente um problema de tempo que pode ser imprevisível, porque o timing algo leva difere de tempos em tempos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top