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

Главной особенностью синхронизации в этом случае является то, что переменные для синхронизации должны создаваться в ядре ОС. ОС Windows имеет универсальный механизм для синхронизации с помощью объектов ядра. К объектам ядра относятся все объекты, которыми управляет ОС. В API имеются функции ожидания объектов; если поток вызывает функцию ожидания объекта, то, если объект свободен, поток продолжается, а если занят, то приостанавливается, переходя в режим ядра.

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

Одним из специальных объектов для синхронизации является объект сигнал (Event). Объектом может находиться в одном из двух состояний: свободен или занят. Поток, вызывая функцию Set, устанавливает сигнал в свободное состояние. Если есть ожидающие на функции Wait, то один из потоков будет переведен в активное состояние. Вызов метода Reset переводит сигнал в занятое состояние. Любой поток вызвавший функцию Wait переводится в состоянии ядра, т.е. ожидает освобождения сигнала.

Тема №15 «Семафоры и мьютексы»

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

Семафор – это защищенная переменная, над которой допускается выполнение ограниченного набора операций. Защищенной является, потому что размещается в ядре ОС.

Операция входа в семафор Enter выполняется следующим образом, если семафор свободен S==0, то поток продолжает свою работу, а семафор переводится в состояние занято (S==1). Если семафор был занят, поток сразу же переводится в режим ожидания, т.е. в режим ядра.

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

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

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

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

Компонентные технологии (COM, CORBA)

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

Рассмотрим варианты построения исполняемого кода программ:

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

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

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

Возникла идея программного компонента как динамически вызываемого объекта, который способен решать проблему контроля версий.

Тема №16 «Интерфейсы»

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

Обозначается

С точки зрения объектного подхода, интерфейс компонента, это интерфейс класса. Интерфейс класса – перечисление описание всех свойств и методов с их типами. Именно интерфейсом определяется компонент. Реализация значения для взаимодействия не имеет, т.е. выдерживается принцип инкапсуляции.

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

GUID - Глобальный универсальный идентификатор интерфейса.

Для однозначной идентификации компонента компонентные технологии используют глобальные уникальные идентификаторы (GUID). Идентификаторы это 128 байтная комбинация, которая генерируется специальной утилитой. Алгоритм идентификации гарантирует, что полученная комбинация уникальна и не может повторно встретиться ни у одного программиста на Земле (2^1024).

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

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

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

Например, для технологии COM Microsoft установлено, что всякий компонент должен реализовать интерфейс IUnknow, в который входят три метода:

1) QueryInterface(…) – предназначен для запроса GUID. Если клиент вызывает этот метод, компонент должен сообщить соответствует ли его GUID запрошенному. Компонент возвращает ответ, указывающий на соответствия. Клиент сам принимает решения, как работать с компонентом, это может быть либо отказ от взаимодействия, либо запрос другого GUID, либо продолжение нормального взаимодействия.

2) Если взаимодействие возможно, то клиент вызывает функцию AddRef(…). Ее реализации заключается в том, что компонент увеличивает счетчик использования себя на единицу.

3) Функция Release(…) выполняет обратно действие.

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

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

Чтобы вызывать функции компонентного интерфейса должен существовать активный экземпляр компонента. Всю работу по запуску компонента выполняет промежуточное программного обеспечение Middle Ware. В ОС Windows оно является системным, для других компонентных технологий это невстроенное в ОС программное обеспечение. Его могут называть сервером приложения Application Server. Основная работа приложения это поиск и запуск компонентов. Первой функцией, которую вызывает клиент на самом деле является поиск размещения файла компонента и его запуск. Всякая компонентная технология предусматривает наличие так называемого репозитория – информационной системы, в которой регистрируются компоненты.

Реестр Windows выполняет в частном случает роль репозитория. При инсталляции новых программ, инсталлятор вызывает системные функции регистрации компонентов. В соответствующих разделах реестра создаются записи, по которым ОС Windows находит и запускает запрашиваемые компоненты.

Тема №17 «Технология.Net»

Многоязыковая среда

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

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

Компилятор с любого языка в качестве результата дает не процессорный код (как делают “обычные” компиляторы), а код на промежуточном языке IL. Этот язык является объектно-ориентированным и для непосредственного программирования не используется.

Общеязыковая среда исполнения (CLR)

Программный модуль ну промежуточном языке в момент исполнения обрабатывается JIT (Just In Time) компилятором. Этот компилятор транслирует код из промежуточного языка в процессорный код. Дополнительный уровень компиляции позволяет в большей степени учесть особенности конкретного процессора (Число ядер, специфические команды). JIT –компилятор преобразует не весь код, а только часть, которая исполняется в данный момент.

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

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

Система исполнения имеет конфигурационный файл, в котором могут блокироваться те или иные реакции на опасные ситуации. Пользователь в этом случае берет на себя ответственность за результаты исполнения.

Управляемый C++ рассматривается в.Net как язык не использующий указателей. Указатели являются опасными объектами, использование которых ведет к непредсказуемым последствиям. Аналогично программный код на C++ является не управляемым если он использует библиотеки не управляемых функций.

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

В.Net используется понятие сборка, т.е. совокупность управляемых модулей. Эта информация относится к метаданным.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: