Jump to content

Синхронизация (информатика)

(Перенаправлено с примитива синхронизации )

В информатике установления синхронизация — это задача координации нескольких процессов для объединения или связи в определенный момент с целью достижения соглашения или выполнения определенной последовательности действий.

Мотивация

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

Потребность в синхронизации возникает не только в многопроцессорных системах, но и в любых параллельных процессах; даже в однопроцессорных системах. Ниже упомянуты некоторые основные потребности в синхронизации:

Разветвления и объединения : когда задание достигает точки разветвления, оно разбивается на N подзаданий, которые затем обслуживаются n задачами. После обслуживания каждое подзадание ожидает завершения обработки всех остальных подзаданий. Затем они снова присоединяются и покидают систему. Таким образом, параллельное программирование требует синхронизации, поскольку все параллельные процессы ожидают выполнения нескольких других процессов.

Производитель-потребитель. В отношениях производитель-потребитель процесс-потребитель зависит от процесса-производителя до тех пор, пока не будут получены необходимые данные.

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

Требования

[ редактировать ]
Рисунок 1 : Три процесса одновременно обращаются к общему ресурсу ( критическому разделу ).

Синхронизация потоков определяется как механизм, который гарантирует, что два или более параллельных процесса или потока не будут одновременно выполнять определенный сегмент программы, известный как критический раздел . Доступ процессов к критической секции контролируется с помощью методов синхронизации. Когда один поток начинает выполнение критического раздела (сериализованного сегмента программы), другой поток должен дождаться завершения первого потока. Если правильные методы синхронизации [1] не применяются, это может вызвать состояние гонки , когда значения переменных могут быть непредсказуемыми и варьироваться в зависимости от времени переключения контекста процессов или потоков.

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

Рисунок 2. Процесс, обращающийся к общему ресурсу, если он доступен, на основе некоторой техники синхронизации.

Еще одно требование синхронизации, которое необходимо учитывать, — это порядок, в котором должны выполняться определенные процессы или потоки. Например, нельзя сесть в самолет до покупки билета. Аналогично, нельзя проверять электронную почту до проверки соответствующих учетных данных (например, имени пользователя и пароля). Точно так же банкомат не будет предоставлять никаких услуг, пока не получит правильный PIN-код.

Помимо взаимного исключения, синхронизация также касается следующего:

  • взаимоблокировка , которая возникает, когда многие процессы ожидают общего ресурса (критического раздела), который удерживается каким-либо другим процессом. В этом случае процессы просто продолжают ждать и больше не выполняются;
  • голодание , которое возникает, когда процесс ожидает входа в критическую секцию, но другие процессы монополизируют критическую секцию, и первый процесс вынужден ждать бесконечно;
  • инверсия приоритета , которая возникает, когда процесс с высоким приоритетом находится в критической секции, и он прерывается процессом со средним приоритетом. Такое нарушение правил приоритета может произойти при определенных обстоятельствах и может привести к серьезным последствиям в системах реального времени;
  • ожидание занятости , которое возникает, когда процесс часто опрашивает, имеет ли он доступ к критическому разделу. Этот частый опрос отнимает время обработки у других процессов.

Минимизация

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

Одной из задач разработки экзафлопсных алгоритмов является минимизация или уменьшение синхронизации. Синхронизация занимает больше времени, чем вычисления, особенно в распределенных вычислениях. Уменьшение синхронизации привлекало внимание ученых-компьютерщиков на протяжении десятилетий. Принимая во внимание, что в последнее время это становится все более серьезной проблемой, поскольку разрыв между улучшением вычислений и задержкой увеличивается. Эксперименты показали, что (глобальная) связь благодаря синхронизации на распределенных компьютерах занимает доминирующую долю в разреженном итеративном решателе. [2] Этой проблеме уделяется все больше внимания после появления новой эталонной метрики — высокопроизводительного сопряженного градиента (HPCG). [3] для составления рейтинга 500 лучших суперкомпьютеров.

Классические задачи

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

Ниже приведены некоторые классические проблемы синхронизации:

Эти задачи используются для проверки почти каждой вновь предложенной схемы или примитива синхронизации.

Аппаратная синхронизация

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

Многие системы обеспечивают аппаратную поддержку кода критической секции .

