Меню

Что такое процесс синхронизация



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

Процессом (process) называется экземпляр программы, загруженной в память. Этот экземпляр может создавать нити (thread), которые представляют собой последовательность инструкций на выполнение. Важно понимать, что выполняются не процессы, а именно нити.

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

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

В зависимости от ситуации нити могут находиться в трех состояниях. Во-первых, нить может выполняться, когда ей выделено процессорное время, т.е. она может находиться в состоянии активности. Во-вторых, она может быть неактивной и ожидать выделения процессора, т.е. быть в состоянии готовности. И есть еще третье, тоже очень важное состояние — состояние блокировки. Когда нить заблокирована, ей вообще не выделяется время. Обычно блокировка ставится на время ожидания какого-либо события. При возникновении этого события нить автоматически переводится из состояния блокировки в состояние готовности. Например, если одна нить выполняет вычисления, а другая должна ждать результатов, чтобы сохранить их на диск. Вторая могла бы использовать цикл типа «while( !isCalcFinished ) continue;», но легко убедиться на практике, что во время выполнения этого цикла процессор занят на 100 % (это называется активным ожиданием). Таких вот циклов следует по возможности избегать, в чем оказывает неоценимую помощь механизм блокировки. Вторая нить может заблокировать себя до тех пор, пока первая не установит событие, сигнализирующее о том, что чтение окончено.

Синхронизация нитей в ОС Windows

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

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

Пример. Несинхронизированная работа нитей: если временно приостановить выполнение нити вывода на экран (пауза), фоновая нить заполнения массива будет продолжать работать.

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

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

Объектов синхронизации существует несколько, самые важные из них — это взаимоисключение (mutex), критическая секция (critical section), событие (event) и семафор (semaphore). Каждый из этих объектов реализует свой способ синхронизации. Также в качестве объектов синхронизации могут использоваться сами процессы и нити (когда одна нить ждет завершения другой нити или процесса); а также файлы, коммуникационные устройства, консольный ввод и уведомления об изменении.

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

Работа с объектами синхронизации

Чтобы создать тот или иной объект синхронизации, производится вызов специальной функции WinAPI типа Create. (напр. CreateMutex). Этот вызов возвращает дескриптор объекта (HANDLE), который может использоваться всеми нитями, принадлежащими данному процессу. Есть возможность получить доступ к объекту синхронизации из другого процесса — либо унаследовав дескриптор этого объекта, либо, что предпочтительнее, воспользовавшись вызовом функции открытия объекта (Open. ). После этого вызова процесс получит дескриптор, который в дальнейшем можно использовать для работы с объектом. Объекту, если только он не предназначен для использования внутри одного процесса, обязательно присваивается имя. Имена всех объектов должны быть различны (даже если они разного типа). Нельзя, например, создать событие и семафор с одним и тем же именем.

Читайте также:  Как синхронизировать viber на другом устройстве

По имеющемуся дескриптору объекта можно определить его текущее состояние. Это делается с помощью т.н. ожидающих функций. Чаще всего используется функция WaitForSingleObject. Эта функция принимает два параметра, первый из которых — дескриптор объекта, второй — время ожидания в мсек. Функция возвращает WAIT_OBJECT_0, если объект находится в сигнальном состоянии, WAIT_TIMEOUT — если истекло время ожидания, и WAIT_ABANDONED, если объект-взаимоисключение не был освобожден до того, как владеющая им нить завершилась. Если время ожидания указано равным нулю, функция возвращает результат немедленно, в противном случае она ждет в течение указанного промежутка времени. В случае, если состояние объекта станет сигнальным до истечения этого времени, функция вернет WAIT_OBJECT_0, в противном случае функция вернет WAIT_TIMEOUT. Если в качестве времени указана символическая константа INFINITE, то функция будет ждать неограниченно долго, пока состояние объекта не станет сигнальным.

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

Критические секции

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

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

Пример. Синхронизация нитей с помощью критических секций.

Взаимоисключения

Объекты-взаимоисключения (мьютексы, mutex — от MUTual EXclusion) позволяют координировать взаимное исключение доступа к разделяемому ресурсу. Сигнальное состояние объекта (т.е. состояние «установлен») соответствует моменту времени, когда объект не принадлежит ни одной нити и его можно «захватить». И наоборот, состояние «сброшен» (не сигнальное) соответствует моменту, когда какая-либо нить уже владеет этим объектом. Доступ к объекту разрешается, когда нить, владеющая объектом, освободит его.

Две (или более) нити могут создать мьютекс с одним и тем же именем, вызвав функцию CreateMutex. Первая нить действительно создает мьютекс, а следующие — получают дескриптор уже существующего объекта. Это дает возможность нескольким нитям получить дескриптор одного и того же мьютекса, освобождая программиста от необходимости заботиться о том, кто в действительности создает мьютекс. Если используется такой подход, желательно установить флаг bInitialOwner в FALSE, иначе возникнут определенные трудности при определении действительного создателя мьютекса.

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

  • Дочерний процесс, созданный при помощи функции CreateProcess может наследовать дескриптор мьютекса в случае, если при создании мьютекса функцией CreateMutex был указан параметр lpMutexAttributes.
  • Нить может получить дубликат существующего мьютекса с помощью функции DuplicateHandle.
  • Нить может указать имя существующего мьютекса при вызове функций OpenMutex или CreateMutex.

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

Для синхронизации нитей одного процесса более эффективно использование критических секций.

Пример. Синхронизация нитей с помощью мьютексов.

События

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

Функция CreateEvent создает объект-событие, SetEvent — устанавливает событие в сигнальное состояние, ResetEvent — сбрасывает событие. Функция PulseEvent устанавливает событие, а после возобновления ожидающих это событие нитей (всех при ручном сбросе и только одной при автоматическом), сбрасывает его. Если ожидающих нитей нет, PulseEvent просто сбрасывает событие.

Пример. Синхронизация нитей с помощью событий.

Семафоры

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

Читайте также:  Синхронизация контактов google с samsung kies

Функция CreateSemaphore создает объект-семафор с указанием и максимально возможного начального его значения, OpenSemaphore – возвращает дескриптор существующего семафора, захват семафора производится с помощью ожидающих функций, при этом значение семафора уменьшается на единицу, ReleaseSemaphore — освобождение семафора с увеличением значения семафора на указанное в параметре число.

Пример. Синхронизация нитей с помощью семафоров.

Защищенный доступ к переменным

Существует ряд функций, позволяющих работать с глобальными переменными из всех нитей, не заботясь о синхронизации, т.к. эти функции сами за ней следят – их выполнение атомарно. Это функции InterlockedIncrement, InterlockedDecrement, InterlockedExchange, InterlockedExchangeAdd и InterlockedCompareExchange. Например, функция InterlockedIncrement атомарно увеличивает значение 32-битной переменной на единицу, что удобно использовать для различных счетчиков.

Для получения полной информации о назначении, использовании и синтаксисе всех функций WIN32 API необходимо воспользоваться системой помощи MS SDK, входящей в состав сред программирования Borland Delphi или CBuilder, а также MSDN, поставляемым в составе системы программирования Visual C.

Источник

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

Большая советская энциклопедия. — М.: Советская энциклопедия . 1969—1978 .

Смотреть что такое «Синхронизация» в других словарях:

Синхронизация — процедура согласования объектами времени выполнения ими процессов обработки или передачи данных. Синхронизация осуществляется: на физическом уровне: посредством тактирование, задающего единый стандарт дискретного времени для управления процессом… … Финансовый словарь

синхронизация — и, ж. synchronisation <гр. syn вместе + chronos время. С. в звуковом кино (согласование во времени изображения на экране с звуками, сопровождающими изображение). Уш. 1940. Приведение двух или нескольких периодически изменяющихся явлений к… … Исторический словарь галлицизмов русского языка

