O que é uma condição de corrida?

Conteúdo

vara de corrida

Você já participou de uma corrida? Sim é assim, Você sabe que às vezes é necessário um acabamento fotográfico para selecionar o vencedor! Mas, E se duas pessoas alcançassem a linha de chegada ao mesmo tempo? Bem-vindo às condições de corrida.

Quais são Tópicos de computador?

Para explicar uma condição de corrida, primeiro temos que entender um pouco como os computadores funcionam internamente. Ao usar um sistema operacional, irá realizar várias ações como abrir uma janela de terminal de comando, abra um navegador, etc. Cada uma dessas ações resultará em uma reação do sistema operacional para iniciar um novo procedimento de computador / cientista da computação.

Um thread é um procedimento de computador / computador que vai rodar / irá executar as várias etapas (etapas de programação, originalmente escrito em formato de código-fonte e regularmente compilado por um compilador) necessário para executar a tarefa que você solicitou do sistema operacional ou software em execução. .

En Linux, tal tópico é identificado exclusivamente por um PID (Identificador de procedimento). Para saber mais sobre PIDs no Linux, puede leer nuestros posts Bash Automation and Scripting Basics (Papel 3) y Como funcionam os sinais do Linux: SIGINT, SIGTERM y SIGKILL.

No Windows, um thread também é identificado exclusivamente por meio de um ID de procedimento (Ref. PID coluna no Gerenciador de Tarefas do Windows), mesmo que a implementação do gerenciamento de processos seja diferente entre Linux e Windows; código diferente por trás, diferente PID ferramentas de interação, etc. e compatibilidade limitada. Ao mesmo tempo, o ID de procedimento do Windows PID não deve ser confundido com o ID do produto PID (mesmo termo, significado diferente) o NO (ID do provedor). Os dois últimos referem-se à identificação do dispositivo e não estão relacionados ao gerenciamento de processos.

Quando um tópico começa, pode ele mesmo iniciar outros tópicos. O tópico original costuma ser chamado de tópico principal ou pai. Como um exemplo, quando você clica no ícone do seu navegador favorito, irá iniciar um tópico imediatamente (o tópico principal), e esse thread irá iniciar rapidamente vários threads filhos ou threads e, por isso, se tornará o tópico principal.

Você também pode pensar em tópicos como corredores em uma corrida. Como um exemplo, pense em um servidor de banco de dados ocupado atendendo a muitos clientes conectados diferentes. Cada um desses tópicos do cliente (observe o uso da palavra thread) terá (em vários casos) por si só, pelo menos um thread no servidor host do banco de dados e / ou dentro do próprio software de banco de dados (Em outras palavras, dois tópicos, um registrado no sistema operacional e um no software de banco de dados).

O servidor de banco de dados está tentando atender a todos esses threads ao mesmo tempo, daí o termo processos concorrentes o threads simultâneos e se houver bugs no software de banco de dados (ou no sistema operacional, etc.), mais cedo ou mais tarde você pode se encontrar em uma condição de corrida.

Que e um Condição de corrida?

Uma maneira simples de relacionar isso aos corredores em uma corrida é imaginar uma foto de chegada na qual dois corredores realmente cruzam a linha de chegada ao mesmo tempo.. É factível, embora bastante improvável, que isso acontece em raças humanas. Para computadores que processam centenas de operações por milissegundo, torna-se muito mais viável.

Como outro exemplo, imagine uma corrida de revezamento em que os corredores passam um bastão (a vara colorida chamativa) de uma pessoa para outra. Imagine agora que um dos membros da corrida comete um erro, e agora há dois corredores que acham que deveriam pegar a bandeira vermelha.

Um evento importante em uma corrida de revezamento é a passagem do bastão, pois isso pode significar que o detentor anterior do token pode parar de funcionar, e agora cabe ao novo dono da testemunha dar o seu melhor. Agora há dois corredores agarrando o bastão. Vai ser uma situação interessante de assistir na televisão (se você gosta desse tipo de coisa), mas é claro que haverá algumas consequências.

