O que significa uma condição de corrida?

10

Eu sou um novo engenheiro elétrico, então tenha paciência comigo. Ouço alguns dos outros engenheiros com quem trabalho falar sobre uma condição de corrida que existe em um de nossos circuitos.

O que isso significa?

Stihl Alighve
fonte
Se você quiser ver um exemplo específico, "Gravações com redução de falhas na RAM" e os dois artigos a seguir têm uma longa discussão sobre um bug que, até onde eu sei, foi acionado por uma condição de corrida.
Davidcary

Respostas:

16

Significa muito simplesmente que duas coisas ao mesmo tempo "competem" pelo resultado.

Um exemplo é um circuito com um pino Reset e um Set, se você acionar a redefinição, a saída se tornará 0. Se você acionar a set, a saída se tornará 1. Se você primeiro acionar a set e depois redefinir muito, muito rapidamente depois, redefina será visto, então a saída é 0.

Mas, se os dois são acionados ao mesmo tempo, o que acontece?

Se o projetista do circuito prestou atenção, deve haver uma resposta, se isso é importante para a função. Se não houver resposta certa para essa pergunta, o circuito tem uma condição de corrida, onde o sinal do aparelho e o reset "correm" um para o outro para ver qual deles vence para determinar a saída.

O caminho com o menor atraso geralmente vence, mas você pode ver a condição da corrida como o gatilho exato em que o caminho mais atrasado é acionado exatamente antes do mais rápido.

Muitos circuitos, incluindo blocos de construção lógicos dentro dos CIs, têm certas condições de corrida, mas geralmente são tais que, quando você usa o circuito da maneira que ele pretende, você não notará. Muitas vezes, quando os engenheiros dizem "condição de corrida" em voz alta algumas vezes, na verdade eles significam que também é uma que pode ocorrer em uso normal, o que seria um problema, porque em uma condição de corrida não é possível prever a operação normal.

No software, o termo também é usado, mas geralmente para indicar problemas de tempo ou travamentos. É um princípio semelhante, no entanto. Freqüentemente, quando você tem dois processos em um computador executando de forma independente, mas usando a mesma memória, você protege essa memória de ser gravada por um, enquanto o outro a usa. Se você não chamar isso de uma possível condição de corrida: um processo pode estar lendo um valor que está apenas no processo de atualização ou ambos podem estar escrevendo nele ao mesmo tempo e então você não sabe o que será acontecer.

Asmyldof
fonte
2
Como complemento a essa boa resposta, gostaria de salientar que o hardware pode se comportar muito mal nessas situações. O hardware real nunca muda instantaneamente de 0 para 1. Ele sempre precisa aumentar por um curto período entre eles. A maioria das lógicas supõe que tenha passado tempo suficiente desde a transição que os transientes resolveram "realmente perto de 0" ou "realmente perto de 1." Se o tempo é ... lamentável, pode estar mais perto de 0,5. Muitos circuitos se tornar "metaestável" neste estado, o que significa que pode levar uma quantidade indeterminada de tempo para transição, desestabilizar todo o circuito
Cort Ammon
1
Mesmo que seu circuito seja projetado para lidar com o caso em que Set e Reset são ativados simultaneamente, você não pode ativá-los de maneira confiável simultaneamente, para não saber qual deles será ativado primeiro.
user253751
Operações não atômicas são um exemplo melhor de condições de corrida em software. Um programa pode criar um novo arquivo usando Cs fopen(), gravar dados fclose()nele e depois chmod()para protegê-lo. Essa breve janela entre fopen()e chmod()abre uma possível condição de corrida em que o modo de arquivo padrão pode permitir que um estranho indesejado trabalhe com o arquivo de uma maneira negada após a chmod()chamada. A solução é criar o arquivo com open()ele, o que permite definir o modo como parte da operação de criação do arquivo.
Warren Young
6

O termo "condição de corrida" implica que (1) dois ou mais sinais podem chegar em qualquer ordem, arbitrariamente próximos um do outro, e (2) não é possível mostrar analiticamente que existe uma probabilidade praticamente zero de qualquer combinação possível de chegada vezes colocando um problema.

Do ponto de vista de um único flip-flop, cuja entrada de dados pode mudar a qualquer momento em relação ao relógio, transições quase simultâneas no relógio e entradas de dados podem representar uma condição de corrida. Do ponto de vista do comportamento geral do circuito, no entanto, eles não representariam uma condição de corrida se pudessem ocorrer apenas nos momentos em que nenhuma circuitos a jusante se importasse com o que a trava continha e nenhum circuito a jusante começaria a se preocupar com o que a trava continha. até depois da chegada de um pulso de relógio que não poderia estar nem perto de nenhuma transição na entrada de dados.

Além disso, como muitas vezes não é possível eliminar completamente todas as possibilidades de tempos de entrada problemáticos, muitas análises das condições de corrida dirão que, se a saída de um registro for alimentada em outro que é controlado pelo mesmo relógio, o segundo registro sempre trava. uma alta "limpa" ou uma baixa "limpa", mesmo que as entradas do primeiro registro tenham causado a captura de um nível de entrada que estava exatamente no limite de comutação. Em teoria, seria possível para a primeira trava capturar um nível que fosse acima ou abaixo do limite exato de comutação, para que o nível de saída mudasse precisamente quando o próximo pulso de clock chegasse.

Como conseqüência, se alguém, por exemplo, pegar uma entrada e passá-la para uma sequência de três flip-flops, e possuir um circuito com saída alta sempre que o segundo flop for alto, mas o terceiro for baixo, qualquer borda ascendente que ocorra a entrada de dados que é precedida por um período completo do relógio em tempo baixo, e seguida por um período completo do relógio em tempo alto, seria essencialmente garantida para fazer com que a saída do circuito fosse alta por exatamente um período do relógio.

esquemático

simular este circuito - esquemático criado usando o CircuitLab

Neste esquema, um sinal com temporização um tanto irregular é normalizado para um relógio de três maneiras, de maneira a gerar uma saída que é alta para um ciclo de relógio após cada borda ascendente. A primeira tentativa de normalizar o sinal gera uma saída com aparência desagradável e tem uma condição de corrida óbvia se a entrada e o relógio mudarem simultaneamente. A segunda abordagem é muito melhor, mas ainda tem uma condição de corrida (que o simulador não pode disparar) se o tempo do relógio e dos dados fizer com que o primeiro registro capture um valor intermediário. A terceira abordagem representa uma prática comum e geralmente seria considerada segura, pois mesmo que o primeiro registro não consiga capturar uma alta ou uma baixa limpa, é muito improvável que a saída do primeiro registro tenha exatamente o comportamento correto para fazer com que o segundo registro não seja capturado corretamente. Se os dados mudarem muito perto do relógio, eles podem ser capturados no ciclo atual ou não serem capturados até a próxima, mas se qualquer uma das situações for aceitável, não há condição de corrida.

supercat
fonte
Você disse: "... uma saída que parece desagradável". Essa é outra maneira de dizer "estado metaestável"?
Solomon Slow
@ Jameslarge: O simulador não lida com estados metaestáveis. Descrevo a primeira saída como feia porque não há largura de pulso mínima e a segunda como arriscada devido à possibilidade de estados metaestáveis.
Supercat
2

Em resumo, significa que o resultado de um processo será afetado pela sequência de chegada de duas entradas e a sequência é indeterminada (não pode ser garantida).

JRobert
fonte