Які основні відмінності між спіновими замками та семафорами в дії?
Які основні відмінності між спіновими замками та семафорами в дії?
Відповіді:
Обидва керують обмеженим ресурсом. Спершу я опишу різницю між бінарним семафором (мютекс) та фіксацією спіна.
Замкові замки виконують зайняте очікування - тобто він продовжує працювати циклом:
while (try_acquire_resource ());
...
release();
Він виконує дуже легке блокування / розблокування, але якщо заблокуючий потік буде випущений іншим, який спробує отримати доступ до тієї ж ресурсу, другий просто спробує придбати ресурс, поки у нього не вичерпаються квантові процесора.
З іншого боку, мютекс поводиться більше як:
if (!try_lock()) {
add_to_waiting_queue ();
wait();
}
...
process *p = get_next_process_from_waiting_queue ();
p->wakeUp ();
Отже, якщо нитка спробує придбати заблокований ресурс, вона буде призупинена, поки не стане для неї доступною. Блокування / розблокування набагато важче, але очікування "вільне" та "справедливе".
Semaphore - це замок, який дозволено використовувати декілька разів (відомий з ініціалізації) - наприклад, 3 потоки дозволяють одночасно утримувати ресурс, але не більше. Він використовується, наприклад, у проблемі виробника / споживача або загалом у чергах:
P(resources_sem)
resource = resources.pop()
...
resources.push(resources)
V(resources_sem)
Спінлок використовується в умовах переривання, коли спати не дозволяється. Вони опитуються в тісному циклі, нічого не роблячи, поки ресурс не буде придбаний. В основному використовується в ISR та є більш безпечним та ефективним.
Семафори можна використовувати в контексті процесу, коли спати нормально.
Ось мій швидкий постріл на відповідь: спина замок і двійковий семафор (який управляє ресурсом, який може використовуватися лише одна річ) майже однакові. Їх відмінність полягає в тому, що спінові блокування керують кодом, який слід запускати, а двійкові семафори управляють якимось особливим ресурсом (наприклад, час процесора, показ дисплея)
Однак звичайний семафор здатний керувати декількома потоками, що мають доступ до ресурсу, який може бути розділений між кількома, але обмежений (наприклад, пам'ять, пропускна здатність мережі)
Коротше кажучи, спін-блокування, ймовірно, продовжує запитувати семафор, чи може він використовувати ресурс. (Уявіть, що дитина повинна користуватися ванною і чекати, коли хтось закінчить.)
Джерела: Вступ до системного програмування, операційних систем та вікіпедії