link0 link1 link2 link3 link4 link5 link6 link7 link8 link9 link10 link11 link12 link13 link14 link15 link16 link17 link18 link19 link20 link21 link22 link23 link24 link25 link26 link27 link28 link29 link30 link31 link32 link33 link34 link35 link36 link37 link38 link39 link40 link41 link42 link43 link44 link45 link46 link47 link48 link49 link50 link51 link52 link53 link54 link55 link56 link57 link58 link59 link60 link61 link62 link63 link64 link65 link66 link67 link68 link69 link70 link71 link72 link73 link74 link75 link76 link77 link78 link79 link80 link81 link82 link83 link84 link85 link86 link87 link88 link89 link90 link91 link92 link93 link94 link95 link96 link97 link98 link99 link100 link101 link102 link103 link104 link105 link106 link107 link108 link109 link110 link111 link112 link113 link114 link115 link116 link117 link118 link119 link120 link121 link122 link123 link124 link125 link126 link127 link128 link129 link130 link131 link132 link133 link134 link135 link136 link137 link138 link139

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Ввод-вывод

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

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

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

!Примеры:

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

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

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

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

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

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

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

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

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

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

 

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

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

 

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

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

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

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

 

 

 

 

 

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

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

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