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

История

править

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

Разработаны Уберту Франке (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 декабря 2005). Дата обращения: 16 июня 2019. Архивировано из оригинала 16 июня 2019 года.
  2. Rémi Denis-Courmont. Other uses of futex (англ.). Remlab. Remlab.net (21 сентября 2016). Дата обращения: 17 июня 2019. Архивировано 17 июня 2019 года.
  3. Rémi Denis-Courmont. Condition variable with futex (англ.). Remlab. Remlab.net (21 сентября 2016). Дата обращения: 16 июня 2019. Архивировано 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. Дата обращения: 13 января 2010. Архивировано 24 декабря 2013 года.

Литература

править
  • Уберту Франке, Расти Рассел, Мэттью Кирквуд, «Шум вокруг фьютексов: Быстрая блокировка на пользовательском уровне в 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.

Ссылки

править