вівторок, 4 березня 2014 р.

ИТ терминология

Очень часто в компьютерной терминологии встречаются слова, которые в рунете не имеют устоявшихся значений. Да что там значений, упоминаний еле найдёшь. В данной статье сделана попытка собрать такие термины и описать их с объяснением, где именно и для чего они употребляются в ИТ.

Thundering herd.

Thundering herd problem - проблема громоподобного стада. Представьте огромное количество процессов, ждущих события. Если событие наступает, их всех разбудят и начнётся борьба за ресурсы, хотя требуется только один процесс, который займётся дальнейшей обработкой наступившего события. Остальные процессы снова будут спать.

Вот такое периодическое дикое пробуждение всех сразу ради одного единственного называется Thundering herd problem.

Для устранения данного эффекта, различные программные продукты используют различные техники.

К примеру, почтовый сервер Postfix может обслуживать тысячи запросов, но в редких случаях нужно, чтобы Postfix открыл одномоментно тысячи SMTP сессий. Менеджер очередей отправляет небольшое количество сообщений и постепенно наращивает параллелизм (concurrency).

Ещё пример. При написании кода драйвера для linux возможна ситуация, когда, во время сна, несколько процессов ждут одного и того же события. При вызове wake_up() все эти процессы будут пытаться продолжить выполнение. Предположим, что ожидаемое этими процессами событие состоит в получении некоего атомарного куска данных. Если все процессы проснутся при наступлении нужного им события и первый получит доступ, то он сделает блокировку для эксклюзивной обработки события, а остальные процессы просто проснутся, проверят доступность данных и вернутся в спящее состояние, так как первый успевший поставил блокировку. По этим причинам, во время разработки ядра серии 2.3 была добавлена концепция эксклюзивного сна (exclusive sleep). Если процессы спят в таком эксклюзивном режиме, то они сообщают ядру о необходимости будить только один из них.

Упрощённо говоря, когда программист управляет чем-то множественным типа потоков (аналогия со стадом животных) с помощью семафора (как вариант), то он бу́дит всё стадо-потоков ради обработки чего-то единственного (типа входящего соединения клиента). Данную проблему решают написанием своего планировщика (scheduler), которые возьмёт на себя роль решателя - кому из пула спящих поручать выполнение того или иного задания.



Lock Convoy.

Lock Convoy - блокировка конвоя или очередь на блокировку. Типичная проблема производительности, возникающая в многопотоковых приложениях при использовании блокировок. Когда много потоков с одинаковым приоритетом пытаются получить доступ к защищённому блокировкой ресурсу, их попытки часто заканчиваются неудачей, но потоки не собираются самостоятельно засыпать в ожидании, а пытаются и пытаются вновь. Эти последующие попытки увеличивают количество переключений контекста (context switches) и ухудшают общую производительность, за счёт неправильно используемых квантов времени, выдаваемых приложению и его потокам.

Lock Convoy часто возникает когда управляющие параллельностью примитивы, такие как мьютекс или критические секции, пытаются использовать для организации последовательного доступа к общему ресурсу, типа memory heap или пул потоков.

Общее решение для избавления от Lock Convoy состоит в том, чтобы использовать по возможности неблокирующие алгоритмы (lock-free algorithms), применять изменение приоритета для ожидающих потоков или усыпление их до наступления события. Стараться защищать мьютексами (или его аналогами) минимально возможные участки кода, требующие атомарности.


Пока всё!

Дополнительные материалы:
Освоение Qt. Многопоточное программирование.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments