Автоматизация
Вид материала | Документы |
СодержаниеПосимвольная работа с терминалом Организация файлов на магнитных дисках Вывод на печать Работа с перфолентой Комплексный пример Контрольные вопросы к главе 7 |
- В. И. Харитонов > К. И. Меша Одобрено методической > С. С. Драгунов комиссией факультета, 321.05kb.
- Темы курсовых проектов Автоматизация учета налогоплательщиков (НП) физических и юридических, 19.54kb.
- Автоматизация бухгалтерского учета нужна ли она?, 216.55kb.
- Программа вступительного экзамена по приему в магистратуру по специальности 6М070200, 225.94kb.
- Автоматизация работы программ расчета, 29.26kb.
- Автоматизация и моделирование работы предприятий по строительству промышленных объектов, 445.96kb.
- Автоматизация процессов мониторинга объектов железнодорожной инфраструктуры на основе, 315.84kb.
- К рабочей программе учебной дисциплины «Интегрированные системы проектирования и управления»», 31.58kb.
- Автоматизация процесса формирования индивидуальных учебных планов в системе переподготовки, 256.55kb.
- Темы курсовых работ По дисциплине «Бухгалтерские информационные системы» Автоматизация, 14.74kb.
Монитор операционной системы РАФОС содержит широкий набор системных программ, обеспечивающих передачу данных, синхронизацию задач и т. д. Обращение к этим программам монитора осуществляется с помощью макровызовов системных макрокоманд, или программных запросов.
Макроопределения системных макрокоманд сгруппированы в макробиблиотеку. Состав этой библиотеки в случае необходимости может быть расширен макроопределениями, написанными пользователем.
Указание в тексте программы пользователя имени системной макрокоманды приводит к генерации (на стадии трансляции) макрорасширения, вид которого определяется функциями вызываемого системного средства и отчасти формой написания макровызова. Однако во всех случаях последней строкой макрорасширения является специальная команда ЕМТ, которая носит название эмуляции или программного прерывания. По команде ЕМТ происходит прерывание выполняемой программы через вектор прерывания с адресом 30, откуда берется адрес специальной программы-диспетчера, входящей в состав RMON и обрабатывающей это прерывание. Функции диспетчера заключаются в том, чтобы инициировать, именно ту системную программу, которая отождествляется с именем макровызова и выполняет затребованные пользователем действия. Каждая из этих программ имеет определенный номер (код), который так или иначе должен быть получен диспетчером из текста макрорасширения. Существует несколько способов передачи кода вызываемой программы, отличающихся быстродействием и возможностями.
Рассмотрим, например, реакцию ОС на макровызов .EXIT, которым обычно заканчивается программа пользователя. Этот макровызов расширяется в единственную программную строку ЕМТ 350, в которой число 350 (аргумент команды ЕМТ) представляет собой код вызываемой программы. Таким образом, код программы передается здесь через аргумент команды ЕМТ. Заметим, что сам макровызов .EXIT не предполагает передачи вызываемой программе каких-либо аргументов.
Рассмотрим теперь макрокоманду .PRINT, с помощью которой на экран терминала выводится произвольный текст. Адрес текста указывается в качестве аргумента макровызова:
TEXT: .ASCIZ /ATTENTION!/
.EVEN
.PRINT #ТЕХТ
MOV #ТЕХТ, RO ;макрорасширение
EMT 351;
Здесь так же как и в предыдущем примере, код вызываемой программы (351) передается через аргумент команды ЕМТ. Аргумент же макровызова, в данном случае — адрес строки с выводимым, текстом, загружается в R0. Системная программа, выполняющая вывод строки текста на экран терминала, написана так, что в ней предполагается наличие в R0 адреса выводимой строки. В описанном выше типе макрокоманд используются коды от 1, до 357 .
Другой способ передачи кода программы используется в макрокомандах, имеющих в качестве аргумента команды ЕМТ число 374. расширениях макрокоманд этого типа код программы засылается арший байт регистра R0, откуда затем он забирается программой обработки системного прерывания. В младшем байте R0 может находиться числовой аргумент.
Рассмотрим макрорасширение макровызова .SPND, позволяющего приостановить выполнение программы пользователя, например, до завершения операции передачи данных:
.SPND
MOV #1*400,R0 ; макрорасширение
ЕМТ 374 Код соответствующей программы равен 1. Умножение кода на 4008 помещает его в старший байт адресуемого слова, в данном случае в старший байт R0. Младший байт остается незаполненным. Программа обработки системного прерывания, проанализировав аргумент команды ЕМТ, определяет по значению аргумента (374), что код вызываемой программы находится в старшем байте R0. Примером макрокоманды описанного типа с числовым, аргументом является макрокоманда .CLOSE, закрывающая канал связи с внешним устройством:
.CLOSE #2
MOV #2+<6*400>, R0 ; макрорасширение
ЕМТ 374 ,
Выражение, используемое в качестве аргумента команды MOV, построено так, что в старший байт R0 засылается код вызываемой программы (6), а в младший байт Я0 — аргумент макровызова ,(2), представляющий собой номер закрываемого канала.
Наконец, при большом числе аргументов макровызова используется третий тип макрокоманды, требующий для передачи аргументов специальной области в поле данных программы пользователя. Этот тип макрокоманд идентифицируется аргументом 375 команды ЕМТ. Такова, например, макрокоманда .LOOKUP, позволяющая открыть канал связи с определенным внешним устройством:
DEV: .RAD50 /LP/ ; имя устройства
ARG: .BLKW 2 ; область для аргу-
.LOOKUP #ARG, #6, #DEV ; ментов
MOV #ARG, R0 ; 4 строки
MOV #6+
; расширения
MOV DEV, 2(R0)
ЕМТ 375
Первой командой макрорасширения адрес ARG области для аргументов загружается в RO. Следующей командой первые два байта ARG заполняются номером канала 6 (младший байт) и кодом макрокоманды 1 (старший байт). Последняя команда MOV заносит адрес слова с именем устройства во второе слово области ARG. В результате выделенная пользователем область для аргументов оказывается заполненной значениями аргументов, взятыми из операндов макровызова . (рис. 7.5). После этого командой ЕМТ 375 вызывается программа открытия канала, которая получает аргументы из области ARG с помощью RO, в котором находится адрес этой области.
Как видно из последнего примера, при большом числе аргументов макрокоманды ее расширение может содержать значительное количество строк. Эти строки требуют места в оперативной памяти и времени на их выполнение. Если данный макровызов встречается в программе один раз, с этим приходится мириться. Если, однако, по ходу программы один и тот же макровызов используется многократно (например, в программе, насыщенной операциями передачи данных, каналы связи с устройствами многократно закрываются и повторно открываются), повторные макровызовы будут нерационально расходовать память и время процессора. Для повышения эффективности обращения к макрокомандам в РАФОС предусмотрено специальное средство — ключевой аргумент BLOCK, позволяющий использовать один и тот же блок аргументов для повторных макровызовов. Предыдущий пример с использованием аргумента BLOCK выглядит следующим образом;
ARG: .LOOKUP BLOCK, 6, LP ; в поле данных
.BYTE 6,1 ; макрорасширение
.R.AD50 /LP/
.
.
.
.DIR #ARG ; программная строка
макровызова
.
.
.
.DIR ARG ; повторный макровы-
Рис. 7.5. Область аргументов макровызова для конкретного примера.
Макровызов с аргументом BLOCK включен в поле данных программы. На этапе трансляции (а не выполнения программы, ik это было ранее) он расширяется в блок аргументов, которые можно использовать многократно. Для того чтобы выполнить требуемые действия (в рассматриваемом примере открыть канал), надо воспользоваться специальным макровызовом ,DIR с указанием адреса созданного блока аргументов. Макровызов .DIR расширяется всего в две программных строки:
MOV #ARG, RO
ЕМТ 375
При многократном использовании макровызова .DIR будут повторяться только эти строки.
Использование системных макрокоманд требует умения диагностировать их выполнение и анализировать возможные ошибки. Ошибка в макровызове (например, неправильно написанные аргументы) приводит к тому, что ОС не выполнит требуемые действия, однако система при этом не выводит никаких диагностических сообщений, а программа продолжает выполняться, хотя ее дальнейшее выполнение, возможно, уже лишено смысла. Поэтому важно уметь определять, правильно ли выполнен каждый программный. запрос.
Если при выполнении любого программного запроса обнаруживается ошибка, система устанавливает разряд С в ССП. Кроме того, код-Ошибки (обычно числа О, 1 или 2) заносится в специально выделенный для этого байт с абсолютным адресом 52. Диагностика выполнения программных запросов заключается, таким образом, в проверке состояния разряда С ССП и анализе байта 52, если разряд С установлен.
Например, для программного запроса .ENTER, резервирующего на магнитном диске место для файла и открывающего канал связи с ним, предусмотрено два кода ошибки:
0 - канал занят;
1 -на устройстве нет места для файла.
Программа с анализом правильности выполнения программного запроса .ENTER может схематично иметь следующий вид:
.ENTER #ARG, #6, #DEV
BCS ERR ; переход в случае ошибки
.
.
;продолжение программы
ERR: TSTB @#52 ; код ошибки 0?
BEQ CHBSY ; да, переход на модификацию номера канала
BNE DEVBSY ; нет, переход на аварийный останов
.
.
.
CHBSY: строки модификации номера канала
.
.
.
DEVBSY: ; строки вывода аварийного сообщения
.EXIT
После макровызова .ENTER анализируется разряд С ССП. Если разряд С сброшен, программа продолжает выполняться. Если разряд С установлен, происходит переход на метку ERR и анализируется содержимое байта ошибки. При коде ошибки 0 (канал занят) осуществляется переход на программу, модифицирующую номер канала, и повторяется макровызов .ENTER. Если же код ошибки 1 (на устройстве нет места), выдается аварийное сообщение и вся программа завершается.
§ 7.3. СИСТЕМНЫЕ СРЕДСТВА ОБСЛУЖИВАНИЯ ВВОДА-ВЫВОДА
ОС РАФОС имеет обширную группу макрокоманд, обеспечивающих связь программы пользователя с внешними устройствами. Сюда относится уже упоминавшаяся макрокоманда .PRINT, организующая вывод на экран терминала строк текста, макрокоманды .TTYOUT и .TTOUTR для посимвольного вывода на экран терминала, макрокоманды .TTYIN и .TTINR для посимвольного ввода знаков с клавиатуры терминала, а также 6 макрокоманд связи с любыми ВУ (НМД и НМЛ, перфоленточными устройствами и т. д.). Сюда относятся макрокоманды ввода .READ, .READW и .READC и макрокоманды вывода .WRITE, .WRITW и .WRITC.
В организации ввода — вывода большое значение имеет система очередей, организуемая монитором РАФОС. Основной очереди является элемент очереди -ввода — вывода — участок оперативной памяти длиной 7 слов, в котором в определенном порядке хранится вся необходимая для выполнения операции ввода — вывода информация: указатель на канал ввода — вывода, номер устройства ввода — вывода и код функции ввода — вывода, адрес буфера в программе пользователя, счетчик переданных слов, тип ввода — вывода и пр. Начальное слово элемента содержит адрес следующего элемента в очереди. Если данный элемент является последним или единственным, его начальное слово содержит нулевое значение.
Рис. 7.6. Связный список входных Рис. 7.7. Образование очереди к драйверу
элементов ввода-вывода
Элемент очереди служит передаточным звеном между программой пользователя и драйвером ВУ. При выполнении программного запроса на ввод — вывод (например, макрокоманды .READ с аргументами) монитор, получив управление посредством системного прерывания (команда ЕМТ, входящая в состав макрорасширения), заполняет первый свободный элемент очереди данными, взятыми из аргументов макрокоманды ввода — вывода и передает адрес этого элемента соответствующему драйверу, ставя элемент в очедь запросов ввода — вывода к данному ВУ.
Как только в очереди ввода — вывода появляется элемент ,очередь, монитор запускает драйвер ВУ, который непосредственно осуществляет передачу данных. Элемент ввода — вывода освобождается только после того, как драйвер полностью завершит свою работу.
Поскольку каждый программный запрос на ввод — вывод требует своего элемента очереди, количество доступных элементов очереди определяет количество параллельно выполняемых программных запросов на ввод — вывод. В FB-мониторе РАФОС каждая задача имеет по одному элементу очереди, расположенному в ее смешанной области. Количество, доступных элементов можно увеличить программным запросом .QSET, в поле аргументов кото-рой указывается адрес поля памяти в программе пользователя, отведённого под элементы очереди (по 7 слов на каждый элемент). Пусть с помощью программного запроса .QSET образовано три элемента, так что с учетом одного, предоставляемого системой, их стало 4 (рис. 7.6). В заголовке списка — слове QHDR, хранящемся в смешанной области задачи, находится адрес первого свободного элемента Q1. Начальное слово этого элемента содержит адрес следующего элемента Q2. Начальное слово элемента Q2, в свою очередь , содержит адрес следующего элемента и т. д. В начальном слове последнего элемента содержится нулевое значение, что говорит о том, что этот элемент — последний. Таким образом, хотя элементы очереди не связаны друг с другом физически и находятся в разных местах памяти, логически они связаны друг с другом в однонаправленный список, в котором с помощью любого очередного элемента можно легко найти следующий.
Рассмотрим взаимодействие монитора со списком элементов ввода — вывода (рис. 7.7). Выполняя программный запрос на ввод — вывод, монитор заполняет первый свободный элемент ввода — вывода необходимой для драйвера информацией и передает его адрес драйверу, записывая этот адрес в специальной ячейке LQE в заголовке драйвера. В другую ячейку CQE монитором записывается адрес последнего элемента очереди к данному драйверу. Если очередь к драйверу состоит только из одного элемента ввода — вывода, то содержимое ячеек LQE и CQE совпадает, а в начальном слове элемента ввода — вывода записан О, так как он последний. Если же, как это показано на рис. 7.7, в очереди к драйверу стоят два элемента ввода — вывода (которые драйвер будет обрабатывать последовательно, в порядке их поступления в очередь), то в ячейке CQE записан адрес второго элемента, Q2, начальное слово элемента Q1 содержит ссылку на второй элемент Q2, а в начальном слове Q2 записан нуль — идентификатор последнего элемента. Поскольку элементы Q1 и Q2 изъяты из списка свободных элементов, слово QHDR указывает на элемент Q3, который является теперь первым свободным элементом списка свободных элементов. .
По мере отработки запросов на ввод — вывод драйвером ВУ монитор забирает освободившиеся элементы из очереди к драйверу и снова включает их в список свободных элементов. Надо заметить, что все манипуляции с элементами ввода — вывода заключаются только в изменении содержимого начальных слов этих элементов. Сами элементы физически остаются на своих местах в памяти независимо от того, находятся ли они в настоящий момент в списке свободных элементов или в очереди к тому или иному драйверу.
Внешние устройства характеризуются, как правило, низкой скоростью работы. При этом участие центрального процессора в работе ВУ оказывается незначительным. Рассмотрим, например, процесс вывода информации. После того как передаваемая информация заполнила регистр данных ВУ, устройство само организует передачу данных на внешний носитель, на что и расходуется основная доля времени в операции вывода. Процессор все это время свободен и может выполнять другую работу. Таким образом, операции ввода — вывода могут быть совмещены с выполнением программы.
В системе РАФОС существует три разновидности ввода — вывода: синхронный (с ожиданием), асинхронный (без ожидания) и с управлением по событию (с подпрограммой завершения).
Синхронный ввод — вывод характеризуется блокированием задачи, выдавшей запрос на передачу данных, до окончания передачи время, на которое приостанавливается выполнениезадачи зависит от объема передаваемой информации и скорости работы ВУ. Например, ввод с перфоленты большого массива данных или печать длинного текста может потребовать нескольких минут. Если запрос на синхронный ввод — вывод выдала оперативная задача, все это время будет отдано фоновой задаче. Надо только иметь в виду, что фоновая задача будет выполняться с перерывами, требуемыми для передачи в РД ВУ или из него очередной порции информации. Как только передача данных полностью завершится, выполнение оперативной задачи будет продолжено. Синхронный ввод — вывод используется в тех случаях когда дальнейшее выполнение задачи опирается на результат ввода — вывода.
Асинхронный ввод — вывод характерен тем, что программный : запрос на передачу данных не приостанавливает задачу в ожидании конца передачи, а позволяет ей выполняться дальше. В этом случае параллельно идут два процесса: выполнение задачи и передачи данных. При этом выполнение задачи будет периодически прерываться на время, необходимое для обслуживания драйвером очередного прерывания от ВУ. Такой режим используется в тех случаях, когда дальнейший ход задачи не зависит от результатов передачи данных. Если, например, в задаче сформировано некоторое сообщение, выводимое на экран терминала или АЦПУ, целесообразно, инициировав вывод информации на ВУ, продолжить выполение задачи.
Наконец, последняя разновидность, ввод — вывод с управлением по событию, представляет собой развитие асинхронного ввода — вывода. В этом случае задача, выставив запрос на передачу,данных, т. е. инициировав драйвер, продолжает выполняться дальше. Параллельно осуществляется передача данных. Как только передача данных полностью завершится, управление передается , не в задачу, а в подпрограмму завершения, которая является .частью программы пользователя. Входная метка подпрограммы завершения указывается в виде одного из аргументов в макрокоманде ввода — вывода. При передаче управления подпрограмме завершения выполнение основной программы приостанавливается до тех пор, пока не будет выполнена подпрограмма завершения, которая, таким образом, имеет повышенный приоритет по сравнению с основной программой. Последней строкой подпрограммы завершения должна быть команда RTS PC, по которой происходит передача управления монитору. Монитор, в свою очередь, передает уравление основной программе, и та продолжает свою работу.
Функции подпрограммы завершения зависят от решаемой задачи. В простейшем случае подпрограмма завершения может просто сигнализировать оператору об окончании передачи данных, выводя, например, на экран терминала сообщение «Ввод данных закончен». Чаще, однако, подпрограммы завершения используются для анализа правильности результатов завершившейся операции ввода — вывода, обработки массива введенных данных, закрытия файла и т. д. Подпрограммы завершения не являются непременной принадлежностью ввода — вывода. С их помощью можно обрабатывать и другие асинхронные события: истечение заданногого интервала времени, завершение обработки прерывания и др.
Подпрограммы завершения — эффективное средство для разработки программ реального времени. Они не занимают времени процессора до наступления соответствующего события (завершения ввода—вывода), после чего они становятся наиболее приоритетными задачами в системе. При этом подпрограммы завершения не могут прерывать друг друга. Монитор, кроме очереди ввода — вывода, организует очереди подпрограмм завершения для каждой задачи (оперативной и фоновой). В очереди действует дисциплина обслуживания FIFO (первый вошел — первый обслужился).
Рассмотрим случай, когда фоновая задача выдала запрос на ввод с управлением по событию. Указание среди аргументов макрокоманды ввода .READC адреса подпрограммы завершения приводит к помещению этого адреса в соответствующее слово элемента ввода — вывода. После завершения ввода — вывода монитор анализирует это слово и, найдя в нем четное число, отличное от нуля, расценивает его как адрес подпрограммы завершения, преобразует элемент ввода — вывода в элемент очереди подпрограммы завершения (т. е. заполняет этот участок памяти новыми данными) и помещает его в очередь подпрограмм завершения к данной задаче. После этого управление передается планировщику.
Планировщик осуществляет запуск программы управления очередью подпрограмм завершения, которая вызывает подпрограмму завершения. После отработки подпрограммы завершения управление снова передается планировщику. Если очередь подпрограмм завершения пуста, планировщик осуществляет перепланировку задач (просмотр списка активных задач). В результате управление передается оперативной задаче (если она активна) либо происходит возврат в фоновую задачу. В первом случае фоновая задача возобновит свое выполнение только после того, как будет заблокирована оперативная.
Из перечисленных выше макрокоманд ввода — вывода синхронную передачу организуют макрокоманды .READW и .WRITW, асинхронную — макрокоманды .READ и .WRITE, а передачу по событию — .READC и .WRITC. Дополнительные возможности предоставляет макрокоманда .WAIT, которая, будучи поставлена после макрокоманд .READ или .WRITE, приостанавливает задачу до полного завершения ввода — вывода. Таким образом, комбинация макрокоманд .READ и .WAIT равносильна макрокоманде .READW.
Рассмотрим теперь взаимодействие программных запросов на ввод — вывод с элементами, очереди ввода — вывода. Как было показано, любой запрос на ввод — вывод требует одного элемента очереди, который освобождается после полного завершения передачи данных. Даже в наиболее сложном случае ввода – вывода c управлением по событию, когда сначала образуется очередь ввода — вывода, а затем — очередь программ завершения, и для той, и для другой очередей используется один и тот же элементент, который освобождается, когда заканчивает работу программа завершения. Таким образом, если в программе используется только синхронный ввод — вывод или запросы на ввод — вывод разделены во времени так, что операции передачи данных не накладываются друг на друга, а выполняются строго последовательно то для организации ввода — вывода достаточно одного элемента очереди. Этот элемент очереди предусмотрен в составе смешанной области для каждой задачи. Если, однако, операции передачи данных накладываются, следует увеличить количество элементов очереди ввода — вывода с помощью программного запроса .QSET. Пусть, например, программа, закончив обработку некоторыхданных, записывает результат обработки на магнитную ленту и требует от оператора ввода новых исходных данных для продолжения вычислений. Для повышения скорости работы программы операции вывода на ленту и ввода с клавиатуры целесообразно совместить, используя запрос на асинхронный вывод:
.WRITE
.READW
Как видно из рис. 7.8, на участке 2—3 выполняются две операции передачи данных и используются одновременно два элемента очереди ввода — вывода (по одному для каждого драйвера). Для правильного выполнения программы необходимо запросом .QSET зарезервировать дополнительно один элемент очереди.
Рис 7.8 Временная диаграмма работы программы Рис. 7.9. Структурная схема с совмещенными опе-
рациями ввода-вывода программы с циклической обработкой
Заметим, что использование синхронного ввода (макрокоманда .READW) в данном случае необходимо. Действительно, дальнейшее выполнение программы имеет смысл только после ввода исходных данных для следующего этапа вычислений.
Рассмотрим другой пример совмещения операций передачи данных. Пусть в программе организовано циклическое выполнение некоторых вычислений с записью результатов каждого шага на магнитный диск (рис. 7.9). Всего надо выполнить, например, 10 шагов. Если вычисления выполняются быстрее, чем запись на диск, запросы на вывод будут устанавливаться в очередь к драйверу НМД. При 10 шагах одновременно в очереди могут находиться до 10 элементов очереди ввода — вывода, поэтому перед выполнением цикла вычислений надо организовать 9 дополнительных элементов ввода — вывода.
Рассмотрим действие некоторых макрокоманд ввода — вывода.
Посимвольная работа с терминалом
Для организации посимвольной передачи надо прежде всего установить спецрежим терминала. В обычном режиме работы терминала символы, вводимые с клавиатуры, копятся в кольцевом буфере, находящемся в смешанной области задачи. Символы передаются из кольцевого буфера в программу пользователя (целой строкой) только после нажатия клавиши RETURN (BK). При этом ОС. сама организует высвечивание набранных символов на экране (так называемое эхо). В спецрежиме нажатие любой клавиши сразу передает код символа в программу, а эхо отсутствует. Переключение режима терминала осуществляется с помощью разряда 12 слова состояния программы, которое располагается в ячейке с абсолютным адресом 44. Если разряд 12 сброшен, имеет место обычный режим; если установлен — спецрежим.
Макрокоманда .TTYIN организует ожидание нажатия клавиши. После нажатия клавиши код символа передается в RO, а управление передается на следующую за .TTYIN строку программы. В дальнейшем по ходу программы код из RO можно проанализировать и в зависимости от его значения выполнить нужные действия.
В качестве аргумента макрокоманды .TTYIN может использоваться адрес буфера длиной в 1 байт. В этом случае код введенного символа заносится и в RO, и в указанный буфер.
Макрокоманда .TTYOUT выводит на экран терминала символ, код которого должен находиться к этому моменту в RO.
Задача 7.1. Приостановить выполнение программы в заданной точке. Разрешение на продолжение программы дается нажатием любой клавиши на терминале.
BIS # 10000,. @#44 ; установка спецрежима терминала
TTYIN ; ожидание нажатия клавиши
.
.
. ; продолжение программы
Задача 7.2 Вывести на экран символ "?"
BIS # 10000, @ # 44
MOV # 77, R0 ;код символа "?"
.TTYOUT
Задача 7.3 Вывести символ с клавиатуры в буфер. Высветить его на экране
BUF: BLKW 1
START: BIS # 10000, @ # 44
.TTYIN BUF
.TTYOUT
Макрокоманда .TTYIN организует синхронный ввод символа — выдав запрос на ввод, программа приостанавливается, пока ввод не будет завершен. Асинхронный ввод организуется макрокомандой
.TTINR. Для реализации этой возможности надо в слове состояния
программы установить разряд 6, который управляет запретом
ожидания терминала.
Пусть в программе встретились следующие строки:
BIS # 10100, @#44
.TTINR
Первой командой устанавливается спецрежим (разряд 12) и запрет ожидания (разряд 6). Если к моменту выдачи запроса на ввод какая-либо клавиша терминала была нажата и в кольцевом буфере ввода находился код символа, макрокоманда .TTINR передаёдает его в R0 и программа будет выполняться дальше. Если же буфер терминала пуст и макрокоманде .TTINR нечего вводить, программа сразу же начнет выполняться дальше (запрет ожидания включен), а макрокоманда сообщит о своем «неправильном» выполнении установкой разряда С слова состояния процессора. В случае необходимости пользователь может проанализировать своей программе состояние разряда С (командами ВСС или BCS) и организовать переход на те или иные метки в программе В В зависимости от результата анализа.
Задача 7.4. Ввести в буфер в программе пользователя код нажатой ранее клавиши с целью его анализа. Если же символ с клавиатуры ещё не введён, высветить на экране терминала сообщение "?" и ожидать ввод символа.
BIS # 10100,@ # 44 ;Установка спецрежима и запрет ожидания
.TTINR
BCS NOSYM ;символа нет
SYM: MOVB R0,BUF ;код в буфере BUF
.
. ;анализ введённого символа
.
NOSYM: MOV #77, RO ; код «?»
.TTYOUT ; вывод «?»
WAIT: .TTINR ; повторная попытка ввода
BCC SYM ; символ есть, переход на анализ
BR WAIT ; символа опять нет, повторение попытки
Организация файлов на магнитных дисках
Для записи данных на магнитный диск служит макрокоманда .WRITE с модификациями, а для чтения с диска — макрокоманда .READ с модификациями. Однако перед тем как передавать данные на диск, следует выполнить две вспомогательные операции: образовать на диске файл с определенным именем, т. е. выделить место под данные, и открыть канал передачи данных, связанный с этим файлом и идентифицируемый определенным номером. Канал представляет собой блок из 5 слов, размещаемый в смешанной области задачи. В этом блоке системой записывается информация, необходимая для передачи данных: размер файла и степень его заполнения, номер внешнего устройства, ссылки для определения физического имени устройства и имени файла и т. д. В смешанной области каждой задачи предусмотрено место для 1610 каналов. Если в программе требуется одновременно использовать более 16 каналов, то их число может быть увеличено с помощью программного запроса .CDFN. Место под дополнительные каналы выделяется в этом случае в программе пользователя (ср.. использование - программного запроса .QSET). Одновременно может существовать не более 255 каналов. Пока канал открыт, его можно использовать для связи с данным файлом — для записи, чтения или модификации данных. Обе операции — образование файла и открытие канала — выполняются с помощью одного программного запроса .ENTER.
Пусть в программе содержится макровызов
.ENTER #ARG, #0, #FILNAM,#4
Первый аргумент макровызова ARG представляет собой адрес области для аргументов, отведенной в программе пользователя. Следующий аргумент — номер канала. Он может быть любым числом от 0 до 255. Аргумент FILNAM является адресом области в программе пользователя, в которой содержится (в коде RADIX-50) полная спецификация файла, состоящая из имени ВУ, имени файла и расширения имени файла. Наконец, аргумент 4 указывает количество блоков по 256 слов, которые надо зарезервировать на диске. Таким образом, для нормального выполнения указанной макрокоманды в поле данных программы пользователя должны быть отведены области с именами ARG и FILNAM, например, следующим образом:
ARG: .BLKW 3 ; область для аргументов
FILNAM: .RAD50 /DKO/ ; имя устройства
.RAD50 /EXPDAT/ ; имя файла
.RAD50 /003/ ; расширение имени файла (номер версии)
Далее можно написать макрокоманду записи
.WRITW #ARG1, #0, #DATBUF, #1024., #0
Здесь первый аргумент представляет собой адрес области для аргументов; второй — номер канала, через который передается информация об именах устройства и файла; третий — адрес буфера с данными; четвертый — количество передаваемых слов и, наконец, пятый — относительный номер блока в файле, с которого надо начать запись.
В поле данных должны быть размещены области с именами ARG1 и DATBUF:
ARG1: .BLKW 4 ; область для аргументов
DATBUF: .BLKW 1024. ; буфер данных
Макрокоманда .WRITW, использованная в этом примере, обеспечивает синхронную передачу данных, т. е. приостанавливает программу до полного завершения вывода.
Задача 7.5 Образовать тестовый файл, представляющий собой 512 повторений кода буквы А. Вывести его на диск DK4 в область с именем TEST.
SYM: .ASCII /AA/
ARG: .BLKW 5
FILE: .BLKW 256. ; буфер данных
FILNAM: .RAD50 /DK4TEST/
START: MOV #FILE, R1
FILL: MOV SYM, (Rl) +
CMP Rl, #FILE+512.
BNE FILL
; буфер данных заполнен
.ENTER #ARG, #2, #FILNAM, #1
.WRITW #ARG, #2, #FILE, #256., #0
В этой задаче область с меткой ARG используется сначала макрокомандой .ENTER, затем макрокомандой .WRITW.
Для чтения файла с диска в оперативную память надо прежде всего открыть канал передачи данных. Если открытие канала для вновь образуемого файла осуществляется макрокомандой .ENTER, то для открытия канала связи с уже имеющимся файлом служит макрокоманда .LOOKUP:
.LOOKUP #ARG, #З, #DEV
Открывается канал номер 3 связи с файлом, спецификация которого приведена в области памяти с меткой DEV.
Макрокоманда чтения .READW имеет те же аргументы, что и макрокоманда .WRITW.
Задача 7.6. Прочитать с диска и высветить на экране дисплея файл, образованный в задаче 7.5.
ARG: .BLKW 4
FILE: .BLKW 256.
END: .WORD 0
FILNAM: .RAD50 /DK4TEST/ START: .LOOKUP #ARG, #б, #FILNAM .READW #ARG, #б, FILE, #256, #0
.PRINT #FILE
В этой задаче «пустое» слово с меткой END служит идентификатором конца текста для макрокоманды .PRINT. Следует заметить, что использование этой макрокоманды, как и вообще операции вывода на терминал, возможно лишь в том случае, когда файл содержит коды ASCII, как это и было предусмотрено задачей 7.5.
Вывод на печать
Вывод символьной информации на АЦПУ практически не отличается от вывода на диск. В качестве спецификации файла используется логическое имя печатающего устройства LP, после которого предусматривается «пустое» слово. Поскольку АЦПУ является устройством с «нефайловой» структурой, открытие канала производится макрокомандой .LOOKUP.
Задача 7.7. Вывести на печать текст из буфера.
TEXT: .ASCII /START OF RUN/
ARG: .BLKW 4
DEV: .RAD50 /LP/
.WORD 0
START: .LOOKUP #ARG, #0, #DEV
.WRITW #АRG, #0, #ТЕХТ, #б
Производится вывод по каналу 0 текста длиной 6 слов (12 байтов).
Работа с перфолентой
В принципе операции обмена информацией с перфолентой не отличаются от описанных выше. При этом надо иметь в виду, что в системе РАФОС с помощью макрокоманд ввода—вывода можно передать только четное число байтов.
Задача 7.8. Ввести с перфоленты в буфер 1024 строки. Поставив запрос на ввод в очередь, продолжить выполнение программы. По окончании ввода вывести на экран терминала текст "ввод закончен". Адрес подпрограммы завершения указывается в качестве последнего аргумента микрокоманды .READC.
START: .LOOKUP #ARG, #З, #PCN
.READC #АRG, #З, #ВUF, #512., #PRINT
.EXIT
PRINT: .PRINT #TEXT ; подпрограмма
.RTS PC ; завершения
ARG: .BLKW 5
TEXT:. .ASCIZ /ввод закончен/
.EVEN
PCN: .RAD50 /PC/
.WORD 0
BUF: .BLKW 1024.
Комплексный пример
В системах сбора и накопления информации часто приходится регистрировать большие объемы данных, поступающих непрерывным потоком. Стандартная методика заключается в том, что данные из физической установки накапливаются сначала в оперативной памяти, а по мере заполнения отведенного для них буфера перекачиваются на внешние носители - магнитные диски или ленты. Однако передача массива данных даже на диск, не говоря уже о ленте, требует значительного времени. Пока идет освобождение буфера, входные данные теряются. Устранить потери можно, используя два буфера: пока один буфер заполняется входными данными, из другого идет перекачка содержимого на внешний носитель. После заполнения первого буфера его содержимое выводится на внешний носитель, а входные данные тем временем поступают во второй буфер. В приведенной ниже программе проиллюстрирован этот метод. Предполагается, что для обслуживания модулей физической установки имеется нерезидентный драйвер с именем XX. В качестве внешнего носителя используется магнитный диск DK1, и общий объем экспериментальных данных, подлежащих регистрации, определен в 20010 блоков по 25610 слов. Для накопления данных в оперативной памяти выделены буферы BUF1 и BUF2:
.MCALL .ENTER, .FETCH, .LOOKUP
.MCALL .QSET, .READC, .WRITC, .EXIT
START: .ENTER #AREA, #2, #FILE, #200.
.FETCH #DRVADR, #DRVNAM
.LOOKUP #AREA, #3, #DRVNAM
.QSET #Q, #3
.READC #AREA, #3, #BUF1, #256., #RDFIN1
.READC #AREA, #3, #BUF2, #256., #RDFIN2
I$: CMP NBLK, #200.
BEQ STOP
BR 1$
STOP: .EXIT
RDFIN1: .WRITC #AREA, #2, #BUF1, #256., #WRFIN1, NBLK
INC NBLK
RTS PC
RDFIN2: .WRITC #AREA, #2, #BUF2, #256., #WRFIN2, NBLK
INC NBLK
RTS PC
WRFIN1: .READC #AREA, #3, #BUF1, #256., #RDFIN1
RTS PC
WRFIN2: .READC #AREA, #3, #BUF2, #256., #RDFIN2
RTS PC
AREA: .BLKW 4
FILE: .RAD50 /DK1DATAEX/
DRVNAM: .RAD50 /XX/
Q: .BLKW 7*3
NBLK: .WORD 0
BUF1: .BLKW 256.
BUF2: .BLKW 256.
DRVADR=
.END START
Программным запросом .ENTER на диске DKI резервируется область размером 20010 блоков и создается файл с именем DATAEX. Открывается канал с номером 2 для передачи данных на диск. Макрокомандой .FETCH драйвер физической установки XX загружается в отведенную ему в программе область с адресом DRVADR (в конце поля данных). Программным запросом .LOOKUP открывается канал номер 3 для связи с физической установкой. Поскольку в программе предполагается иметь четыре активных запроса на ввод—вывод (два на ввод в каждый из буферов и два на вывод из них), следует увеличить до 4 возможную длину очереди ввода—вывода. Это делается макрокомандой .QSET, в поле аргументов которой указывается адрес области памяти под элементы очереди (каждый элемент требует 7 слов).
Содержательная часть программы начинается двумя макровызовами .READC, которые устанавливаются друг за другом в очередь ввода—вывода. В первой макрокоманде указан буфер BUF1, во второй — BUF2. В соответствии с принципами работы драйвера первый запрос будет находиться в активном состоянии до тех пор, пока не будет завершен ввод указанного объема информации - 25610 слов (одного блока). Поскольку действия драйвера XX по вводу данных инициируются прерываниями от физической установки, данные могут поступать в любом темпе — периодически, сериями или случайно во времени. Запрос .READC организует асинхронную запись данных. Поэтому после установки обоих запросов в очередь программа продолжается. Три программные строки, начинающиеся с метки I$, организуют непрерывный опрос ячейки NBLK, в которой хранится (и наращивается) номер записываемого блока данных, и выход из программы через макрокоманду .EXIT, как только будет записано 200 блоков. После завершения ввода первого блока монитор передает управление подпрограмме завершения по адресу RDFIN1, а драйвер XX немедленно начинает обрабатывать следующий элемент очереди ввода - вывода, т. е. вводить данные в буфер BUF2, чем и достигается непрерывность ввода данных. Тем временем подпрограмма завершения ставит в очередь к драйверу диска запрос на вывод одного блока данных и содержимое буфера BUF1 начинает перекачиваться на диск. Как только вывод закончится, команда INC NBLK увеличит на единицу текущий номер блока и подпрограмма завершится командой RTS PC, передав, в свою очередь, управление подпрограмме завершения по адресу WRFIN1. Эта подпрограмма ставит запрос на ввод данных в буфер BUF1, после окончания которого снова активизируется подпрограмма завершения, RDFIN1, выводящая содержимое буфера BUF1 на диск. Аналогичная цепочка действий реализуется для буфера BUF2: после первоначального заполнения буфера инициируется подпрограмма завершения RDFIN2, организующая вывод содержимого буфера на диск, а после окончания вывода (и модификации текущего номера блока) запускается подпрограмма завершения WRFIN2, снова ставящая в очередь к драйверу ХХ запрос на ввод данных. После заполнения буфера опять инициируется подпрограмма RDFIN2 и т. д.
Модификация текущего номера блока после завершения передачи на диск очередного блока данных обеспечивает последовательную запись на диск данных точно в порядке их поступления из физической установки.
§ 7.4. СИСТЕМНЫЕ СРЕДСТВА ВЗАИМОДЕЙСТВИЯ ЗАДАЧ
При организации двухзадачного режима работы фоновая и оперативная задачи могут быть независимыми, а могут представлять единый программный комплекс. В последнем случае возникает необходимость передачи данных из одной задачи в другую. Обмен данных можно осуществить двумя способами: через файлы на диске либо при непосредственной передаче данных одной задачей и приеме их другой. Из-за того что макрокоманды передачи данных не используют драйверы, а реализуются непосредственно через RMON, они выполняются значительно быстрее макрокоманд ввода—вывода.
Непосредственная передача данных между задачами осуществляется с помощью пары макрокоманд .SDAT и .RCVD, а также их модификаций для синхронной передачи и для передачи по событию.
Программа, посылающая данные, выдает один из запросов .SDAT, .SDATW, .SDATC, а программа, принимающая эти данные, выдает запрос .RCVD, .RCVDW либо .RCVDC.
Рассмотрим пример передачи массива данных из оперативной задачи в фоновую. Пусть оперативная программа должна получить данные из физической установки и передать их в фоновую программу с целью, возможно, несрочной обработки и вывода на экран терминала для контроля. Обе программы написаны на МАКРОАССЕМБЛЕРе. Однако в этом языке нет простых средств вывода на печать чисел, поэтому в фоновую программу включен фортрановский модуль вывода чисел на экран терминала. Этот модуль оформлен как главная программа, а модуль на МАКРОАССЕМБЛЕРе — как подпрограмма:
; оперативная программа
.MCALL .EXIT, .SDATW
BUFFG: .BLKW 256.
START: . ; ввод данных из физической установки
.
.SDATW #AREA, #BUFFG, #256.
BR START
AREA: .BLKW 10
.END START
; фоновая программа
.MCALL .RCVDW, .PRINT
.PSECT DATA, D, OVR, GBL
BUFBG: .BLKW 257.
.PSECT
REС:: .RCVDW #AREA, #BUFBG, #256.
BCS ERR
RTS PC
ERR: .PRINT #TYРЕ
RTS PC
AREA: .BLKW 10
TYPE: .ASCIZ /RCVDW ERROR/
.EVEN
.END
:фоновая программа
:(фортрановский модуль)
COMMON /DATA/ N (257)
- CONTINUE
CALL REС
TYPE 2, N
2 FORMAT (1015)
GO TO 1
STOP
END
Рассматриваемый программный комплекс работает следующим образом. Пока оперативная программа ожидает ввода данных из физической установки и находится в заблокированном состоянии, работает фоновая программа (фортрановский модуль). Оператор CALL передает управление на метку REC, что приводит к выдаче программного запроса .RCVDW, блокирующего фоновую программу до получения данных из оперативной программы. Как только оперативная программа введет серию данных из физической установки, она выдает программный запрос .SDATW и после окончания передачи принятой серии данных в фоновую программу переходит на ожидание ввода из физической установки новой серии. Фоновая программа получает данные в буфер BUFBG (первое слово приемного буфера автоматически заполняется числом переданных байтов) и возвращает управление в фортрановский модуль, который выводит данные на экран терминала. Буфер BUFBG выделен в секцию DATA, объявленную с атрибутами D (данные), GBL (глобальная) и OVR (оверлей), что дает возможность использовать ту же область памяти в фортрановской программе, где объявлен COMMON-блок с тем же именем. Тем самым устраняется необходимость в передаче параметров из подпрограммы в основную программу.
§ 7.5. СИСТЕМНЫЕ СРЕДСТВА ОБСЛУЖИВАНИЯ ПРЕРЫВАНИЙ
Как правило, для экспериментальной аппаратуры, работающей на линии с ЭВМ, в составе операционной системы не имеется готового драйвера. Разработка такого драйвера — довольно сложная задача, поскольку требует хорошего знания операционной системы и средств системного программирования. Кроме того, для программного обеспечения экспериментальной аппаратуры часто нецелесообразно разрабатывать драйверы, так как их использование заметно замедляет передачу данных.
Более простой и рациональный путь — программирование нестандартных ВУ на физическом уровне так, как это описано (применительно к стандартным устройствам) в гл. 5. Однако при этом надо иметь в виду, что если ВК работает под управлением ОС, то прерывания от любых ВУ должны обрабатываться по определенным правилам, чтобы не вступить в конфликт с алгоритмами работы ОС. В частности, программа обработки прерываний должна выполняться в режиме системы. Для того чтобы пользователь мог не вникать в детали системного программирования, ОС содержит специальные системные макрокоманды, которые можно эффективно использовать при написании пользовательских программ обработки прерываний от нестандартного периферийного оборудования.
К системным макрокомандам обслуживания прерываний относятся две макрокоманды: .INTEN и .SYNCH.
Для того чтобы понять необходимость использования макрокоманды .INTEN в программах обработки прерываний, рассмотрим конкретный пример. Пусть в физической установке предусмотрено периодическое, с периодом Т, включение системы счетчиков и накопление в них отсчетов в течение времени экспозиции t (рис. 7.10). После окончания экспозиции отсчеты из счетчиков вводятся в оперативную память ЭВМ, а по истечении времени Т счетчики снова включаются на время t и т. д. Управляющая аппаратура должна состоять из двух таймеров, A и В. Таймер А периодически с интервалами Т включает счетчики и запускает таймер В. Последний по истечении времени t блокирует вход счетчиков и с помощью прерывания инициирует программу приема данных.
Рис. 7.10. Временная диаграмма эксперимента
Если интервал Т достаточно велик по отношению к длительности работы программы приема данных, значительную долю времени процессор будет простаивать и с целью повышения эффективности ВК целесообразно загрузить его какой-либо фоновой задачей.
Оперативная программа будет состоять в рассматриваемом случае из двух частей:
START: МОV#INT, @#140; адрес INT в вектор прерывания
МОV#340, @#142; приоритет 7 в вектор прерывания
.
.
.
.SPND ; блокировка задачи
.
.
.
.EXIT
INT: .
.
.
RTI
В основной части программы должен быть загружен вектор прерывания таймера В и запущен таймер А, после чего программу следует заблокировать макрокомандой .SPND с целью ожидания прерываний. Вторая часть программы, которая начинается с метки INT, представляет собой программу обработки прерываний (ПОП). В ней происходит съем данных со счетчиков в буфер оперативной памяти и подготовка таймера В к очередному циклу работы.
Следует отметить, что при необходимости использования в ПОП регистров общего назначения их предыдущее содержимое (до входа в ПОП) должно быть в начале ПОП сохранено, а перед выходом из ПОП восстановлено.
При запуске программного комплекса сначала в память загружается оперативная программа. Она запускает установку и блокируется в ожидании прерываний. Затем можно загрузить фоновую программу. Очередное срабатывание таймера В прервет фоновую программу, активизирует ПОП, а после ее завершения фоновая программа будет продолжена.
При разработке систем реального времени, в которых ЭВМ, как правило, одновременно управляет целым комплексом аппаратуры, возникает проблема оптимального выбора приоритетов подпрограмм, обслуживающих прерывания от различных модулей физической установки. Если данной ПОП присвоен наивысший приоритет 7, как это сделано в рассматриваемом примере, она не может быть прервана никаким другим ВУ и, следовательно, во всех случаях будет выполняться без помех до самого конца. Любое прерывание от физической установки будет ожидать завершения данной ПОП, которая, вообще говоря, может быть достаточно длинной. Длительная задержка в обработке прерывания может привести к искажению «ожидающих» данных. Для правильного взаимодействия всех устройств, подключенных к ЭВМ, их приоритеты (уровни прерывания) выбирают в соответствии с «важностью» того или иного устройства, а приоритеты ПОП обычно устанавливают равными приоритетами соответствующих ВУ. Часто ПОП включает в себя прием данных от ВУ в оперативную память и их предварительную обработку. В этом случае участку ПОП, производящему прием данных, полезно присвоить наивысший приоритет, чтобы процесс приема данных не мог быть прерван, а на участке предварительной обработки приоритет ПОП может быть снижен с целью ускорения обработки возможных прерываний от других элементов установки.
Снижение приоритета ПОП может привести к тому, что она будет прерываться драйверами других ВУ, в частности диска, который подключен к 5-му уровню прерываний. Если в фоновом разделе происходит частое обращение к диску, такое прерывание весьма вероятно. После завершения передачи данных между диском и оперативной памятью драйвер диска передает управление планировщику. Планировщик должен был бы вернуть управление назад в ПОП, однако ПОП принадлежит оперативной задаче, которая заблокирована макрокомандой .SPND . В соответствии с заложенным в него алгоритмом работы планировщик в этом случае передаст управление фоновой задаче, а окончание ПОП откладывается, что может привести к непоправимому сбою оперативной задачи.
Использование в ПОП программного запроса .INTEN исключает такую ситуацию. В результате выполнения этого запроса управление передается монитору, который переводит задачу в режим системы и тут же возвращает управление ПОП. Как уже отмечалось выше, в режиме системы запрещены любые переключения задач. Выполнение ПОП в режиме системы гарантирует вызов планировщика только после того, как завершится ПОП. Заметим, что в случае использования макрокоманды .INTEN ПОП должна заканчиваться командой RTS PC, а не RTI.
Между прочим, в результате выполнения запроса .INTEN происходит автоматическое сохранение содержимого регистров R4 и R5, что дает программисту возможность использовать их в ПОП. При выходе из ПОП их предыдущее содержимое автоматически восстанавливается.
С учетом сказанного программа INT должна быть написана следующим образом:
INT: .INTEN 4
.
.
RTS PC
Аргумент в макрокоманде .INTEN задает приоритет процессора, на котором фактически будет выполняться программа обработки прерывания. Как уже отмечалось, обычно приоритет процессора понижают до уровня прерывания, на котором работает данное ВУ.
Применение макрокоманды .INTEN влечет за собой определенные ограничения. Дело в том, что программа, выполняемая в режиме системы, не может использовать системные макрокоманды. Если же такая возможность должна быть предусмотрена, то ПОП кроме макрокоманды .INTEN должна содержать еще макрокоманду .SYNCH с соответствующим блоком аргументов. В результате выполнения этого программного запроса управление передается программе RMON, которая на основании блока аргументов для макрокоманды .SYNCH формирует элемент очереди подпрограмм завершения. После этого осуществляется выход из ПОП и управление передается планировщику, который должен запустить оперативную задачу или, если она заблокирована,— фоновую. Однако стоящая в очереди подпрограмма завершения имеет более высокий приоритет, чем любая задача, и планировщик прежде всего запускает ее. В качестве подпрограммы завершения в данном случае выступает та часть ПОП, которая стоит после макрокоманды .SYNCH. В результате ПОП продолжится уже не в режиме системы, а в режиме задачи на нулевом уровне приоритета, как нормальная подпрограмма завершения. Такая программа уже может использовать системные макрокоманды.
Предположим, что ПОП в рассматриваемом примере должна не только накопить данные, получаемые от счетчиков установки, но и передать образованный массив данных на диск для долговременного хранения. Структура программы будет выглядеть следующим образом:
START: .PROTECT #ARG,#140
.ENTER #ARG,#2,#FILE,#1
MOV #INT,@#140
MOV #340,@#142
.
.
.
.SPND
.EXIT
INT: .INTEN 4
.
.
.
INC NW
CMP NW,#256.
BEQ WRITE
RTS PC
WRITE: .SYNCH #SYNBLK
BR FIN
.WRITW #АRG,#2,#ВUF,#256,#0
RTS PC
FIN: .PRINT #MSG
RTS PC
ARG: .BLKW 4
FILE: RAD50 /DK0COUNT6DAT/
SYNBLK: .WORD 0, 2, 0, 0, 0, —1, 0
NW: .WORD 0
BUF: .BLKW 256.
MSG: .ASCIZ /ERROR SYNCH/
.EVEN
Макровызов .PROTECT служит для корректировки карты защиты памяти. Дело в том, что программа KMON, загружая фоновую задачу, записывает в начальные ячейки оперативной памяти (с 0-й по 476-ю) информацию из нулевого блока файла образа задачи. При этом содержимое векторов прерывания оперативной задачи может быть разрушено. Для защиты используемых векторов прерываний предусмотрена специальная таблица — карта защиты памяти. Эта таблица длиной 20 байт расположена в RMON. Каждый из 160 двоичных разрядов, входящих в таблицу, сопоставлен с определенным словом памяти в области векторов прерываний (ячейки 0—476). Установка разряда защищает соответствующий вектор прерывания, предохраняя его содержимое от разрушения при загрузке новой задачи. Некоторые ячейки автоматически защищаются монитором РАФОС (другими словами, соответствующие этим ячейкам разряды карты защиты устанавливаются самим монитором). Сюда относятся, например, векторы прерывания консольного терминала, системного устройства (НМД), системного таймера и др. Для того чтобы предохранить от разрушения используемые в задаче векторы прерывания, их надо защитить с помощью программного запроса .PROTECT. Этот запрос корректирует карту защиты памяти, закрепляя указанные в макровызове векторы прерывания за данной задачей и гарантирует их сохранность при загрузке и переключении задач.
Макровызов .ENTER образует на диске DK0 файл COUNT6DAT размером в 1 блок (25610 слов). Две следующие команды загружают в ВП с адресом 140 адрес ПОП и начальный приоритет ПОП, равный 7. Существенно, чтобы в процессе перехода на системный режим и передачи управления ПОП процессор имел наивысший приоритет. Это гарантирует от сбоев в работе ВК в случае прихода более приоритетного прерывания. В опущенной части основной программы содержатся строки инициализации модулей установки.
Программа обработки прерываний, начинающаяся меткой INT, содержит строки ввода данных и счета числа накопленных в буфере BUF слов. Как только буфер заполнится (NW = 256), происходит переход на метку WRITE и вывод на диск (макрокомандой .WRITW) накопленных данных.
Макрокоманда .SYNCH, как уже упоминалось, переводит оставшуюся часть ПОП в ранг подпрограммы завершения. Ее блок аргументов (метка SYNBLK) составляется по определенным правилам и используется планировщиком при постановке задачи в очередь подпрограмм завершения. Особенность использования макровызова .SYNCH заключается в том, что в случае его нормальной отработки управление передается не на следующую за макровызовом строку исходного текста, как это обычно бывает, а через одну строку (в приведенном примере в ней содержится макровызов .WRITW). Если же при выполнении запроса .SYNCH произошел какой-либо сбой, управление передается на следующую за макровызовом команду. Команда BR FIN в этом случае обеспечивает переход на метку FIN, выдачу на терминал сообщения «ERROR SYNCH», и возвращение в основную программу. Естественно, запись на диск в этом случае не выполняется.
КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 7
1. Где располагается стек оперативной задачи:
а) в мониторе;
б) вплотную к задаче со стороны меньших адресов;
в) в фиксированной области оперативной памяти?
2. Что такое свопинг:
а) попеременное использование одной и той же области оперативной памяти
задачей пользователя и программой обслуживания пользователя;
б) передача управления от фоновой к оперативной задаче и наоборот;
в) выгрузка на диск фоновой задачи и загрузка на ее место оперативной?
3. Что происходит, если при выполнении программного запроса обнаруживается
ошибка:
а) программа аварийно завершается;
б) устанавливается бит С ССП и выполнение программы продолжается;
в) на терминал выдается сообщение об ошибке?
4. Как диагностируются ошибки при выполнении программных запросов:
а) по содержимому слова состояния программы;
б) по содержимому слова состояния процессора;
в) по содержимому байта 52 системной области связи?
5. В каком случае требуется организовать дополнительные элементы очереди
ввода-вывода:
а) если в программе используется более одного программного запроса на ввод — вывод;
б) если происходит параллельное выполнение нескольких программных запросов
на ввод — вывод;
в) если в программе используются запросы на асинхронный ввод — вывод?
6. В каких случаях используются подпрограммы завершения:
а) если требуется выполнить какие-либо действия по завершению ввода — вы-
вода.
б) при завершении программы;
в) при завершении синхронного ввода — вывода?
7. Какой запрос на ввод — вывод следует использовать для вывода на терминал сообщения о завершении программы:
а) с ожиданием;
б) без ожидания;
в) с подпрограммой завершения?
8.В каких случаях используется программный запрос .SYNCH:
а) для синхронизации фоновой и оперативной задач;
б) если в программе обработки прерываний требуется обращение к средствам монитора;
в) для нормального завершения программы обработки прерываний?