<<
>>

Фьютексы

С ростом параллелизма очень важное значение для производительности приобретают эффективная синхронизация и блокировка. Спин-блокировки обладают быстротой при недолгом ожидании, но если ожидание затянется, они будут тратить циклы центрального процессора впустую.
При высокой конкуренции более эффективным решением будет блокировать процесс и позволить ядру разблокировать его, только когда блокировка будет свободна. К сожалению, возникает обратная проблема: это хорошо работает в условиях высокой конкуренции, но если конкуренция с самого начала невысока, постоянные переключения в режим ядра обходятся слишком дорого. Хуже того, предсказать количество конкурентных блокировок может быть весьма нелегко.

Одним из интересных решений, пытающихся объединить все самое лучшее из обоих миров, является так называемый фьютекс, или fast user space mutex, — быстрый мьютекс в пользовательском пространстве. Фьютекс относится к свойствам Linux, реализующим основную блокировку (во многом похожую на мьютекс), но избегающим выпадения в режим ядра до возникновения в этом реальной надобности.

Поскольку переключение в режим ядра и обратно обходится слишком дорого, применение такой технологии существенно повышает производительность. Фьютекс состоит из двух частей: службы ядра и пользовательской библиотеки. Служба ядра предоставляет «очередь ожидания», позволяющую ожидать снятия блокировки нескольким процессам. Они не будут запущены, пока ядро не разблокирует их явным образом. Чтобы процесс попал в очередь ожидания, требуется (довольно дорого обходящийся) системный вызов, чего следует избегать. Зато при отсутствии конкуренции фьютекс работает полностью в пользовательском пространстве. Говоря конкретнее, процессы совместно используют общую переменную блокировки, являющуюся вымышленным названием для выровненного 32-разрядного целочисленного значения, которое служит в качестве блокировки.

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

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

Еще по теме Фьютексы:

  1. Л.О. Доліненко, В.О. Доліненко, С.О. Сарновська. Цивільне право України, 2006
  2. ЦИВІЛЬНЕ ПРАВО УКРАЇНИ
  3. ПЕРЕДМОВА
  4. Частина І ПРОГРАМА КУРСУ «ЦИВІЛЬНЕ ПРАВО УКРАЇНИ»
  5. Розділ І. Загальні положення цивільного права
  6. Тема 1. Поняття цивільного права. Предмет та метод, система цивільного права. Функції та принципи цивільного права
  7. Тема 2. Цивільне законодавство України
  8. Тема 3. Поняття, елементи та види цивільних правовідносин
  9. Тема 4. Здійснення цивільних прав і виконання обов’язків
  10. Тема 5. Захист цивільних прав та інтересів