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

Способы синхронизации: программный опрос готовности

Рейтинг:   / 0

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

  1. Программный безусловный обмен;
  2. Программный опрос готовности;
  3. Прерывание;
  4. Прямой доступ в память;
  5. Удлинение канального цикла ввода-вывода.

Простейший способ, программный опрос готовности (polling) схематично представлен на рисунке (см. рисунок ниже).

 

Опрос готовности состоит чаще всего в анализе состояния определенных битов в регистре статуса (состояния): при достижении состояния готовности к обмену ВНУ устанавливает этот (эти) бит(ы) в определенное состояние. Обмен с ВНУ состоит в чтении или записи в регистр данных.

Так, если приемник последовательного интерфейса принял извне байт, автоматически устанавливается флаг готовности - младший байт в порте 03FDh. Фрагмент программы, ожидаю-щий приема байта, может выглядеть так:

 

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

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

В англоязычной литературе используются три разных термина:

  • hardware interrupt - аппаратное прерывание;
  • exсeption - исключение, прерывание по исключительной (экстраординарной) внутренней ситуации;
  • software interrupt - программное прерывание.

 

 

 

 

 

Будем далее называть подпрограмму, обрабатывающую факт наступления события, обработчиком прерывания (interrupt handler или exception handler).

Термин “обработка прерывания” может использоваться для обозначений двух различных вещей:

  1. действия, которые автоматически выполняет процессор при возникновении запроса, они реализованы аппаратно;
  2. действия, которые выполняет программа-обработчик прерывания (handler). Мы будем использовать термин “обработка прерывания” только во втором смысле, а для первой группы действий будем использовать термин “вход в прерывание”.

Примеры внешних процессов, с которыми хочется синхронизировать программу

Рейтинг:   / 0

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

!Примеры:

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

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

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

!Примеры:
 
• Произошло деление на нуль, и следующую операцию, которая должна использовать результат деления, выполнить невозможно.
 
•Пользователь нажал Ctrl-Break, и выполнять программу дальше не следует.
 

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

Рассмотрим далее, каким образом программа может "узнать" о наступлении события.

Яндекс.Метрика