Я новий інженер-електрик, тож потерпіть мене. Я чую деяких інших інженерів, з якими я працюю, розмовляючи про стан перегонів, який існує в одному з наших контурів.
Що це означає?
Я новий інженер-електрик, тож потерпіть мене. Я чую деяких інших інженерів, з якими я працюю, розмовляючи про стан перегонів, який існує в одному з наших контурів.
Що це означає?
Відповіді:
Це означає, що дуже просто дві речі одночасно "змагаються" за результатом.
Прикладом може слугувати схема зі шпилькою Reset та Set, якщо ви запускаєте скидання, вихід стає 0. Якщо ви запускаєте набір, вихід стає 1. Якщо ви спершу встановите тригер, а потім скиньте дуже, дуже швидко після нього, скиньте буде видно, тому вихід 0.
Але якщо вони обидва спрацьовують точно в один і той же час, що відбувається?
Якщо дизайнер схеми звернув увагу, повинна бути відповідь, якщо це важливо для функції. Якщо немає певної відповіді на це питання, схема має гоночну умову, коли сигнал із набору та скидання «гонять» один одного, щоб побачити, який виграє, щоб визначити вихід.
Шлях із найменшим запізненням зазвичай виграє, але тоді ви можете бачити умову гонки як точний тригер, в якому саме такий затримок шляху запускається саме стільки, скільки швидше.
Багато схем, включаючи логічні побудови блоків всередині ІМС, мають певні умови перегонів, але зазвичай вони такі, що коли ви використовуєте схему так, як це призначено, ви не помітите. Тому часто, коли інженери кілька разів кажуть "стан гонки" вголос, вони насправді означають, що це теж може статися при звичайному використанні, що буде проблемою, оскільки в умовах гонки нормальну роботу не можна передбачити.
У програмному забезпеченні також використовується цей термін, але часто для позначення проблем із тимчасовим відключенням або блокування. Але це схожий принцип. Часто, коли у вас є два процеси в комп'ютері, які працюють незалежно, але використовуючи одну і ту ж пам’ять, ви захищаєте цю пам'ять від того, щоб писати один, а інший використовує її. Якщо ви не називаєте це можливою умовою перегонів: Один процес може бути зчитуванням значення, яке саме перебуває в процесі оновлення, або обидва можуть одночасно записувати його, і тоді ви не знаєте, що буде трапляються.
fopen()
, записати в нього дані, fclose()
it, а потім chmod()
- захистити. Це коротке вікно між fopen()
і chmod()
відкриває можливу умову гонки, коли режим файлів за замовчуванням може дозволити небажаному сторонній людині працювати з файлом у спосіб, відхилений після chmod()
виклику. Рішення полягає в тому, щоб створити файл open()
замість цього, що дозволяє встановити режим як частину операції зі створення файлу.
Термін "умова гонки" означає, що (1) два або більше сигналів можуть надходити в будь-якому порядку, довільно близьких один до одного, і (2) не можна аналітично показати, що існує по суті нульова ймовірність будь-якої можливої комбінації прибуття часи, що створюють проблему.
З точки зору одинарного фліп-флопу, введення якого може змінитись у будь-який час щодо годинника, майже одночасні переходи на годиннику та введення даних можуть спричинити перегони. Однак, з точки зору загальної поведінки ланцюга, вони не створюватимуть перегонних умов, якщо вони можуть виникнути лише тоді, коли жодна ланцюг нижньої течії не піклуватиметься про те, що має засувка, і жодна ланцюг нижньої течії не почне дбати про те, що тримається засувка до моменту приходу тактового імпульсу, який не міг бути десь біля переходів на вхід даних.
Крім того, оскільки часто неможливо повністю виключити всю можливість проблемних вхідних хронометрів, багато аналіз перегонових умов скажуть, що якщо вихід одного регістра подається в інший, який контролюється тим же годинником, другий реєстр завжди буде фіксуватися "чистий" високий або "чистий" низький, навіть якщо входи в перший регістр спричинили його захоплення вхідного рівня, який був прямо на порозі перемикання. Теоретично, перший фіксатор міг би захопити рівень, який був достатньо вище або нижче його точного порогу перемикання, щоб рівень виходу перемикався точно по мірі надходження наступного тактового імпульсу.
Як наслідок, якщо б, наприклад, взяти вхід і передати його в послідовність з трьох фліп-флоп, і мати ланцюг, який виводить кожен раз, коли другий флоп був високим, але третій був низьким, то будь-який піднімається край, який виникає на введення даних, якому передує повний тактовий період, який триває низький час, а за ним - повний тактовий період часу, по суті гарантується, що призведе до того, що вихід схеми буде високим рівно на один тактовий період.
імітувати цю схему - Схематично створено за допомогою CircuitLab
У цій схемі сигнал з дещо нерегулярною синхронізацією нормалізується на тактовий час трьома способами таким чином, щоб генерувати вихід, який є високим за один тактовий цикл після кожного піднімаючого краю. Перша спроба нормалізувати сигнал генерує вихід, який виглядає неприємно і має очевидний стан гонки, якщо вхід і такт змінюються одночасно. Другий підхід набагато кращий, але все ж має перегонний стан (який тренажер не може запустити), якщо час синхронізації та даних змушує перший реєстр захопити проміжне значення. Третій підхід представляє загальну практику і, як правило, вважається безпечним, оскільки навіть якщо перший реєстр не зможе зафіксувати чистий максимум чи чистий низький рівень, дуже малоймовірно, що вихід з першого реєстру матиме саме правильну поведінку, щоб змусити другий регістр не чітко схопитися. Якщо дані змінюються дуже близько до годинника, вони можуть бути схоплені на поточному циклі, або не будуть схоплені до наступного, але якщо будь-яка ситуація була б прийнятною, немає гоночної умови.
Якщо коротко, це означає, що на результат процесу буде впливати послідовність надходження двох входів, і ця послідовність невизначена (не можна гарантувати).