Русская Википедия:Фьютекс

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Фьютекс (Шаблон:Lang-en, сокращение от Шаблон:Lang-en) — низкоуровневый легковесный примитив синхронизации[1], на основе которого реализуются другие примитивы и механизмы, такие как мьютексы, семафоры и условные переменные[2]. Также фьютексы могут участвовать и в организации более сложных механизмов синхронизации, таких как барьеры и блокировки чтения-записи, позволяя одновременно пробуждать группу задач. Изначально был представлен в ранних версиях ядра Linux 2.5[1]. Позднее практически идентичный примитив был реализован и в ядре Windows[3].

История

Впервые появились в ядре Linux версии 2.5.7, стабилизация семантики закончилась в версии 2.5.40Шаблон:Нет АИ.

Разработаны Уберту Франке (Hubertus Franke) (из исследовательского центра IBM им. Томаса Ватсона), сотрудниками технологического центра IBM по Linux Мэттью Кирквудом (Matthew Kirkwood) и Расти Расселом, а также разработчиком в компании Red Hat Инго Молнаром (Ingo Molnar).

Общие сведения

Фьютекс представляет собой выровненное целое в общей памяти (для нескольких процессоров) в пользовательском пространстве и очередь ожидания в пространстве ядраШаблон:Sfn. Для организации фьютекса требуется, по крайней мере, одна страница памяти, отображённая в адресное пространство каждого из участвующих во фьютексе процессов. Системные вызовы предназначены только для потоковых библиотек пользовательского пространства и только в виде команд ассемблераШаблон:Sfn.

Разделяемое целое может быть увеличено или уменьшено на единицу за одну ассемблерную инструкцию. Процессы, «завязанные» на этот фьютекс, ждут, когда это значение станет положительным. Все операции с фьютексами практически полностью проводятся в пользовательском пространстве (при отсутствии соперничества[4]), соответствующие функции ядра задействуются лишь в ограниченном наборе спорных случаев. Это позволяет повысить эффективность использования синхронизирующих примитивов, поскольку большинство операций не использует арбитраж, а значит, и избежать использования относительно дорогостоящих системных вызовов (Шаблон:Lang-en).

Сходным образом оптимизированы объекты CRITICAL_SECTION в Win32 API, а также FAST_MUTEX в ядре Windows[5].

Примечания

Шаблон:Примечания

Литература

Ссылки