Найкраща практика - це не опитуватись… але чи все-таки опитування не відбувається всередині, коли потік викликає wait ()?


13

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

Але чи все-таки опитування не відбувається всередині на нижчому рівні? Тобто, якщо ми змусимо потік wait () чи не ядро, яке виконує опитування, все-таки перевірити, коли інший потік закінчений, щоб потім він міг сповістити перший потік?

Я припускаю, що я щось пропав тут, може хтось просвітити мене?

Відповіді:


28

Операційна система забезпечує певні примітиви для такого типу міжпроцесового зв'язку, що не потребує опитування.

Якщо процес A чекає на mutex M, ОС знає, що A не може бути запущений, і відкладає його у відро процесів, які очікують, що щось станеться. Коли процес, що утримує M, звільняє його, ОС переглядає список процесів, які його очікують. Перший процес у списку, можливо A, видаляється з вікна простою та ставиться у чергу запуску . Наступного разу, коли A отримає відрізок часу, повернення, яке він викликав, повернеться, і програма продовжується.


таким чином, це опитування, але на рівні ОС?
tgkprog

7
Ні @tgkprog, це не опитування, оскільки процес очікування не планується запускати, поки ОС або інший процес не випустить мютекс. Процес опитування продовжуватиме конкурувати з плануванням процесора, щоб перевірити, чи варто його перестати чекати. Процес опитування такого типу може спалити значну частину часу процесора, поки він чекає.
joshp

я мав на увазі процес ОС опитування статусу мютексу. хоча я впевнений, що його оптимізовано і краще за все, що ми могли зробити. ймовірно, працює як частина планувальника.
tgkprog

4
@tgkprog: ОС не приділяє мало уваги тому, що відбувається з mutex, поки процес, що утримує його, не звільнить його або не припинить. Будь-яка з цих подій призведе до того, що ОС передасть блокування mutex будь-якому процесу, який є першим у списку очікування, і позначить цей процес як запущений. Жодного опитування не бере участь, а лише відповідь на подію. Все, що говорив Джошп, включено в посилання. :-)
Blrfl

2
@csss: Досить. Процеси можуть закінчуватися як добровільно (наприклад, виклик _exit(2)в системах POSIX-y), так і мимовільно (наприклад, помилка подібно до нуля породжує переривання або викликає щось інше kill(2)). У будь-якому випадку контроль явно передається ОС, яка знає, який процес запущений або має бути вбитий. Завдання по закінченню процесу включає звільнення його ресурсів, включені мутекси. Якщо мутекс був утримуваний уже мертвим процесом, ОС випустить його. Якщо процес був у списку очікування mutex, він буде видалений.
Blrfl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.