Фьютекс - Futex

В вычисление, а фьютекс (сокращение от "быстрое пользовательское пространство мьютекс ") это ядро системный вызов это программисты можно использовать для реализации основных запирание или как строительный блок для абстракций блокировки более высокого уровня, таких как семафоры и POSIX мьютексы или переменные состояния.

Фьютекс состоит из ядерное пространство очередь ожидания который прикреплен к атомный целое число в пространство пользователя. Множественный процессы или потоки работать с целым числом полностью в пользовательском пространстве (используя атомарные операции чтобы не мешать друг другу) и прибегать только к относительно дорогим системные вызовы для запроса операций в очереди ожидания (например, для пробуждения ожидающих процессов или для помещения текущего процесса в очередь ожидания). Правильно запрограммированная блокировка на основе фьютекса не будет использовать системные вызовы, кроме случаев, когда блокировка является состязательной; поскольку для большинства операций не требуется арбитраж между процессами, в большинстве случаев этого не произойдет.

История

На Linux, Хубертус Франке (IBM Исследовательский центр Томаса Дж. Уотсона ), Мэтью Кирквуд, Инго Мольнар (Красная Шапка ) и Расти Рассел (Центр технологий IBM Linux ) возник механизм фьютекса. Фьютексы впервые появились в версии 2.5.7 серии разработки ядра Linux; семантика стабилизировалась в версии 2.5.40, а фьютексы были частью Основная линия ядра Linux начиная с выпуска в декабре 2003 г. стабильной серии ядер 2.6.x.

В 2002 году обсуждалось предложение сделать фьютексы доступными через файловую систему, создав специальный узел в / dev или / proc. Однако, Линус Торвальдс категорически против этой идеи и отклонил любые связанные патчи.[1]

Фьютексы были реализованы в Microsoft Windows начиная с Windows 8 или Windows Server 2012 под именем WaitOnAddress.[2]

В 2013 году Microsoft запатентовала фьютексы, и патент был получен в 2014 году.[3]

В мае 2014 г. CVE system объявила об уязвимости, обнаруженной в подсистеме futex ядра Linux, которая допускает атаки типа «отказ в обслуживании» или локальное повышение привилегий.[4][5]

В мае 2015 г. Ядро Linux представил ошибку взаимоблокировки через Фиксация b0c29f79ecea что привело к зависанию пользовательских приложений. Ошибка затронула многие корпоративные дистрибутивы Linux, включая ядра 3.x и 4.x, а также Red Hat Enterprise Linux версий 5, 6 и 7, SUSE Linux 12 и Amazon Linux.[6]

Фьютексы реализованы в OpenBSD с 2016 года.[7]

Механизм фьютекса - одна из основных концепций ядра Циркона.[8] в Google с Операционная система Fuchsia как минимум с апреля 2018 года.[9]

Операции

У фьютексов есть две основные операции: ПОДОЖДИТЕ и Проснуться. Третья операция называется ЗАПРОС доступен и функционирует как более общий Проснуться операция, которая может перемещать потоки между очередями ожидания. [10]

  • ПОДОЖДИТЕ (адрес; значение)
Если значение хранится по адресу адрес является вал, переводит текущий поток в спящий режим.
  • ПРОБУДИТЕСЬ (адрес, число)
Просыпается число количество потоков, ожидающих по адресу адрес.
  • CMP_REQUEUE (старый_аддр, новый_аддр, число_wake, число_двиг, значение)
Если значение, хранящееся по адресу old_addr является вал, будит num_wake потоки, ожидающие адреса old_addr, и ставит в очередь num_move потоки, ожидающие адреса old_addr теперь ждать по адресу new_addr. Это можно использовать, чтобы избежать проблема громового стада по пробуждении.[11][12]

Смотрите также

использованная литература

  1. ^ Торвальдс, Линус. «Асинхронный интерфейс Futex».
  2. ^ "Функция WaitOnAddress". Получено 2019-11-01.
  3. ^ «US8782674B2 Ожидание интерфейса синхронизации адресов». Получено 2019-11-01.
  4. ^ CVE-2014-3153
  5. ^ "[SECURITY] [DSA 2949-1] обновление безопасности Linux". Lists.debian.org. 2014-06-05. Получено 2014-06-08.
  6. ^ "Ошибка Linux futex_wait () ..." 2015-05-13. Получено 2018-03-24.
  7. ^ Мазурек, Михал. "'Фьютексы для OpenBSD '- MARC ". marc.info. Получено 30 апреля 2017.
  8. ^ "Концепции ядра циркона". fuchsia.dev. Получено 20 октября 2019.
  9. ^ "zx_futex_wait". fuchsia.dev. Получено 20 октября 2019.
  10. ^ Фьютексы коварны Ульрих Дреппер (Red Hat, v1.6, 2011)
  11. ^ Справочная страница Linux futex (2), раздел FUTEX_CMP_REQUEUE
  12. ^ Zircon zx_futex_requeue документация

внешние ссылки