Однопроцессорная или однопроцессорная система может отключить прерывания , выполняя текущий код без вытеснения , что очень неэффективно для многопроцессорных систем. [4] «Ключевая способность, необходимая нам для реализации синхронизации в мультипроцессоре, — это набор аппаратных примитивов с возможностью атомарного чтения и изменения ячейки памяти. Без такой возможности стоимость создания базовых примитивов синхронизации будет слишком высокой и будет возрастать по мере того, как количество процессоров увеличивается. Существует ряд альтернативных формулировок базовых аппаратных примитивов, каждая из которых обеспечивает возможность атомарного чтения и изменения местоположения, а также некоторый способ определить, выполнялись ли эти аппаратные примитивы атомарно. являются основными строительными блоками, которые используются для создания широкого спектра операций синхронизации на уровне пользователя, включая такие вещи, как блокировки и барьеры . В общем, архитекторы не ожидают, что пользователи будут использовать базовые аппаратные примитивы, а вместо этого ожидают, что примитивы будут использовать. использоваться системными программистами для создания библиотеки синхронизации, а этот процесс часто бывает сложным и непростым». [5] Многие современные аппаратные средства предоставляют такие атомарные инструкции, двумя распространенными примерами являются: test-and-set , которая работает с одним словом памяти, и Compare-and-swap , которая меняет местами содержимое двух слов памяти.

Поддержка языков программирования

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

В Java одним из способов предотвращения помех потоков и ошибок согласованности памяти является добавление к сигнатуре метода ключевого слова Synchronized ; в этом случае для обеспечения синхронизации используется блокировка объявляющего объекта. Второй способ — поместить блок кода в раздел Synchronized(someObject){...} , который обеспечивает более детальное управление. Это заставляет любой поток получить блокировку someObject , прежде чем он сможет выполнить содержащийся блок. Блокировка автоматически снимается, когда поток, получивший блокировку, покидает этот блок или переходит в состояние ожидания внутри блока. Любые обновления переменных, выполненные потоком в синхронизированном блоке, становятся видимыми для других потоков, когда они аналогичным образом получают блокировку и выполняют блок. В любой реализации любой объект может использоваться для обеспечения блокировки, поскольку все объекты Java имеют встроенную блокировку или блокировку монитора, связанную с ними при создании экземпляра. [6]

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

также .NET Framework использует примитивы синхронизации. [7] «Синхронизация спроектирована так, чтобы быть совместной, требуя, чтобы каждый поток следовал механизму синхронизации перед доступом к защищенным ресурсам для получения согласованных результатов. Блокировка, сигнализация, упрощенные типы синхронизации, ожидания ожидания и взаимосвязанные операции — это механизмы, связанные с синхронизацией в .NET». [8]

целые специализированные языки написаны Многие языки программирования поддерживают синхронизацию, и для разработки встроенных приложений , где строго детерминированная синхронизация имеет первостепенное значение.

Выполнение

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

Другой эффективный способ реализации синхронизации — использование спин-блокировок. Прежде чем получить доступ к любому общему ресурсу или фрагменту кода, каждый процессор проверяет флаг. Если флаг сброшен, процессор устанавливает его и продолжает выполнение потока. Но если флаг установлен (заблокирован), потоки будут продолжать вращаться в цикле и проверять, установлен ли флаг или нет. Но спин-блокировки эффективны только в том случае, если флаг сброшен для младших циклов, в противном случае это может привести к проблемам с производительностью, поскольку на ожидание тратится много процессорных циклов. [9]

Барьеры просты в реализации и обеспечивают хорошую оперативность. Они основаны на концепции реализации циклов ожидания для обеспечения синхронизации. Предположим, что три потока выполняются одновременно, начиная с барьера 1. По истечении времени t поток 1 достигает барьера 2, но ему все равно приходится ждать, пока потоки 2 и 3 достигнут барьера 2, поскольку у него нет правильных данных. Как только все потоки достигают барьера 2, все они начинаются заново. По истечении времени t поток 1 достигает барьера 3, но ему придется снова ждать потоков 2 и 3 и правильных данных.

Таким образом, при барьерной синхронизации нескольких потоков всегда будет несколько потоков, которые в конечном итоге будут ждать других потоков, как в приведенном выше примере поток 1 продолжает ожидать потоки 2 и 3. Это приводит к серьезному снижению производительности процесса. [10]

Функция ожидания барьерной синхронизации для i й поток можно представить как:

(Wбарьер)i=f ((Tбарьер)i, (Rthread)i)

Где Wbarrier — время ожидания потока, Tbarrier — количество прибывших потоков, а Rthread — скорость прибытия потоков. [11]

Эксперименты показывают, что 34% общего времени выполнения тратится на ожидание других, более медленных потоков. [10]

Семафоры

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

Семафоры — это механизмы сигнализации, которые могут позволить одному или нескольким потокам/процессорам получить доступ к разделу. Семафор имеет флаг, с которым связано определенное фиксированное значение, и каждый раз, когда поток желает получить доступ к разделу, он уменьшает этот флаг. Аналогично, когда поток покидает раздел, флаг увеличивается. Если флаг равен нулю, поток не может получить доступ к разделу и блокируется, если решит подождать.

Некоторые семафоры допускают только один поток или процесс в разделе кода. Такие семафоры называются бинарными семафорами и очень похожи на мьютексы. Здесь, если значение семафора равно 1, потоку разрешен доступ, а если значение равно 0, доступ запрещен. [12]

Математические основы

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

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

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

