в чому різниця між прядильними замками та семафорами?


15

Які основні відмінності між спіновими замками та семафорами в дії?



@Gilles Я також придивився до цього, але єдиною згадкою про семафори на сторінці є Воррен, коментуючи, що "Якщо хтось хоче знати різницю між фіксацією спіна і, скажімо, семафором, це вже інше питання".
Майкл Мрозек

@Michael: гаразд, я думаю, що відповіді там стосувалися головного моменту, але ви маєте рацію, що ніхто прямо не заявив, що семафори є одним з інших видів замків.
Жил 'ТАК - перестань бути злим'

Пояснення Лінуса Торвальдса: yarchive.net/comp/linux/semaphores.html
myaut

Дублікат stackoverflow.com/questions/195853/spinlock-versus-semaphore У темі, яку я запитав, є багато хороших пояснень.
iankits

Відповіді:


13

Обидва керують обмеженим ресурсом. Спершу я опишу різницю між бінарним семафором (мютекс) та фіксацією спіна.

Замкові замки виконують зайняте очікування - тобто він продовжує працювати циклом:

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)

Гарне пояснення, я хочу лише наголосити на одному моменті. Семафор проти мутекса - це питання інтерфейсу: мютекс тримається чи ні, в той час як семафор тримається до N потоків; мютекс - особливий випадок семафорів з N = 1. Spinlock vs інший вид блокування - це питання реалізації: спінлок блокує намагання придбати замок, тоді як інші види чекають сповіщення. У контексті ядра Linux єдиний замок зі спіновою реалізацією має інтерфейс mutex.
Жил "ТАК - перестань бути злим"

У контексті ядра Linux єдиний замок зі спіновою реалізацією має інтерфейс mutex. Я розумію, що я розумію цю лінію. Чи можете ви, будь ласка, розширити це?
Сен

@Sen: Він мав на увазі, що спин блокування в Linux поводиться бінарним (він заблокований чи ні). Можливо, щоб прядильний замок поводився як семафор.
Maciej Piechotka

"Але якщо заблокуючий потік буде випущений іншим, який спробує отримати доступ до того ж ресурсу, другий просто спробує придбати ресурс, поки у нього не залишиться квант процесора.": Але проблема все ще залишається і у Mutex. Що робити, якщо завдання з більш пріоритетним завданням має доступ до ресурсу ... це просто черга? Можливо, краще анулювати обмін ресурсами між завданнями з різними пріоритетами.
Hibou57

@ Hibou57: Так, це заблоковано, оскільки стан не є послідовним, і використання ресурсу матиме "смішні" ефекти (скажімо, нитка з низьким пріоритетом була в середині додавання або видалення чогось до / із пов'язаного списку). Суть цього твердження полягала в тому, що якщо нитка заблокована, вона не планується, тому вона не споживає ресурсів під час очікування потоку на спинлок. Блокування систем у режимі реального часу (особливо важких) є різною темою, і я не маю достатніх знань, щоб відповісти на це - проте ці системи іноді застосовують пріоритетні пожертви чи інші методи.
Maciej Piechotka

2

Спінлок використовується в умовах переривання, коли спати не дозволяється. Вони опитуються в тісному циклі, нічого не роблячи, поки ресурс не буде придбаний. В основному використовується в ISR та є більш безпечним та ефективним.

Семафори можна використовувати в контексті процесу, коли спати нормально.


1

Ось мій швидкий постріл на відповідь: спина замок і двійковий семафор (який управляє ресурсом, який може використовуватися лише одна річ) майже однакові. Їх відмінність полягає в тому, що спінові блокування керують кодом, який слід запускати, а двійкові семафори управляють якимось особливим ресурсом (наприклад, час процесора, показ дисплея)

Однак звичайний семафор здатний керувати декількома потоками, що мають доступ до ресурсу, який може бути розділений між кількома, але обмежений (наприклад, пам'ять, пропускна здатність мережі)

Коротше кажучи, спін-блокування, ймовірно, продовжує запитувати семафор, чи може він використовувати ресурс. (Уявіть, що дитина повинна користуватися ванною і чекати, коли хтось закінчить.)

Джерела: Вступ до системного програмування, операційних систем та вікіпедії

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.