Что происходит с процессом и / или потоком, пока он ожидает мьютекс? - PullRequest
0 голосов
/ 09 февраля 2020

Когда процесс и / или поток ожидает мьютекс, в каком состоянии находится процесс и / или поток? Это в ожидании или готовности или в каком-то другом состоянии? Я пытался найти ответ в Интернете, но не смог найти четкого и окончательного ответа, может быть, его нет или, возможно, есть, чтобы узнать, что я публикую этот вопрос здесь.

1 Ответ

1 голос
/ 10 февраля 2020

tl; dr: Ничего не происходит, когда он ждет; это просто структура данных ядра.

Без потери общности все операционные системы имеют своего рода модель, в которой единица выполнения (задача) перемещается между состояниями: Готов, Запуск, Ожидание . С этой задачей связана структура данных, в которой записываются ее состояние и регистры (среди прочего).

Когда задача переходит с Готов на Запуск , сохраненные регистры загружаются в процессор и продолжают выполнение с последнего сохраненного состояния. Первоначально для его сохраненных регистров установлены допустимые значения для запуска программы.

С Запуск до Ожидание или Готов , его регистры хранится в структуре данных задач, и эта структура помещается в список Готов или Ожидание задач.

С Ожидание в Готов , структура данных задачи удаляется из списка Ожидание и добавляется в список Готов .

Когда задача пытается получить мьютекс это недоступно, оно перемещается с Запуск (как еще можно попытаться получить мьютекс) до Ожидание . Если мьютекс был доступен, он остается Работает , и мьютекс становится недоступным.

Когда задача освобождает мьютекс, а другая задача - Ожидание этого мьютекса, задача Waiting становится Ready и получает мьютекс. Если многие задачи: Ожидание , выбирается одна, чтобы получить мьютекс и стать Готов , остальные остаются Ожидание .

Это очень абстрактное описание; Реальные системы усложняются как множеством механизмов синхронизации (почтовый ящик, очередь, семафор, канал, ...), желанием оптимизировать различные пути, так и использованием нескольких процессоров.

...