Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Многозадачность и языки программирования



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

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

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

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

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

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

Если расширить понятие процедуры так, чтоб оно охватывало представление параллельных процессов, то такое их определение имеет несомненное достоинство, состоящее в том, что упрощается понимание процесса. В действительности подобные механизмы используются в различных языках (определение процессов в языке Modula, описание задач в языке Ада, потоков в Java, Delphi и C++ Builder). Средства описания процедур в этих языках дополняются специальными операторами для организации межпроцессного взаимодействия.

Для получения доступа к средствам управления процессами операционных систем могут использоваться специальные библиотеки (например, для порождения потоков и управления их взаимодействием в программах, написанных на C или C++ для Windows 95 или Windows NT).

1.2.9. Взаимодействие процессов и синхронизация задач в OS/2

Для синхронизации выполнения задач в OS/2 существуют различные механизмы.

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

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

Начало и конец критической секции ограничиваются сверху и снизу вызовом соответственно функций DosEnterCritSec и DosExitCritSec:

// Начало критической секции

DosEnterCritSec();

// Этот фрагмент кода задачи будет выполняться в монопольном

// режиме по отношению к другим потокам процесса

...

// Конец критической секции

DosExitCritSec()

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

По запросу задач OS/2 может создать один или несколько семафоров для синхронизации их выполнения.

В OS/2 существуют три типа семафоров, с помощью которых можно организовать ожидание одного или нескольких событий, а также реализовать последовательное использование ресурсов, к которым невозможен параллельный доступ:

Семафор Применение
Mutex Используется как классические семафоры с примитивами P() и V() для реализации взаимного исключения и синхронизации задач
Событие Применяется для передачи управляющих сигналов между процессами о выполнении той или иной активности
MuxWait Используются для того, чтобы процесс или нить могли ожидать на нескольких семафорах сразу

В OS/2 могут создаваться как разделяемые, так и собственные семафоры. Разделяемые (совместно используемые) семафоры применяются потоками одного или нескольких процессов. Собственные семафоры используются нитями только одного процесса. Для синхронизации в рамках одного процесса применение собственных семафоров более эффективно.

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

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

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

Для запроса доступа к уже созданному семафору используется функция DosOpenMutexSem, в качестве параметров которой задается имя (для именованного семафора в форме \sem32\имя) и описатель.

Для закрытия доступа к семафору служит функция DosCloseMutexSem с параметром, задающим описатель семафора.

Семафорный примитив P() реализуется с помощью функции DosRequestMutexSem, при вызове которой указывается описатель запрашиваемого семафора и максимальное время ожидания на нем.

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

Для проверки семафора может быть использована функция DosQueryMutexSem.

Синхронизирующие события в OS/2 создаются функцией DosCreateEventSem, при вызове которой определяется имя (для именованного семафора) и переменная-описатель.

Другие потоки или процессы для начала работы с событием должны его открыть с помощью DosOpenEventSem. Для прекращения работы с событием его следует закрыть функцией DosCloseEventSem.

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

DosQueryEventSem возвращает число наступивших событий после последнего сброса. Закрывает семафор функция DosCloseEventSem.

Из рассматриваемых в данном пособии платформ OS/2 имеет наиболее широкий механизм семафоров.

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

Процесс создает канал с помощью специальной процедуры, возвращающей идентификатор созданного канала. Функции передачи данных через канал сходны с функциями чтения или записи для стандартных потоков ввода/вывода DOS. Данная ОС позволяет создавать каналы между процессами, запущенными на различных рабочих станциях в локальной сети. Набор функций OS/2 для работы с именованными каналами практически совпадает с соответствующими средствами Windows NT.

Помимо каналов в OS/2 существует более сложное средство передачи данных между процессами - очереди.

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

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

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

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





Дата публикования: 2014-11-29; Прочитано: 414 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...