Мютекс - це об'єкт RTOS, призначений для забезпечення конкурентного доступу до загальних ресурсів. Мютекс є двійковий семафор з додатковими властивостями (наприклад, протоколи обходу необмеженої інверсії пріоритетів).
Мютекс може знаходиться в двох станах: заблокованому і розблокованому. Асоційованих мютекс з апаратним або програмним ресурсом додатки, можна забезпечити коректний доступ до ресурсів з декількох завдань - якщо завдання спробує отримати доступ до заблокованого ресурсу, вона буде переведена в стан очікування, але отримає управління відразу ж після того як ресурс буде розблоковано.
Часто виникає питання - а навіщо взагалі потрібно блокувати ресурси? Вся справа в принципі роботи витісняють RTOS - завдання може бути перервана (витіснена) в будь-який момент часу. Якщо в цей момент вона використовує якийсь системний ресурс (наприклад, UART), а завдання, яке витіснила поточну так само почне з ним працювати - виникне закономірне конфлікт.
З блокуванням ресурсів тісно пов'язане поняття інверсії пріоритетів:
Припустимо в системі існують два завдання з низьким (А) і високим (Б) пріоритетом. У момент часу T1 завдання (А) блокує ресурс і починає його обслуговувати. У момент часу T2 завдання (Б) витісняє фонову завдання (А) і намагається заволодіти ресурсом в момент часу T3. Але так як ресурс заблокований, завдання (Б) переводиться в очікування, а завдання (А) продовжує виконання. У момент часу Т4 завдання (А) завершує обслуговування ресурсу і розблокує його. Так як ресурс очікує завдання (Б), вона тут же починає виконання.
Часовий проміжок (T4-T3) називають обмеженою інверсією пріоритетів. У цьому проміжку спостерігається логічне невідповідність з правилами планування - завдання з більш високим пріоритетом знаходиться в очікуванні в той час як фонової завдання виконується.
Але це ще не найстрашніше. Припустимо в системі працюють три завдання: фонової (А), із середніми пріоритетом (Б) і високопріоритетних (В):
Якщо ресурс заблокований завданням (А), а він потрібен задачі (В), то спостерігається та ж ситуація - високопріоритетних завдання блокується. Але припустимо, що завдання (Б) витіснила (А), після того як (В) пішла в очікування ресурсу. Завдання (Б) нічого не знає про конфлікт, тому може виконуватися як завгодно довго на проміжку часу (T5-T4). Крім того, крім (Б) в системі можуть бути і інші завдання, з пріоритетами більше (А), але менше (Б). Тому тривалість періоду (T6-T3) в загальному випадку невизначена. Таку ситуацію називають необмеженої інверсією пріоритетів.
Обмеженою інверсії пріоритетів в загальному випадку уникнути неможливо, проте вона не так небезпечна для системи, як необмежена. Для того щоб уникнути необмеженої інверсії пріоритетів, використовуються два протоколи зміни пріоритетів завдань:
Протокол успадкування пріоритету (Priority inheritance protocol)
Протокол збільшення пріоритету (Priority ceiling protocol)
Припустимо в системі існують два завдання з низьким (А) і високим (Б) пріоритетом:
У момент T2 завдання (Б) витісняє фонову завдання (А) і потім в момент часу T3 намагається захопити заблокований (А) ресурс.
Протокол успадкування пріоритету полягає в тому, що пріоритет завдання (А) підвищується до пріоритету завдання (Б) в момент часу T3, тобто коли (Б) намагається захопити заблокований ресурс. Таким чином завдання з пріоритетом більше (А) але менше (Б) не можуть реалізувати необмежену інверсію, і завдання (Б) отримає ресурс відразу після того як (А) його розблокує.
Після того як завдання (А) розблокує ресурс, її пріоритет знижується до вихідного.
Протокол збільшення пріоритету заснований на тому факті, що на момент проектування відомі всі завдання, яким потрібен певний ресурс, а так само відомі пріоритети цих завдань. В цьому випадку ресурсу (мютексу) можна призначити певну властивість - максимальний пріоритет з усіх завдань, які можуть його заблокувати (стелю).
Припустимо в системі існують три завдання з низьким (А), середнім (Б) і високим (В) пріоритетом, які можуть заблокувати один ресурс:
У момент часу T3, коли завдання (Б) намагається захопити заблокований (А) ресурс, пріоритет (А) підвищується до пріоритету завдання (В), тобто до максимального пріоритету з усіх завдань, які можуть володіти ресурсом. Як тільки завдання (А) звільняє ресурс в момент часу T4, її пріоритет знижується до вихідного, а пріоритет завдання (Б), яка чекала ресурс підвищується до (В).
Таким чином, при використанні протоколу збільшення пріоритету, завдання, що захопила ресурс завжди має найвищий пріоритет з групи завдань, які можуть цим ресурсом володіти. Це дозволяє не тільки позбутися від необмеженої інверсії пріоритетів, але й не допустити взаємних блокувань.
Взаємне блокування - це аварійний стан системи, яке може виникати при вкладеності блокувань ресурсів. Припустимо в системі існують два завдання з низьким (А) і високим (Б) пріоритетом, які використовують два ресурси - X і Y:
У момент часу T1 завдання (А) блокує ресурс X. Потім в момент часу T2 завдання (А) витісняє більш пріоритетне завдання (Б), яка в момент часу T3 блокує ресурс Y. Якщо завдання (Б) спробує заблокувати ресурс X (T4) не звільнить ресурс Y, то вона буде переведена в стан очікування, а виконання завдання (а) буде продовжено. Якщо в момент часу T5 завдання (А) спробує заблокувати ресурс Y, що не звільнивши X, виникне стан взаємного блокування - ні одне із завдань (А) і (Б) не зможе отримати управління.
Взаємне блокування можлива тільки якщо в системі використовуються вкладений конкурентний доступ до ресурсів. Взаємного блокування можна уникнути, якщо не використовувати вкладеність, або якщо ресурс використовує протокол збільшення пріоритету.
У TNKernel реалізовані мютекси як з протоколом успадкування пріоритету, так і з протоколом збільшення пріоритету.
Протокол успадкування пріоритету більш простий і швидкий, але не дозволяє уникнути взаємного блокування. Тому для таких мютексов не рекомендується використовувати вкладений доступ. Протокол збільшення пріоритету вимагає більше тимчасових ресурсів і забезпечує відсутність взаємного блокування.
Кожен мютекс асоціюється зі структурою управління:
До складу структури мютекса входять наступні елементи:
Черга завдань, які очікують звільнення мютекса