СИНХРОНИЗАЦИЯ — СИНХРОНИЗАЦИЯ, синхронизации, мн. нет, жен. (научн., тех.). Действие по гл. синхронизировать. Синхронизация в звуковом кино (согласование во времени изображения на экране с звуками, сопровождающими изображение). Толковый словарь Ушакова. Д.Н.… … Толковый словарь Ушакова

синхронизация — синхронизирование, хронирование Словарь русских синонимов. синхронизация сущ., кол во синонимов: 5 • гиперсинхронизация (1) • … Словарь синонимов

СИНХРОНИЗАЦИЯ — приведение двух или нескольких процессов к такому их протеканию, когда одинаковые или соответствующие элементы процессов совершаются с неизменным сдвигом во времени либо одновременно (напр., речь оратора и переводчика при синхронном переводе,… … Большой Энциклопедический словарь

Синхронизация — (от греч. synchronos одновременный) теоретический конструкт (автор К.Г. Юнг (1951 г.), обозначающий одновременное смысловое совпадение событий, которые в действительности друг с другом не связаны. Индивид может, например, многократно сталкиваться … Психологический словарь

синхронизация — СИНХРОНИЗИРОВАТЬ, рую, руешь; анный; сов. и несов., что (спец.). Привести ( водить) к синхронизму. С. работу агрегатов. Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

СИНХРОНИЗАЦИЯ — (от греч. synchronismos одновременность) англ. synchronization; нем. Synchronisierung. Приведение двух или нескольких повторяющихся процессов к такому их протеканию, при к ром соответствующие элементы процессов совершаются с неизменным интервалом … Энциклопедия социологии

синхронизация — Этимология. Происходит от греч. synchronos одновременный. Автор. К.Г.Юнг (1951 г.). Категория. Теоретический конструкт, обозначающий одновременное смысловое совпадение событий, которые в действительности друг с другом не связаны. Специфика.… … Большая психологическая энциклопедия

синхронизация — — [Интент] Тематики электротехника, основные понятия EN clockingholdinglockingsynchronizationsynchronizingtimingtriggering … Справочник технического переводчика

Синхронизация — – согласование или уравнивание длительности выполнения набора трудовых операций на каждом посту (или каждым звеном рабочих) технологической линии с принятым ритмом выпуска продукции. [МД 3.02 2000] Рубрика термина: Экономика Рубрики… … Энциклопедия терминов, определений и пояснений строительных материалов

Источник

Синхронизация как инструмент командного тайм-менеджмента

Если бы мы все жили в изоляции (социальном вакууме), задача организации времени решалась бы очень просто:

  • Запланировал
  • Расставил приоритеты
  • Сделал то, что запланировал

Вот только жить, я думаю, было бы очень скучно в режиме социальной изоляции… Поэтому на практике все получается намного «интереснее». Ведь вокруг нас люди со своими (порой другими) взглядами, планами, целями, желаниями и интересами.

Возникает «трение планов», особенно сильное в слоях ближнего окружения, которое можно утилизировать за счет синхронизации

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

  • Семья: жена, муж, дети, родители
  • Сотрудники вашей компании (отдела, подразделения)
  • Партнеры по бизнесу: поставщики, подрядчики и т.п.
  • Друзья

Заглянем в Википедию и разберемся с синхронизацией. «Синхронизация (от греч. συνχρόνος — одновременный) — процесс приведения к одному значению одного или нескольких параметров разных объектов». А теперь пару примеров из жизни и перейдем к технической стороне вопроса.

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

Решили вы затеять в компании (отделе) грандиозные перемены к лучшему. Сходили на тренинг, начитались книг, вдохновились чужим примером. Собрали коллектив, начали восторженно рассказывать. А в ответ… Тишина, отсутствие интереса, кислые и унылые лица. Или даже открытое сопротивление: «Ну зачем нам это все нужно…». Как быть?

Читайте также:  Проблемы с синхронизацией скоро все снова будет работать что это

Трение можно сильно уменьшить или избежать за счет синхронизации пространства целей

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

Все может быть иначе…

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

  • Обсудить планы каждого на ближайший год по направлениям: работа и проекты, личное развитие, наши семейные отношения.
  • Высказаться всем о своих мечтах, желаниях и целях 2019 (для примера) по каждому из этих 3-х направлений.
  • Внимательно выслушать всех, не перебивая. Ваши детки с удовольствием расскажут, чего они хотят, и вы услышите много дельного. Уверяю вас!
  • Потом собрать все это в одну картинку, возможно слегка поправив некоторые детские «глупости». Подкинув идею, что надо бы сделать атмосферу в семье потеплее, улучшить «семейный рацион», больше активности, меньше дивана.
  • Оформить на 1 листе А4 (а может даже плакате), назвав произведение «Цели нашей замечательной семьи на ближайший год».
  • Подписать всем, чтобы была хоть какая-то ответственность.
  • Повесить на видном месте, например, на зеркало шкафа-купе в общем коридоре. Чтобы почаще на глаза попадалось и не забывали.

Чтобы на это можно было опереться в сложном разговоре или ситуации

Тогда, при попытке предложить идею совместной прогулки и «отсутствии поддержки» со стороны остальных членов семьи… Что вы можете сделать? Мягко по форме и твердо в принципе сказать: «Дорогие мои, а давайте посмотрим, о чем мы договорились однажды перед Новым годом. Подходите поближе (показываете на листочек с целями). В списке есть здоровый образ жизни. Верно? Прогулка или ТВ на диване, что двигает нас быстрее к этой цели?»

И не важно, что уже прошел Новый год. Мы в нашей семье последний раз синхронизировали цели в июле. У вас это еще не сделано? Собирайте своих близких сегодня вечером за столом и организуйте семейный ужин.

Когда есть общая и согласованная цель(и), уменьшается трение в любой группе (коллективе)

  • У лидера группы появляется точка опоры для переговоров «а зачем это надо»;
  • Легче и быстрее решаются сложные вопросы;
  • Все становится просто и понятно с вопросом «Что сейчас важнее?». То, что максимально работает на поставленную цель. Это и есть приоритет;
  • Быстрее идут перемены к лучшему;
  • Сильно уменьшается синдром работы по Крылову «Однажды лебедь, рак, да щука…».

Синхронизация целей – основа любого командного менеджмента

В бизнесе все похожим образом. У меня есть «любимое развлечение» (не смеха ради) в консалтинговом проекте. Задать по отдельности ключевым сотрудникам один и тот же вопрос.

Какая главная цель у вашей компании на ближайший год?

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

Несколько советов как синхронизироваться в бизнесе:

  • Подготовить и провести стратегическую сессию с ключевыми сотрудниками.
  • Оформите по итогам «Карту стратегических целей» компании на ближайший год. Отразить ваши планы по следующим плоскостям: финансы, клиенты, процессы и команда (персонал)
  • Повесьте карту целей на видном месте, оптимально в кабинете где проводите планерки

Создавайте пространство общих целей на ближайший год с каждым из вашего ближнего окружения!

А если они сильно сопротивляются, или вы сами очень боитесь, приходите вместе на тренинг «Порядок в делах руководителя» , изменения к лучшему гарантируем!

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

Книгу, которую стоит прочитать:

Для того, чтобы с деловой целью «не пролететь», стоит внимательно разобраться с вектором «куда движется мир». Я как-то увидел на фотографии Г. Грефа с книгой Митио Каку «Физика будущего» . Заинтересовался, нашел и прочитал в один подход. Кому как не ученым-физикам (ядерщикам) рассуждать о том, что будет представлять собой мир в 2100 году?

Искусственные органы, парящие в воздухе автомобили, невероятная продолжительность жизни и молодости, нанорепликаторы — все эти чудеса не фантастика, а научно обоснованные прогнозы серьезных ученых, интервью с которыми обобщил в своей книге Митио Каку. Каждое направление в книге удобно разбито на разделы: текущие достижения (уже есть), ближайшая перспектива, середина века, дальние перспективы до 2100. Стратегам-предпринимателям и руководителям читать обязательно. Разрыв шаблона и культурный шок гарантирую!

Источник

Adblock
detector