Java и Ada имеют только монопольные блокировки, поскольку они основаны на потоках и полагаются на инструкции процессора сравнения и замены .

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

Ниже приведены некоторые примеры синхронизации для разных платформ. [13]

Windows обеспечивает:

Linux обеспечивает:

Включение и отключение вытеснения ядра заменило спин-блокировки в однопроцессорных системах. До версии ядра 2.6 Linux отключал прерывания для реализации коротких критических участков. Начиная с версии 2.6 и более поздних версий Linux является полностью вытесняющим.

В Солярисе

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

Солярис обеспечивает:

Pthreads — это независимый от платформы API , который обеспечивает:

  • мьютексы;
  • переменные условия;
  • блокировки чтения-записи;
  • спинлоки;
  • барьеры .

См. также

[ редактировать ]
  1. ^ Грамоли, В. (2015). Больше, чем вы когда-либо хотели знать о синхронизации: Synchrobench, измеряющий влияние синхронизации на параллельные алгоритмы (PDF) . Материалы 20-го симпозиума ACM SIGPLAN по принципам и практике параллельного программирования. АКМ. стр. 1–10.
  2. ^ Шэнсинь, Чжу, Тунсян Гу и Синпин Лю (2014). «Минимизация синхронизации в разреженных итерационных решателях для распределенных суперкомпьютеров» . Компьютеры и математика с приложениями . 67 (1): 199–209. дои : 10.1016/j.camwa.2013.11.008 .
  3. ^ «Бенчмарк HPCG» .
  4. ^ Зильбершац, Авраам; Ганье, Грег; Гэлвин, Питер Баер (11 июля 2008 г.). «Глава 6: Синхронизация процессов». Концепции операционной системы (Восьмое изд.). Джон Уайли и сыновья. ISBN  978-0-470-12872-5 .
  5. ^ Хеннесси, Джон Л.; Паттерсон, Дэвид А. (30 сентября 2011 г.). «Глава 5: Параллелизм на уровне потоков». Компьютерная архитектура: количественный подход (Пятое изд.). Морган Кауфманн. ISBN  978-0-123-83872-8 .
  6. ^ «Внутренние блокировки и синхронизация» . Учебники по Java . Оракул . Проверено 10 ноября 2023 г.
  7. ^ «Обзор примитивов синхронизации» . Microsoft Learn . Майкрософт . Проверено 10 ноября 2023 г.
  8. ^ Роуз, Маргарет. «Синхронизация» . Техопедия . Проверено 10 ноября 2023 г.
  9. ^ Масса, Энтони (2003). Разработка встроенного программного обеспечения с помощью ECos . Pearson Education Inc. ISBN  0-13-035473-2 .
  10. ^ Jump up to: а б Мэн, Чен, Пан, Яо, Ву, Цзинлэй, Тяньчжоу, Пин, Цзюнь Минхуэй (2014). «Спекулятивный механизм барьерной синхронизации». Международная конференция IEEE по высокопроизводительным вычислениям и коммуникациям (HPCC) 2014 г., 6-й Международный симпозиум IEEE по безопасности и защите киберпространства (CSS) 2014 г. и 11-я Международная конференция IEEE по встраиваемому программному обеспечению и системам (ICES) 2014 г. {{cite journal}}: CS1 maint: несколько имен: список авторов ( ссылка )
  11. ^ Рахман, Мохаммед Махмудур (2012). «Синхронизация процессов в многопроцессорном и многоядерном процессоре». 2012 Международная конференция по информатике, электронике и зрению (ICIEV) . стр. 554–559. дои : 10.1109/ICIEV.2012.6317471 . ISBN  978-1-4673-1154-0 . S2CID   8134329 .
  12. ^ Ли, Яо, Цин, Кэролайн (2003). Концепции реального времени для встраиваемых систем . Книги КМП. ISBN  978-1578201242 . {{cite book}}: CS1 maint: несколько имен: список авторов ( ссылка )
  13. ^ Зильбершац, Авраам; Ганье, Грег; Гэлвин, Питер Баер (7 декабря 2012 г.). «Глава 5: Синхронизация процессов». Концепции операционной системы (Девятое изд.). Джон Уайли и сыновья. ISBN  978-1-118-06333-0 .
  14. ^ «Что такое RCU по сути? [LWN.net]» . lwn.net .
  15. ^ «Адаптивные датчики блокировки» . Документы Оракл .
  16. ^ Мауро, Джим. «Турникеты и приоритетное наследование – SunWorld – август 1999 г.» . sunsite.uakom.sk .
  • Шнайдер, Фред Б. (1997). О параллельном программировании . Springer-Verlag New York, Inc. ISBN  978-0-387-94942-0 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 70316c51cc5a748eff271bd1f4ba1554__1719900480
URL1:https://arc.ask3.ru/arc/aa/70/54/70316c51cc5a748eff271bd1f4ba1554.html
Заголовок, (Title) документа по адресу, URL1:
Synchronization (computer science) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)