tl; dr: Ничего не происходит, когда он ждет; это просто структура данных ядра.
Без потери общности все операционные системы имеют своего рода модель, в которой единица выполнения (задача) перемещается между состояниями: Готов, Запуск, Ожидание . С этой задачей связана структура данных, в которой записываются ее состояние и регистры (среди прочего).
Когда задача переходит с Готов на Запуск , сохраненные регистры загружаются в процессор и продолжают выполнение с последнего сохраненного состояния. Первоначально для его сохраненных регистров установлены допустимые значения для запуска программы.
С Запуск до Ожидание или Готов , его регистры хранится в структуре данных задач, и эта структура помещается в список Готов или Ожидание задач.
С Ожидание в Готов , структура данных задачи удаляется из списка Ожидание и добавляется в список Готов .
Когда задача пытается получить мьютекс это недоступно, оно перемещается с Запуск (как еще можно попытаться получить мьютекс) до Ожидание . Если мьютекс был доступен, он остается Работает , и мьютекс становится недоступным.
Когда задача освобождает мьютекс, а другая задача - Ожидание этого мьютекса, задача Waiting становится Ready и получает мьютекс. Если многие задачи: Ожидание , выбирается одна, чтобы получить мьютекс и стать Готов , остальные остаются Ожидание .
Это очень абстрактное описание; Реальные системы усложняются как множеством механизмов синхронизации (почтовый ящик, очередь, семафор, канал, ...), желанием оптимизировать различные пути, так и использованием нескольких процессоров.