Что лучше, ожидание в цикле или переключение?

До сих пор мы допускали, что центральный процессор, которому требуется заблокированный мьютекс, просто ждет, пока тот не освободится, постоянно или периодически опрашивая его состояние или присоединяясь к списку ожидающих процессоров.
Иногда другого выбора, кроме простого ожидания, для запрашивающего блокировку центрального процессора просто нет. Предположим, к примеру, что какой-либо центральный процессор простаивает и ему нужен доступ к общему списку готовых к работе процессов, чтобы выбрать оттуда процесс и запустить его. Если список готовых к работе процессов заблокирован, центральный процессор не может просто решить приостановить то, чем он занимается, и запустить другой процесс, потому что для этого требуется прочитать список процессов, готовых к работе. Центральный процессор вынужден ждать, пока этот список не освободится.

Но в других случаях центральному процессору есть из чего выбирать. Например, если какому-нибудь потоку на центральном процессоре потребуется доступ к буферному кэшу файловой системы, который в данный момент заблокирован, центральный процессор может решить не ждать, а переключиться на другой поток. Вопрос о том, ждать или переключаться на другой поток, являлся предметом многочисленных исследований, некоторые из них будут рассмотрены в дальнейшем. Обратите внимание на то, что на однопроцессорной системе этот вопрос не возникает, потому что опрос в цикле не имеет смысла, если нет другого центрального процессора, освобождающего блокировку. Если поток пытается получить блокировку и ему это не удается, он всегда блокируется, чтобы дать возможность для работы и освобождения блокировки ее владельцу.

Если предположить, что можно применить как циклический опрос, так и переключение на другой поток, то все «за» и «против» будут следующими. На циклический опрос впустую тратится время центрального процессора. Постоянное тестирование переменной блокировки не является продуктивной работой. Но и на переключение также тратится впустую время центрального процессора, поскольку нужно сохранить состояние текущего потока, получить блокировку списка готовых к работе процессов, выбрать поток, загрузить его состояние и запустить этот поток. Кроме того, кэш центрального процессора будет заполнен ненужными блоками, поэтому с запуском нового потока на заполнение кэша отсутствующими в нем блоками будет затрачено много ресурсов. Также вероятны возникновения ошибок TLB. В конечном итоге должно произойти обратное переключение на исходный поток, опять же связанное с отсутствием в кэше нужных блоков. Время на осуществление этих двух переключений контекста плюс время, необходимое на обновление кэша, тратится впустую.

Если известно, что мьютексы обычно удерживаются, скажем, в течение 50 мкс, а переключение с одного потока на другой занимает 1 мс и еще 1 мс требуется на обратное переключение, то лучше просто вести циклический опрос, ожидая освобождения мьютекса. Но если в среднем мьютекс удерживается в течение 10 мс, то стоит потратиться на два переключения контекста.

Проблема в том, что продолжительность пребывания процессов в критических областях может варьироваться в широких пределах, поэтому возникает вопрос: какой из двух подходов лучше?

Можно остановиться на циклическом опросе, а можно и на переключении. Но есть еще и третий вариант: в каждом случае, связанном с блокируемым взаимным исключением, принимать отдельное решение. К тому моменту, когда следует принять решение, еще неизвестно, что лучше — циклический опрос или переключение, но есть возможность отследить всю работу каждой конкретной системы и проанализировать ее чуть позже в автономном режиме. Затем в ретроспективе можно будет сказать, какое решение было лучшим и сколько времени было потрачено впустую в лучшем случае. Этот ретроспективный алгоритм станет отправной точкой для оценки подходящих алгоритмов.

Эта проблема была изучена исследователями (Ousterhout, 1982). В большинстве работ использовалась модель, в которой поток, не сумевший захватить мьютекс, некоторое время выполнял циклический опрос. По истечении заданного времени он переключался. В некоторых случаях заданное время было фиксированным, как правило, это были известные потери на переключение на другой поток с последующим обратным переключением. В других случаях время задавалось динамически в зависимости от предшествующих наблюдений за востребованным мьютексом.

