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

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

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

СОДЕРЖАНИЕ
  • 1 Необходимость синхронизации
  • 2 Синхронизация потоков или процессов
  • 3 Минимизация синхронизации
    • 3.1 Классические проблемы синхронизации
    • 3.2 Аппаратная синхронизация
    • 3.3 Стратегии синхронизации в языках программирования
    • 3,4 Реализация синхронизации
      • 3.4.1 Spinlock
      • 3.4.2 Барьеры
      • 3.4.3 Семафоры
    • 3.5 Математические основы
    • 3,6 Примеры синхронизации
      • 3.6.1 Синхронизация в Windows
      • 3.6.2 Синхронизация в Linux
      • 3.6.3 Синхронизация в Solaris
      • 3.6.4 Синхронизация потоков
  • 4 Синхронизация данных
    • 4.1 Проблемы синхронизации данных
      • 4.1.1 Сложность форматов данных
      • 4.1.2 Актуальность
      • 4.1.3 Безопасность данных
      • 4.1.4 Качество данных
      • 4.1.5 Представление
  • 5 Смотрите также
  • 6 использованная литература
  • 7 внешние ссылки
Необходимость синхронизации

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

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

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

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

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

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

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

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

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

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

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

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

Классические проблемы синхронизации

Вот некоторые классические проблемы синхронизации:

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

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

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

Однопроцессорная или однопроцессорная система может отключать прерывания, выполняя текущий код без прерывания, что очень неэффективно в многопроцессорных системах. «Ключевая способность, которая нам требуется для реализации синхронизации в многопроцессоре, - это набор аппаратных примитивов с возможностью атомарного чтения и изменения области памяти. Без такой возможности стоимость создания базовых примитивов синхронизации будет слишком высока и будет увеличиваться по мере того, как количество процессоров увеличивается. Существует ряд альтернативных формулировок основных аппаратных примитивов, каждый из которых обеспечивает возможность атомарного чтения и изменения местоположения, вместе с некоторым способом определить, выполнялись ли чтение и запись атомарно. Эти аппаратные примитивы являются основными строительными блоками, которые используются для создания широкого спектра операций синхронизации на уровне пользователя, включая такие вещи, как блокировки и барьеры. В общем, архитекторы не ожидают, что пользователи будут использовать базовые аппаратные примитивы, но вместо этого ожидают, что примитивы будут могут использоваться системными программистами для создания библиотеки синхронизации, а этот процесс часто бывает сложным и запутанным ». Многие современные аппаратные средства предоставляют специальные атомарные аппаратные инструкции либо путем проверки и установки слова памяти, либо путем сравнения и замены содержимого двух слов памяти.

Стратегии синхронизации в языках программирования

В Java, чтобы предотвратить вмешательство потоков и ошибки согласованности памяти, блоки кода помещаются в синхронизированные секции (lock_object). Это заставляет любой поток получить указанный объект блокировки, прежде чем он сможет выполнить блок. Блокировка автоматически снимается, когда поток, который получил блокировку и затем выполняет блок, покидает блок или входит в состояние ожидания внутри блока. Любые обновления переменных, сделанные потоком в синхронизированном блоке, становятся видимыми для других потоков, когда они аналогичным образом получают блокировку и выполняют блок.

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

Любой объект может использоваться в качестве замка / монитора в Java. Объявляемый объект является объектом блокировки, когда весь метод помечен как synchronized.

В .NET Framework есть примитивы синхронизации. «Синхронизация разработана так, чтобы быть кооперативной, требуя, чтобы каждый поток или процесс следовал механизму синхронизации перед доступом к защищенным ресурсам (критический раздел) для получения согласованных результатов». В.NET блокировка, сигнализация, упрощенные типы синхронизации, спин-ожидание и операции блокировки - это лишь некоторые из механизмов, связанных с синхронизацией.

Реализация синхронизации

Spinlock

Основная статья: Spinlock

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

Барьеры

Основная статья: Барьер (информатика)

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

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

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

(Wbarrier) i = f ((Tbarrier) i, (Rthread) i)

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

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

Семафоры

Основная статья: Семафор (программирование)

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

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

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

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

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

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

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

Примеры синхронизации

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

Синхронизация в Windows

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

Синхронизация в Linux

Linux предоставляет:

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

Синхронизация в Solaris

Solaris предоставляет:

  • семафоры ;
  • переменные состояния ;
  • адаптивные мьютексы, двоичные семафоры, которые реализуются по-разному в зависимости от условий;
  • читатель-писатель замки:
  • турникеты, очередь потоков, ожидающих получения блокировки.

Синхронизация потоков

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

  • мьютексы;
  • переменные состояния;
  • читательско-писательские замки;
  • спин-блокировки;
  • барьеры.
Синхронизация данных
Основная статья: Синхронизация данных Рисунок 3: Изменения как от сервера, так и от клиента (ов) синхронизируются.

Совершенно другая (но взаимосвязанная) концепция - это синхронизация данных. Это относится к необходимости поддерживать согласованность нескольких копий набора данных друг с другом или поддерживать целостность данных, рис. 3. Например, репликация базы данных используется для синхронизации нескольких копий данных с серверами баз данных, которые хранят данные в разных местах..

Примеры включают:

Проблемы синхронизации данных

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

  • сложность форматов данных;
  • оперативность;
  • безопасность данных;
  • Качество данных;
  • представление.

Сложность форматов данных

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

Актуальность

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

Безопасность данных

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

Качество данных

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

Представление

Процесс синхронизации данных состоит из пяти различных этапов:

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

Смотрите также
использованная литература
  • Шнайдер, Фред Б. (1997). О параллельном программировании. ISBN компании Springer-Verlag New York, Inc.   978-0-387-94942-0.
внешние ссылки
Последняя правка сделана 2023-04-13 03:48:04
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте