Фьютекс

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

История[править | править код]

Впервые появились в ядре Linux версии 2.5.7, стабилизация семантики закончилась в версии 2.5.40[источник не указан 130 дней].

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

Общие сведения[править | править код]

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

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

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

Примечания[править | править код]

  1. 1 2 Ulrich Drepper. Futexes Are Tricky (англ.) (PDF). Red Hat, Inc. (11 December 2005).
  2. Rémi Denis-Courmont. Other uses of futex (англ.). Remlab. Remlab.net (21 September 2016). Дата обращения 17 июня 2019.
  3. Rémi Denis-Courmont. Condition variable with futex (англ.). Remlab. Remlab.net (21 September 2016). Дата обращения 16 июня 2019.
  4. Oshana, 2015, 8.12 Stay Out of the Kernel If at all Possible.
  5. Scott, 2013.
  6. Doug Abbott. Pthreads Implementations // Linux for Embedded and Real-time Applications, 3rd Edition. — Newnes, 2012. — 296 с. — ISBN 978-0-12-391433-0.
  7. Break Free of Code Deadlocks in Critical Sections Under Windows

Литература[править | править код]

  • Уберту Франке, Расти Рассел, Мэттью Кирквуд, «Шум вокруг фьютексов: Быстрая блокировка на пользовательском уровне в Linux», Симпозиум по Linux 2002 года, Оттава, [1]  (англ.)
  • Karim Yaghmour, Jon Masters, Gilad Ben-Yossef. Building Embedded Linux Systems. — "O'Reilly Media, Inc.", 2008. — P. 400. — ISBN 978-0-596-55505-4.
  • Robert Oshana. Multicore Software Development Techniques. — Newnes, 2015. — 236 p. — ISBN 978-0-12-801037-2.
  • Michael L. Scott. Shared-Memory Synchronization. — Morgan & Claypool Publishers, 2013. — 221 с. — ISBN 978-1-60845-957-5.

Ссылки[править | править код]