Em essência, uma condição de corrida é um erro, erro ou falha no código do sistema do computador que produz resultados imprevisíveis: uma sequência inesperada de eventos. É normalmente devido a dois tópicos conflitantes de alguma forma, uma vez que mais de dois threads podem estar envolvidos no conflito real e, frequentemente, mais de dois threads em execução em software defeituoso.

Em nosso exemplo da raça humana, tivemos duas pessoas acessando um objeto aproximadamente ao mesmo tempo, e ele corrupção (uma definição de computador para indicar que alguns dados foram corrompidos, onde tais dados podem residir na memória ou no disco ou na CPU, etc.) aconteceu no momento em que duas pessoas (ou dois threads em analogia com o computador) eles tentaram agarrar a testemunha e o conflito ocorreu. Em termos de computação, dois threads tentaram escrever um espaço de memória que regularmente só deveria ser escrito por um thread (um corredor).

As condições da corrida podem ocorrer em várias áreas, como eletrônica interna, software de computador e vida em geral. Como um exemplo, uma colisão de chamada é uma definição de telecomunicações para descrever a situação em que um canal de comunicação é apreendido em ambas as extremidades simultaneamente. Software interno de computador, uma das áreas mais proeminentes das condições de corrida, existe uma grande variedade de condições de corrida possíveis.

Como outro exemplo de condição de corrida em software de computador, imagine dois threads de computação trabalhando com um determinado espaço de memória. Um usuário acabou de enviar um formulário e o software de back-end está gravando este formulário na memória. Ao mesmo tempo, outro usuário está lendo os campos deste formulário do mesmo espaço de memória. Dependendo do que acontecer, o usuário leitor pode receber um formulário parcialmente incorreto com informações parcialmente atualizadas.

Prevenção de condições de corrida: Segurança de linha

Tem havido muita discussão sobre as condições de carreira na indústria de TI. Dependendo da linguagem de codificação que você usa, pode haver muitas ou poucas disposições para lidar com as condições de corrida. Uma definição frequentemente usada é segurança do fio ou um seguro de ameaças aplicação ou linguagem de programação [construir]. Estes termos são usados ​​para indicar se um trecho de código ou software como um todo é seguro de ameaças, Em outras palavras, escrito de forma a evitar e até mesmo evitar condições de corrida.

Se o software for considerado seguro de ameaças, é considerado livre da oportunidade das condições de corrida. Em vários casos, ‘considerado‘Thread-safe é o melhor que os desenvolvedores podem oferecer, e ainda mais quando muitos tópicos e interações são possíveis. A complexidade de muitos threads trabalhando com muitos recursos pode facilmente se transformar em uma miríade de manipulação de código e uma miríade ainda maior de possíveis condições de corrida.

Várias construções de programação podem ser usadas para evitar condições de corrida. Como um exemplo, semáforos e mutex. A complexidade de usar tais construções dependerá da linguagem de programação usada e de seu suporte nativo para conduzir o manuseio de threads.. Como um exemplo, e C ++ pode-se olhar para o std :: mutex classe para implementar um mutex (Em outras palavras Mutualmente exclusivo) trancar. Na festa, Apesar disto, não se encontra tal construção nativamente.

Dando um passo adiante, além disso, você pode considerar quais construções, funções ou mesmo executáveis ​​e bibliotecas em particular já são thread-safe, e mais tarde usar as ditas construções, funções, executáveis ​​e bibliotecas como base para a construção de uma nova construção, Função, executável, biblioteca. ou pacote de software completo.

Colocar em prática até mesmo construções básicas de manipulação de thread-safety pode ser uma questão complexa.. Como um exemplo, considere a dificuldade de implementar um semáforo no bash.

Final

Neste post, exploramos threads de computação e condições de corrida. Analisamos analogias com corridas de corrida e corridas de revezamento na vida humana para explorar algumas condições básicas de corrida que podem ocorrer nos computadores.. Para terminar, nós exploramos a segurança do tópico, as diferentes implementações de tratamento de condição de corrida em linguagens de codificação de computador e como podemos prevenir condições de corrida.

Se você gostou deste post, dê uma olhada no post Como funcionam as portas lógicas: OU, E, XOR, NEM, NAND, XNOR y NOT.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.