Co oznaczają warunki wyścigu?

10

Jestem nowym inżynierem elektrykiem, więc proszę o wyrozumiałość. Słyszę, jak niektórzy inni inżynierowie, z którymi pracuję, mówią o stanie wyścigu w jednym z naszych obwodów.

Co to znaczy?

Stihl Alighve
źródło
Jeśli chcesz spojrzeć na konkretny przykład, „De-Glitching RAM Writes” i dwa następne artykuły zawierają długą dyskusję na temat błędu, który, o ile wiem, został wywołany przez warunki wyścigu.
davidcary

Odpowiedzi:

16

Oznacza to po prostu, że dwie rzeczy jednocześnie „ścigają się” o wynik.

Przykładem jest obwód z resetem i pinem ustawiania, jeśli wyzwolisz reset, wyjście wyniesie 0. Jeśli wyzwolisz zestaw, wyjście wyniesie 1. Jeśli najpierw wyzwolisz zestaw, a następnie zresetujesz bardzo, bardzo szybko po nim, zresetuj będzie widoczny, więc wynik wynosi 0.

Ale jeśli oba zostaną uruchomione dokładnie w tym samym czasie, co się stanie?

Jeśli projektant obwodu zwrócił uwagę, powinna istnieć odpowiedź, jeśli jest to ważne dla funkcji. Jeśli nie ma pewnej odpowiedzi na to pytanie, obwód ma warunek wyścigu, w którym sygnał z zestawu i reset „ścigają się” wzajemnie, aby zobaczyć, który z nich wygrywa, aby określić wynik.

Ścieżka z najmniejszym opóźnieniem zwykle wygrywa, ale wtedy można zobaczyć warunki wyścigu jako dokładny wyzwalacz, w którym najbardziej opóźniona ścieżka jest wyzwalana dokładnie tyle, ile przed szybszym.

Wiele obwodów, w tym logiczne elementy konstrukcyjne w układach scalonych, mają określone warunki wyścigu, ale zazwyczaj są one takie, że podczas korzystania z obwodu w zamierzony sposób nie zauważysz. Tak często, gdy inżynierowie mówią głośno „warunek wyścigu” kilka razy, w rzeczywistości oznaczają, że może się to zdarzyć podczas normalnego użytkowania, co byłoby problemem, ponieważ w warunkach wyścigowych nie można przewidzieć normalnej pracy.

W oprogramowaniu termin ten jest również używany, ale często w celu wskazania problemów z czasem lub blokadą. Jest to jednak podobna zasada. Często, gdy masz dwa procesy na komputerze działającym niezależnie, ale używając tej samej pamięci, zabezpieczasz tę pamięć przed zapisem przez jeden, podczas gdy drugi z niej korzysta. Jeśli nie nazywają tego możliwym warunkiem wyścigu: jeden proces może odczytywać wartość, która właśnie jest aktualizowana, lub oba mogą zapisywać do niej w tym samym czasie, a wtedy nie wiesz, co będzie zdarzyć.

Asmyldof
źródło
2
Jako uzupełnienie tej dobrej odpowiedzi chciałbym zwrócić uwagę, że sprzęt może zachowywać się bardzo źle w takich sytuacjach. Rzeczywisty sprzęt nigdy nie przełącza się natychmiast od 0 do 1. Zawsze musi wzrastać między nimi. Większość logiki zakłada, że ​​minęło już tyle czasu od takiego przejścia, że ​​transjenty ustąpiły albo „naprawdę blisko 0”, albo „naprawdę blisko 1”. Jeśli czas jest ... niefortunny, może być bliższy 0,5. Wiele obwodów staje się „metastabilnych” w tym stanie, co oznacza, że ​​przejście ich może zająć nieokreślony czas, destabilizując cały obwód
Cort Ammon
1
Nawet jeśli twój obwód jest zaprojektowany do obsługi przypadków, w których Set i Reset są aktywowane jednocześnie, nie możesz niezawodnie aktywować ich jednocześnie, więc nie będziesz wiedział, który z nich zostanie aktywowany jako pierwszy.
user253751
Operacje nieatomowe są lepszym przykładem warunków rasowych w oprogramowaniu. Program może utworzyć nowy plik za pomocą C fopen(), zapisać do niego dane fclose(), potem chmod()je zabezpieczyć. To krótkie okno pomiędzy fopen()i chmod()otwiera możliwy stan wyścigu, w którym domyślny tryb pliku może pozwolić niechcianemu outsiderowi na pracę z plikiem w sposób, którego nie można odebrać po chmod()wywołaniu. Rozwiązaniem jest open()zamiast tego utworzenie pliku , co pozwala ustawić tryb jako część operacji tworzenia pliku.
Warren Young,
6

