Jump to content

Сериализация токенов

В информатике DragonFly сериализация токенов представляет собой концепцию управления параллелизмом, возникшую в результате продолжающейся разработки BSD . По словам Мэтью Диллона , они больше всего похожи на SPL , за исключением того, что токен работает на нескольких процессорах , тогда как SPL работают только в домене одного процессора.

Сериализация токенов позволяет программистам писать многопроцессорно -безопасный код, при этом ни себе, ни подсистемам нижнего уровня не нужно знать о каждом отдельном объекте, который также может содержать один и тот же токен.

Сравнение с взаимным исключением (мьютексом)

[ редактировать ]

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

  1. Временное разделение: планировщик пользовательского пространства (США) пытается гарантировать, что все потоки имеют равные шансы на выполнение, поэтому он запускает каждый поток в течение короткого периода времени (временной интервал), а затем переключается на другой поток.
  2. Параллельное выполнение: на многопроцессорных компьютерах поток может выполняться одновременно с другим потоком на другом процессоре.
  3. Вытеснение: поток может вытеснять поток с более низким приоритетом, например аппаратное прерывание или потоки облегченного ядра .
  4. Добровольная блокировка: поток может заснуть, если ему нужно чего-то ждать, ему нечего делать или он вызывает функцию, которая блокируется. Даже вызов для получения блокировки может быть заблокирован.

В следующей таблице приведены свойства токенов и мьютексов.

Сериализация токенов против мьютексов
  Сериализация токенов Мьютексы
Временное разделение Работает Работает
Параллельное выполнение Работает Работает
Упреждение Работает Работает
Добровольная блокировка Не удалось Работает
Избегает тупиковой ситуации Да Нет
Избегает инверсии приоритетов Да Нет

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

... Если вы посмотрите на FreeBSD-5, вы заметите, что FreeBSD-5 довольно часто передает удерживаемые мьютексы в стек подпрограмм, чтобы позволить какому-то очень глубокому процедурному уровню временно освободить мьютекс для переключения, блокировки или обработки. с тупиком. Из-за этого во FreeBSD-5 происходит сильное загрязнение кода (когда некоторым процедурам для правильной работы необходимо знать мьютексы, удерживаемые другими несвязанными процедурами).

Мэтью Диллон


Следующий псевдокод и пояснения иллюстрируют работу сериализации токенов.

Пример псевдокода с использованием токенов сериализации
Нить А Нить Б Действие
lwkt_gettoken(T1);
iter = list1.head;
...
lwkt_gettoken(T1); // blocks
// waiting for token T1
A получает токен T1 и использует его для получения синхронизированного доступа к списку list1, который используется обоими потоками.
lwkt_gettoken(T2); // blocks
// waiting for token T1
Вызов lwkt_gettoken(T2) со стороны A является блокирующей функцией, поэтому A переходит в режим сна и временно теряет свои токены. Он будет разбужен, когда планировщик увидит, что доступны и T1, и T2.
// waiting for T1 and T2
list1.head = list1.head.next;
lwkt_releasetoken(T1);
B получает T1 и модифицирует список1. Обратите внимание, что «iter» в A по-прежнему указывает на старую главу списка.
// get the new version of the head:
iter = list1.head; 
// make new list:
while (iter != null) {
    list2.tail = iter;
    iter = iter.next;
}
lwkt_releasetoken(T1);
lwkt_releasetoken(T2);
  Планировщик видит, что доступны и T1, и T2, поэтому он пробуждает поток A. Поскольку A был закодирован правильно, он обновляет свой итератор, добавляя в него новый заголовок списка1 и выполняет над ним некоторые неблокирующие операции. Обратите внимание, что для А было бы лучше просто попросить оба жетона в начале.

Уровень техники в ядре Дарвина

[ редактировать ]

Mac OS X использует Ядро Darwin аналогичную технику (называемую воронкой ) для сериализации доступа к BSD- части ядра.

См. также

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 32a7ff2b2233957d38bb36567d2d15fe__1679840580
URL1:https://arc.ask3.ru/arc/aa/32/fe/32a7ff2b2233957d38bb36567d2d15fe.html
Заголовок, (Title) документа по адресу, URL1:
Serializing tokens - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)