Фьютексы
Одним из интересных решений, пытающихся объединить все самое лучшее из обоих миров, является так называемый фьютекс, или fast user space mutex, — быстрый мьютекс в пользовательском пространстве. Фьютекс относится к свойствам Linux, реализующим основную блокировку (во многом похожую на мьютекс), но избегающим выпадения в режим ядра до возникновения в этом реальной надобности.
Поскольку переключение в режим ядра и обратно обходится слишком дорого, применение такой технологии существенно повышает производительность. Фьютекс состоит из двух частей: службы ядра и пользовательской библиотеки. Служба ядра предоставляет «очередь ожидания», позволяющую ожидать снятия блокировки нескольким процессам. Они не будут запущены, пока ядро не разблокирует их явным образом. Чтобы процесс попал в очередь ожидания, требуется (довольно дорого обходящийся) системный вызов, чего следует избегать. Зато при отсутствии конкуренции фьютекс работает полностью в пользовательском пространстве. Говоря конкретнее, процессы совместно используют общую переменную блокировки, являющуюся вымышленным названием для выровненного 32-разрядного целочисленного значения, которое служит в качестве блокировки.Предположим, что исходное значение блокировки равно 1, и под этим подразумевается, что блокировка свободна. Поток захватывает блокировку, проводя атомарное «уменьшение на единицу и тестирование» (атомарные функции в Linux состоят из встроенного ассемблерного кода, заключенного в функции языка C, и определены в заголовочных файлах). Затем поток анализирует результат, выясняя, была ли блокировка свободна. Если она была в незаблокированном состоянии, все обходится благополучно и наш поток успешно захватывает блокировку. Но если блокировка удерживается другим потоком, наш поток вынужден ждать. В таком случае библиотека фьютекса не обращается к спину, а использует системный вызов для помещения потока в очередь ожидания в пространстве ядра. Есть надежда на то, что затраты на переключение в режим ядра теперь оправданны, поскольку поток все равно был бы заблокирован. Когда поток, захвативший блокировку, выполнит свою задачу, он освободит блокировку, проводя атомарное увеличение на единицу и тестирование и проверяя результат, чтобы увидеть, есть ли процессы, заблокированные на очереди ожидания в пространстве ядра. Если таковые имеются, он даст ядру понять, что оно может разблокировать один или несколько таких процессов. Если же конкуренция отсутствует, ядро вовлекаться в работу вообще не будет.
Еще по теме Фьютексы:
- Л.О. Доліненко, В.О. Доліненко, С.О. Сарновська. Цивільне право України, 2006
- ЦИВІЛЬНЕ ПРАВО УКРАЇНИ
- ПЕРЕДМОВА
- Частина І ПРОГРАМА КУРСУ «ЦИВІЛЬНЕ ПРАВО УКРАЇНИ»
- Розділ І. Загальні положення цивільного права
- Тема 1. Поняття цивільного права. Предмет та метод, система цивільного права. Функції та принципи цивільного права
- Тема 2. Цивільне законодавство України
- Тема 3. Поняття, елементи та види цивільних правовідносин
- Тема 4. Здійснення цивільних прав і виконання обов’язків
- Тема 5. Захист цивільних прав та інтересів