Лучшая практика - не опрашивать ... но не происходит ли внутренний опрос в любом случае, когда поток вызывает wait ()?

13

Скажем, у нас есть какой-то поток, который хочет проверить, когда другой поток завершил свою задачу. Я прочитал, что мы должны вызвать функцию типа wait (), которая заставит этот поток ждать, пока он не получит уведомление о завершении другого потока. И это хорошо, потому что это означает, что мы не проводим дорогой опрос.

Но не происходит ли опрос внутри страны на более низком уровне? Т.е. если мы сделаем поток wait (), разве ядро ​​не выполняет опрос в любом случае, чтобы проверить, когда другой поток завершил работу, чтобы он мог затем уведомить первый поток?

Я полагаю, что я что-то упускаю здесь, кто-то может просветить меня?

CSSS
источник

Ответы:

28

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

Если процесс A ожидает мьютекс M, ОС знает, что A не может быть запущен, и откладывает его в кучу процессов, ожидающих, что что-то произойдет. Когда процесс, содержащий M, освобождает его, ОС просматривает список ожидающих его процессов. Первый процесс в списке, может быть, A, удаляется из пустой корзины и помещается в очередь выполнения . В следующий раз, когда A получит временной интервал, функция wait (), которую он вызвал, вернется, и программа продолжит работу.

Blrfl
источник
таким образом, это опрос, но на уровне ОС?
tgkprog
7
Нет @tgkprog, это не опрос, потому что не планируется запуск процесса ожидания, пока ОС или другой процесс не освободит мьютекс. Процесс опроса будет продолжать конкурировать в планировании ЦП, чтобы проверить, следует ли прекратить ожидание. Процесс опроса такого рода может сжечь значительную часть процессорного времени, пока он ожидает.
Joshp
я имел в виду процесс ОС опроса статуса мьютекса. хотя я уверен, что он оптимизирован и лучше, чем все, что мы могли бы сделать. вероятно, работает как часть планировщика.
tgkprog
4
@tgkprog: ОС не уделяет немного внимания тому, что происходит с мьютексом, пока процесс, удерживающий его, не освободит его или не завершит работу. Любое из этих событий приведет к тому, что ОС передаст блокировку мьютекса любому процессу, который первым находится в списке ожидания, и пометит этот процесс как работоспособный. Нет никакого участия в опросе, просто ответ на событие. Все, что сказал Джошп, включено посредством ссылки. :-)
Blrfl
2
@csss: довольно много Процессы могут завершаться добровольно (например, вызов _exit(2)в системах POSIX-y) или невольно (например, ошибка, такая как деление на ноль, генерирует прерывание или что-то еще вызывает kill(2)). В любом случае управление явно возвращается ОС, которая знает, какой процесс запущен или должен быть уничтожен. Работа по завершению процесса включает в себя освобождение его ресурсов, включая мьютексы. Если мьютекс удерживался мертвым процессом, ОС освободит его. Если процесс был в списке ожидания мьютекса, он будет удален.
Blrfl