Введение
Понятие в информатике, относящееся к процессам или данным В информатике синхронизация - это задача координации нескольких процессов, чтобы присоединиться или пожимать руки в определенной точке, чтобы достичь соглашения или привергнуться определенной последовательности действий.
In computer science, synchronization is the task of coordinating multiple of processes to join up or handshake at a certain point, in order to reach an agreement or commit to a certain sequence of action.
Мотивация
Необходимость синхронизации возникает не только в многопроцессорных системах, но и для любых одновременных процессов, даже в системах с одним процессором. Ниже приведены некоторые из основных потребностей в синхронизации: Форки и соединения: когда задача достигает точки разветвления, она разделяется на N подзадач, которые затем обслуживаются n задачами. После обслуживания, каждая подзадача ждет, пока все остальные подзадачи не будут обработаны. Затем они снова объединяются и покидают систему. Таким образом, параллельное программирование требует синхронизации, поскольку все параллельные процессы ждут, пока произойдет несколько других процессов. Производитель-потребитель: В отношениях производителя-потребителя процесс потребления зависит от процесса производства до тех пор, пока не будут получены необходимые данные. Использование ресурсов исключительно: когда несколько процессов зависят от ресурса и им необходимо получить к нему доступ одновременно, операционная система должна гарантировать, что только один процессор получает к нему доступ в определенный момент времени. Это уменьшает совпадение.
Forks and Joins: When a job arrives at a fork point, it is split into N sub jobs which are then serviced by n tasks. After being serviced, each sub job waits until all other sub jobs are done processing. Then, they are joined again and leave the system. Thus, parallel programming requires synchronization as all the parallel processes wait for several other processes to occur. Producer Consumer: In a producer consumer relationship, the consumer process is dependent on the producer process until the necessary data has been produced. Exclusive use resources: When multiple processes are dependent on a resource and they need to access it at the same time, the operating system needs to ensure that only one processor accesses it at a given point in time. This reduces concurrency.
Минимизация
Одна из проблем для разработки экзамасштабного алгоритма - минимизировать или уменьшить синхронизацию. Синхронизация занимает больше времени, чем вычисления, особенно в распределенных вычислениях. Сокращение синхронизации привлекало внимание ученых-компьютеров на протяжении десятилетий. В то время как в последнее время это становится все более значимой проблемой, поскольку разрыв между улучшением вычислительной техники и задержкой увеличивается. Эксперименты показали, что (глобальные) коммуникации из-за синхронизации на распределенных компьютерах занимают доминирующую долю в разрешающем процессе с ограниченной итерацией. Эта проблема получает все больше внимания после появления нового эталонного показателя, высокопроизводительного конъюгированного градиента (HPCG), для ранжирования 500 лучших суперкомпьютеров.
Синхронизация оборудования
Многие системы обеспечивают аппаратную поддержку критического секционного кода. Однопроцессорная или однопроцессорная система может отключить прерывания, выполняя текущий код без предварительного запуска, что очень неэффективно в многопроцессорных системах. "Ключевая способность, необходимая для реализации синхронизации в мультипроцессоре, - это набор аппаратных примитивов с возможностью атомного чтения и модификации местоположения памяти. Без такой возможности стоимость создания базовых примитивных синхронизационных систем будет слишком высокой и будет расти по мере увеличения количества процессоров. Существует ряд альтернативных формулировок основных аппаратных примитивов, все из которых обеспечивают возможность атомного чтения и модификации местоположения, а также способ определить, были ли чтение и запись выполнены атомно. Эти аппаратные примитивы являются основными строительными блоками, которые используются для создания широкого спектра операций синхронизации на уровне пользователя, включая такие вещи, как замки и барьеры. В целом, архитекторы не ожидают, что пользователи будут использовать базовые аппаратные примитивы, но вместо этого ожидают, что примитивы будут использоваться системными программистами для создания библиотеки синхронизации, процесс, который часто является сложным и сложным". Многие современные аппаратные средства обеспечивают такие атомные инструкции, два распространенных примера: тест и набор, который работает на одном слове памяти, и сравнение и обмен, который обменивает содержимое двух слов памяти.
Поддержка языков программирования
В Java, один из способов предотвратить помехи в потоке и ошибки согласованности памяти, это привязка к методу подписи с синхронизированным ключевым словом, в этом случае блокировка объявляющего объекта используется для обеспечения синхронизации. Второй способ - обернуть блок кода в синхронизированный раздел {someObject}, который предлагает более тонкий контроль зерна. Это заставляет любую нить получить замок someObject, прежде чем она сможет выполнить блокировку. Замок автоматически отключается, когда нить, которая получила замок, покидает этот блок или входит в состояние ожидания в блоке. Любые обновления переменных, сделанные потоком в синхронизированном блоке, становятся видимыми для других потоков, когда они аналогично получают блокировку и выполняют блок. Для любой реализации любой объект может быть использован для обеспечения блокировки, потому что все объекты Java имеют внутреннюю блокировку или блокировку монитора, связанную с ними при инстанцировании. Синхронизированные блоки Java, помимо возможности взаимного исключения и согласованности памяти, позволяют передавать сигналы. e. передача событий от потоков, которые получили блокировку и выполняют блок кода, тем, которые ждут блокировки в блоке. Поэтому синхронизированные секции Java объединяют функциональность как мутекса, так и событий для обеспечения синхронизации. Такая конструкция известна как синхронизирующий монитор. NET Framework также использует примитивы синхронизации. "Синхронизация разработана для кооперации, требуя, чтобы каждый поток следовал механизму синхронизации, прежде чем получать доступ к защищенным ресурсам для достижения последовательных результатов. Закрытие, сигнализация, легкие типы синхронизации, спин-вызов и взаимосвязанные операции являются механизмами, связанными с синхронизацией в NET. Многие языки программирования поддерживают синхронизацию, и целые специализированные языки были написаны для разработки встроенных приложений, где строго детерминированная синхронизация имеет первостепенное значение.
Спинлок
Еще один эффективный способ осуществления синхронизации - использование спинлоков. Перед тем, как получить доступ к любому ресурсу или части кода, каждый процессор проверяет флаг. Если флаг сброшен, то процессор устанавливает флаг и продолжает выполнять потоковую передачу. Но если флаг установлен (заперт), нитки будут продолжать вращаться в петле и продолжать проверять, установлен флаг или нет. Но спинлоки эффективны только в том случае, если флаг сброшен на более низкие циклы, в противном случае это может привести к проблемам с производительностью, поскольку тратится много процессорных циклов ожидания.
Математические основы
Синхронизация изначально была концепцией, основанной на процессе, посредством которого можно было получить замок на объекте. Его основное использование было в базах данных. Существует два типа блокировки (файлов): только для чтения и для чтения/записи. Замки для чтения могут быть получены с помощью многих процессов или нитей. Замки читателя-письменника являются эксклюзивными, поскольку их может использовать только один процесс/поток за раз. Хотя блокировки были получены для файловых баз данных, данные также передаются в памяти между процессами и потоками. Иногда заперто более одного объекта (или файла) одновременно. Если они не заперты одновременно, они могут перекрываться, вызывая исключение тупика. Java и Ada имеют исключительные блокировки только потому, что они основаны на потоках и полагаются на инструкцию процессора compare and swap. Абстрактная математическая основа для примитивных синхронизационных систем дается моноидом истории. Существует также много теоретических устройств более высокого уровня, таких как процессовые калькулы и сети Петри, которые могут быть построены на вершине моноида истории.
Примеры
Ниже приведены некоторые примеры синхронизации с различными платформами.