Termin „warunek wyścigu” implikuje, że (1) dwa lub więcej sygnałów może przybyć w dowolnej kolejności, dowolnie blisko siebie, oraz (2) nie jest możliwe analityczne wykazanie, że istnieje zasadniczo zerowe prawdopodobieństwo dowolnej możliwej kombinacji nadejścia razy stanowi problem.

Z punktu widzenia pojedynczego przerzutnika, którego dane wejściowe mogą ulec zmianie w dowolnym momencie w odniesieniu do zegara, prawie jednoczesne przejścia na zegarze i dane wejściowe mogą stanowić warunek wyścigu. Z punktu widzenia ogólnego zachowania obwodu nie stanowiłyby jednak warunków wyścigu, gdyby mogły wystąpić tylko w momentach, w których żadna cyrkulacja w dole nie miałaby znaczenia dla tego, co utrzymywała zatrzask, a żaden dalszy obwód nie zacząłby dbać o to, co utrzymywała zatrzask aż do nadejścia impulsu zegarowego, który nie może być w pobliżu żadnych przejść na wejściu danych.

Ponadto, ponieważ często nie jest możliwe absolutne całkowite wyeliminowanie wszystkich możliwości problematycznych taktowań wejściowych, wiele analiz warunków wyścigu powie, że jeśli wyjście jednego rejestru zostanie wprowadzone do drugiego, który jest kontrolowany przez ten sam zegar, drugi rejestr zawsze się zatrzaśnie „czysty” wysoki lub „czysty” niski, nawet jeśli wejścia do pierwszego rejestru spowodowały, że przechwycił on poziom wejściowy, który był dokładnie na progu przełączania. Teoretycznie możliwe byłoby, aby pierwszy zatrzask przechwycił poziom, który był wystarczająco wysoki powyżej lub poniżej jego dokładnego progu przełączania, aby poziom wyjściowy przełączał się dokładnie po nadejściu następnego impulsu zegarowego.

W konsekwencji, jeśli np. Weźmiesz sygnał wejściowy i przekażesz go w sekwencji trzech przerzutników, i będziesz mieć obwód, który generuje wysoką wartość, ilekroć drugi flop był wysoki, ale trzeci był niski, wówczas każda rosnąca krawędź występująca na dane wejściowe, które poprzedzone są niskim czasem pełnego okresu zegarowego, a następnie pełnym okresem zegarowym wysokiego czasu, byłyby zasadniczo zagwarantowane, aby wyjściowa wartość obwodu była wysoka przez dokładnie jeden okres zegarowy.

schematyczny

symulacja tego obwodu - Schemat utworzony przy użyciu CircuitLab

Na tym schemacie sygnał z nieco nieregularnym taktowaniem jest normalizowany do zegara na trzy sposoby w taki sposób, aby generować wysoką wartość wyjściową dla jednego cyklu zegarowego po każdym rosnącym zboczu. Pierwsza próba znormalizowania sygnału generuje wyjście, które jest nieprzyjemnie wyglądające i ma oczywisty warunek wyścigu, jeśli wejście i zegar zmieniają się jednocześnie. Drugie podejście jest znacznie lepsze, ale nadal ma warunek wyścigu (którego symulator nie może uruchomić), jeśli taktowanie zegara i danych powoduje, że pierwszy rejestr przechwytuje wartość pośrednią. Trzecie podejście stanowi powszechną praktykę i ogólnie byłoby uważane za bezpieczne, ponieważ nawet jeśli pierwszy rejestr nie uchwyci czystego wysokiego lub czystego niskiego poziomu, jest bardzo mało prawdopodobne, aby dane wyjściowe z pierwszego rejestru miały dokładnie takie zachowanie, aby drugi rejestr nie przechwycił się w sposób czysty. Jeśli dane zmienią się bardzo blisko zegara, mogą zostać przechwycone w bieżącym cyklu lub nie zostać przechwycone do następnego, ale jeśli którakolwiek sytuacja byłaby do przyjęcia, nie ma warunków wyścigu.

supercat
źródło
Powiedziałeś: „... efekt, który wygląda paskudnie”. Czy to inny sposób powiedzenia „stan metastabilny”?
Solomon Slow
@jameslarge: Symulator nie obsługuje stanów metastabilnych. Pierwsze wyjście opisuję jako brzydkie, ponieważ nie ma minimalnej szerokości impulsu, a drugie wyjście jako ryzykowne z powodu możliwości stanów metastabilnych.
supercat
2

W skrócie, oznacza to, że na wynik procesu wpłynie sekwencja przybycia dwóch danych wejściowych, a ta sekwencja jest nieokreślona (nie można tego zagwarantować).

JRobert
źródło