Лучших результатов удавалось достичь, когда система отслеживала время нескольких последних циклических ожиданий и предполагала, что каждое конкретное ожидание будет по времени аналогично предыдущим. Например, опять предполагая, что на переключение контекста уйдет 1 мс, поток будет проводить циклический опрос не более 2 мс, но понаблюдает, сколько времени действительно уйдет на циклический опрос. Если он не сможет получить блокировку и увидит, что в ходе предыдущих трех запусков на ожидание в среднем уходило 200 мкс, значит, перед тем как переключиться, ему следует провести в состоянии циклического опроса 2 мс. Но если он видит, что при каждой предыдущей попытке он провел в состоянии циклического опроса все 2 мс, он должен переключиться немедленно и вообще не проводить циклический опрос.

Некоторые современные процессоры, включая x86, предлагают специальные инструкции, повышающие эффективность ожидания в понятиях энергосбережения. Например, инструкции MONITOR/MWAIT в процессоре x86 позволяют программе блокироваться до тех пор, пока какой-нибудь другой процесс не изменит данные в заранее определенной области памяти. В частности, инструкция MONITOR определяет диапазон адресов, который должен отслеживаться на предмет записи. Затем инструкция MWAIT блокирует поток до тех пор, пока кто-нибудь не произведет запись в эту область. Фактически поток продолжает работать, но без напрасной траты множества вычислительных циклов.

8.1.4.

<< | >>
Источник: Э. ТАНЕНБАУМ Х. БОС. СОВРЕМЕННЫЕ ОПЕРАЦИОННЫЕ СИСТЕМ Ы 4-е ИЗДАНИЕ. 2015

Еще по теме Что лучше, ожидание в цикле или переключение?:

  1. Что лучше: открытый или закрытый вопрос?
  2. Другие люди не знают, что лучше для Вас
  3. Люди всегда делают то, что, как им кажется, лучше всего для них.
  4. Научиться медитации можно по книжке, хотя лучше заниматься в группе или с инструктором.
  5. Хотел как лучше, а вышло... Что может получиться, когда внушение работает на все сто
  6. Что есть что, или Я расскажу вам о психологах
  7. Малыш чувствует себя или способным, или бессильным приобрести то, что ему нужно.
  8. Мы совершаем ошибку, полагая” что несчастны потому, что не получили или не имеем того, чего нам хочется.
  9. СИГНАЛЫ, ПРЕДУПРЕЖДАЮЩИЕ МУЖЧИНУ О ТОМ, ЧТО ЖЕНЩИНА, ВОЗМОЖНО ОПУСКАЕТСЯ В КОЛОДЕЦ ИЛИ ЧТО ЕЙ ОСОБЕННО НУЖНА ЕГО ЛЮБОВЬ
  10. Отказываясь от того, что вам нужно, вы приобретаете склонность хотеть то, в чем для вас нет необходимости, или то, что не можете получить.
  11. Г лава 10 Кто или что вас останавливает?
  12. Уличающий вопрос необходим, когда собеседник искажает или скрывает информацию, когда возникает противоречие между его словами и ранее установленными вами фактами. Его надо использовать с осторожностью, лучше не в прямой форме и ближе к концу разговора, чтобы не оборвать его ход.
  13. Что сначала: программа или анкета?
  14. Что дороже: честь или совесть
  15. Что у нас в меню, или Наша Трапеза
  16. 4. «Зло» или наказание за то, что может быть «неправильным»
  17. О чувстве юмора БИТОЧКИ, ИЛИ "ЧТО НАША ЖИЗНЬ?"
  18. Что это значит: поднять, или расширить, своё сознание?
  19. ЧТО ТАКОЕ ИСКРЕННЯЯ ОТДАЧА, ИЛИ ОБЛАДАЕТЕ ЛИ ВЫ УРАВНИВАЮЩИМ МЕНТАЛИТЕТОМ?
  20. Г л а в а 7 ИДЕАЛИЗАЦИИ, или Почему всегда пропадает то, что мы больше всего любим?