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?
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?
Odpowiedzi:
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ć.
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.
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.
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.