Автоматизация

Вид материалаДокументы

Содержание


Диспетчер памяти и страничная организация
Директивы управления памятью и передачи данных
Виртуальное адресное окно
Rdb1: rdbbk $ 768., reg1, gen
Wdb: wdbbk $ 1,768.,0,0,768.
Mov rdb1 + r.gid? wdb+w.nrid
Mcall rdbbk $ rdbd
Psect data
Vsect = data:20000:49152.
Mcall rdbbk $, rdbdf $, wdbbk $ , wdbdf $ , setf $ с
Mov rdb1+r.gid, wdb+w.nrid
Psect data
Psect datar
Vsect = datar : 40000 : 49152. wndws = 1
Rdbr: rdbbk
Mov wdbr+w.nrid,rdbr+r.gid
Разделяемые районы
Common /ped/m(10)
Stack = о
Set/top = gen:-1
...
Полное содержание
Подобный материал:
1   ...   17   18   19   20   21   22   23   24   25
§ 8.5. УПРАВЛЕНИЕ ПАМЯТЬЮ


Диспетчер памяти и страничная организация

Принятая для конкретной ЭВМ длина машинного слова и регистров общего назначения определяет диапазон адресов, которые могут использоваться в задаче и соответственно ее максимальный размер. Для 16-разрядных машин типа СМ-4 максимальный адрес, который может быть записан в машинном слове или РОН, составляет 177776 = 64К. Поскольку при выполнении задачи в конечном счете происходит обращение ко всем ее адресам, размер любой задачи вместе с данными не должен превышать 64К байт или 32К слов. При работе на ЭВМ «Электроника-60», в которых отсутствует аппаратура диспетчера памяти, максимальный размер задачи еще меньше. Дело в том, что последние 4К слов адресного пространства отводятся под адреса регистров внешних устройств. В распоряжении программиста остается только 28К слов адресного пространства. Поэтому размер задачи вместе с данными, так же как и размер оперативной памяти на этих машинах, не может превышать 28К слов. Если ЭВМ укомплектована оперативной памятью общим-объемом 32К слов, то последние 4К слов памяти не используются, если же в задаче пользователя встречается обращение к адресам с 160000 по 177776, процессор интерпретирует эти адреса как адреса регистров внешних устройств (или внутренних регистров процессора).

Обычно допустимый размер задачи пользователя еще меньше. Действительно, часть оперативной памяти и соответственно, часть адресного пространства заняты резидентными программами операционной системы. Например, монитор РАФОС вместе с основными программами обслуживания пользователя занимает около 8К слов памяти. Если же условия проведения эксперимента требуют реали­зации оперативно-фонового режима, когда в оперативной памяти одновременно находятся две задачи пользователя, на каждую из них приходится еще меньшая часть адресного пространства.

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

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

Виртуальные адреса — это некоторые условные адреса, назначаемые строкам загрузочного модуля (образа задачи) компоновщиком. Обычно образ задачи состоит из заголовка, в который заносится служебная информация о характеристиках задачи, стека задачи и собственно области задачи, в которую входят программные строки и поля данных (рис. 8.6). Компоновщик начинает отсчет виртуальных адресов образа задачи от нуля. Таким образом, заголовок задачи начинается с адреса 0, стек задачи, например, с адреса 222, и если стек занимает 25610 слов, то собственно программа пользователя начинается с адреса 1222. При этом, поскольку компоновщик обрабатывает все программы одинаково, загрузочные модули всех скомпонованных задач имеют одинаковые виртуальные адреса.

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

Рассмотрим рис. 8.7. Первая задача Т1 длинной 32К слов занимает все возможное пространство виртуальных адресов от 0 до 177776. Она получила смещение 100000 и занимает в памяти физические адреса с 100000 по 277776. Задача Т2 такой же длины имеют виртуальные адреса, также начинающиеся с нуля, но, получив в диспетчере памяти смещение 300000, она занимает физические адреса с 300000 по 477776. Наконец, задача ТЗ длиной 4К свое размещена в памяти, начиная с адреса 540000.

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

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

Страницей называют область адресного пространства (виртуального или физи­ческого) размером 4К слов или менее. Минимальный размер страницы —32 слова.




Рис. 8.6. План загрузочного модуля (слева указаны виртуальные адреса)




Рис. 8.7 Размещение в памяти нескольких задач (слева указаны виртуальные адреса задач, справа — физические адреса оперативной памяти)




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


Виртуальные страницы начинаются с адресов, кратным 4К: 0, 20000, 40000 и т. д. Для физических страниц это ограничение отсутствует. Полное виртуальное пространство задачи, таким образом, состоит из восьми страниц по 4К слов каждая. За каждой виртуальной страницей однозначно закреплен один из РАС: РАС 0 отображает нулевую виртуальную страницу (с виртуальным адресом 0), РАС 1 — первую страницу ( с виртуальным адресом 20000) и т. д.

На рис. 8.8 показан возможный вариант отображения задачи. Первые пять РАС содержат нулевое смещение и соответственно первые 20К слов виртуального пространства задачи отображаются на неразрывную область в самом начале оперативной памяти, РАС 5 и РАС 6 содержат смещение 310000, что обеспечивает размещение в памяти 5-й и 6-й виртуальных страниц задачи, начиная с адреса 430000. Наконец, последняя виртуальная страница задачи через РАС 7 отображается на страницу ввода-вывода, обеспечивая возможность обращения к регистрам ВУ. Приведенное на рис. 8.8 отображение характерно для привилегированных задач, которые через РАС 0—4 имеют доступ к системным управляющим программам и таблицам.

Загрузка любой задачи в оперативную память связана с отображением ее виртуальных адресов на физические. Обычно этим процессом управляет операцион­ная система, которая назначает смещения для каждой задачи таким образом, чтобы задачи не накладывались в памяти друг на друга. Однако в некоторых практически важных случаях программисту при написании программы приходится вмешиваться в процесс отображения: определять номера используемых РАС, задавать размер и содержание виртуальных страниц и т. д. К таким случаям относятся, например, организации управления нестандартными ВУ, создание комплексов взаимодействую­щих программ реального времени, расширение адресного пространства задачи за пределы 32К слов и др.

Написание таких программ требует знания изложенных выше вопросов.


Директивы управления памятью и передачи данных

Директивы управления памятью дают возможность:

расширять адресное пространство задачи за пределы 32К. слов;

передавать массивы данных из задачи в задачу, если задачи образуют связный программный комплекс;

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

Для работы с директивами управления памятью необходимо освоить понятия окон и районов.

Виртуальное адресное окно представляет собой область виртуальных адресов, отображаемую на связную область памяти. Окно может включать одну или несколь­ко виртуальных страниц. Минимальный размер окна соответствует минимальному размеру страницы и составляет 32 слова, максимальный соответствует восьми полным страницам и составляет 32К слов (строго говоря, 32К слов - 32 слова). Так же, как и виртуальные страницы, виртуальные окна должны начинаться на границе 4К слов. Таким образом, каждая задача содержит от одного до восьми окон, причем количество окон определяется количеством раздельных областей памяти, на которые отображается задача. Так, на рис. 8.7 все задачи содержат по одному окну. Задача на рис. 8.8 содержит три окна. Окна нумеруются от 0 до 7, при этом идентификатор 0 всегда имеет окно, содержащее заголовок задачи, ее стек и корневой сегмент задачи, т. е. часть задачи, постоянно находящуюся в памяти.

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

Рассмотрим на примере возможности динамического управления памятью.

Пусть задача TASK.1 (рис. 8.9) должна принять из физической установки дан­ные и записать их в порядке поступления (без сортировки) в оперативную память. Общий объем принимаемых данных составляет 48К слов, что превышает допусти­мый объем виртуального пространства. Пусть далее задача TASK2 должна обработать принятые данные, например, сгруппировать их по определенным признакам. Сгруппированные данные занимают 4К слов. Результат группировки выводится на магнитный диск.

Разделим виртуальное пространство задачи TASK1 на два окна: окно 0 размером 4К слов, в которое входит заголовок задачи и программные строки приема данных и записи их в память, и окно 1 размером 24К слов под массив прини­маемых данных. Окно 0 отображается на район 0 автоматически при загрузке задачи в память. Задача, начав выполняться, производит отображение окна 1 на район REQ1, увеличив пространство доступных ей физических адресов до 28К слов. После этого задача начинает принимать данные и располагать их по последовательным виртуальным адресам окна 1. Фактически данные записываются в память в район REG1. Приняв половину данных и заполнив район REG1, задача отображает то же пространство виртуальных адресов на новый район REG2 (отображение на район REG1 аннулируется) и продолжает располагать принимаемые данные по тем же виртуальным адресам окна 1. Эти данные фактически записываются в район REG2. В результате задаче TASK1 оказываются доступными в общей сложности 52К слов оперативной памяти —4К слов под программу и 48К слов под данные. Эти 52К слов образуют логическое пространство задачи.




Рис. 8.9. Использование окон и районов для увеличения адресного пространства задачи е передачи данных из задачи в задачу




Рис. 8.10. Блок описания района (слева указаны символические смещения)


Приняв данные, задача TASK1 активизирует задачу TASK2 и передает ей характеристики созданных ею районов. Виртуальное пространство задачи TASK2 также разделено на два окна. Окно 0 содержит кроме программы еще и поле данных объемом 4К слов под результат группировки. Окно 1 размером 24К слов служит для последовательного отображения на созданные задачей TASK1 районы REG1 и REG2 и обработки содержащих в них данных. После группировки данных из обоих районов задача TASK2 ликвидирует районы, освобождая оперативную память для других нужд, и передает сгруппированные данные из своего района 0 на магнитный диск. Пока длится эта операция, задача занимает лишь 8К слов оперативной памяти.

Для получения фактического доступа к району оперативной памяти задача должна последовательно выполнить следующие действия:
  1. создать район. В физической памяти отводится запрошенное пространство с заданными атрибутами (имя, способ доступа и т. д.);
  2. прикрепить задачу к району. Созданный район включается в логическое пространство задачи;
  3. создать окно. Заданная область виртуальных адресов задачи включается в создаваемое виртуальное адресное окно с заданными атрибутами;
  4. отобразить окно на район. Диспетчер памяти устанавливает соответствие виртуальных адресов, входящих в окно, физическим адресам созданного района. Задача получает возможность работать с содержимым оперативной памяти в пре­делах района.

Все указанные действия выполняются с помощью системных директив управле­ния памятью. Многообразие функций этих директив и необходимость обмениваться большим количеством параметров требует специальных средств связи задачи пользователя и управляющих программ системы. Эти средства связи создает поль­зователь в виде двух структур: блока описания района (БОР) и блока описания окна (БОО). Эти блоки располагаются в поле данных задачи и снабжаются метками. Указание соответствующей метки в поле параметров используемой директивы позволяет передавать ей всю информацию, содержащуюся в блоке описания. Поскольку БОР и БОО находятся в поле данных задачи пользователя, их содержи­мое можно по мере необходимости уточнять и модифицировать.

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

БОР создается обычно с помощью специальной директивы RDBBK $ , в поле параметров которой пользователь указывает значения полей данных БОР. Рассмот­рим пример создания БОР для задачи TASK1 (см. рис. 8.9):


RDB1: RDBBK $ 768., REG1, GEN, < RS.ATT!RS.WRT!RS.RED >, 177400


Директива RDBBK $ резервирует восемь слов памяти, начиная с метки RDB1, и заполняет их указанными значениями параметров.

Первое слово БОР остается пустым. Значение идентификатора района заносится сюда системой после фактического создания района в памяти.

Параметр 768. обозначает размер района в блоках по 32 слова. 76810 блоков соответствует 24К слов.

Параметры REG1 (имя района) и GEN (раздел памяти, в котором надлежит создать район) записываются в соответствующие поля БОР в коде RADIX-50.

Комбинация символических параметров в угловых скобках определяет статус района и записывается в виде условного кода в слово статуса БОР. Параметр RS.ATT указывает, что при создании района директивой CRRG $ должно произойти автоматическое прикрепление задачи к району. Если этот параметр не указан, то после создания района директивой CRRG $ следует прикрепить к нему задачу директивой ATRG $ . Параметры RS.WRT и RS.RED определяют способ доступа к району. Первый параметр разрешает запись в район, второй — чтение из района. Кроме указанных существуют и другие параметры доступа, например разрешение удаления района. Наконец, последний численный параметр определяет слово защиты района. Код защиты образуется следующим образом. Разряды 0—3 слова защиты характеризуют доступ к району операционной системе, разряды 4—7 — доступ пользователю, разряды 8-11 - группе, в которую входит пользователь, и разряды 12—15 —доступ всем остальным пользователям (рис. 8.11). В каждой четверке разряды обозначают (справа налево): разрешение чтения, записи, расши­рения и удаления. Установленный разряд указывает на запрещение доступа, сброшенный — на разрешение. Использованный в рассматриваемом примере код 177400 (он изображен на рис. 8.11) разрешает все виды доступа к району только системе и пользователю. Остальным пользователям все виды доступа запрещены. Изменяя содержимое слова защиты, можно, например, объявить район доступным всем пользователям для чтения и записи (код174400) или только для чтения (код 167400) либо дать все виды доступа всем пользователям данной группы (код 170000) и т. д.



Рис. 8.11. Слово защиты района


Блок описания окна (рис. 8.12}, так же как и БОР, состоит из восьми слов.

Создается БОО с помощью директивы WDBBK $ :


WDB: WDBBK $ 1,768.,0,0,768.,


Первый параметр указывает номер РАС, используемого для отображения окна (или первой страницы окна, если окно включает в себя несколько страниц). В примере на рис. 8.9 все программные строки задачи' TASK1 расположены на нулевой странице в окне 0, а строки данных занимают страницы 1—6 (окно 1). В этом случае базовым РАС для отображения окна 1 будет РАС 1. В задаче TASK.2 в окно 0 включены две страницы (0 и 1), окно 1 начинается со страницы 2 и базовым РАС будет РАС 2. Директива WDBBK заносит указанный номер РАС в старший байт первого слова БОО. Младший байт этого слова остается свободным. Система заполнит его идентификатором окна после создания окна (впрочем, он известен заранее и равен в нашем примере 1).

Второе слово БОО, предназначенное для виртуального базового адреса окна, остается свободным. Его заполнит система после создания окна (этот адрес тоже известен —он равен 20000).

Параметр 768. указывает размер окна в блоках по 32 слова. Размер окна в нашем примере равен размеру района, но вообще говоря, окно может быть и меньше района.

Третий параметр директивы WDBBK $ должен содержать идентификатор района, на который будет отображено данное окно. Однако этот идентификатор пользователю неизвестен. Его можно будет получить из соответствующего слова БОР после того, как район будет создан директивой CRRG $ , например, следующей программной строкой:


MOV RDB1 + R.GID? WDB+W.NRID


Четвертый параметр директивы WDBBK $ определяет смещение окна относительно начала района (в блоках по 32 слова). В нашем примере это смещение равно нулю, однако предусмотрена возможность отображать окно (если его размеры меньше размера района) на различные участки района) на различные участки района.

Пятый параметр 768. определяет размер области отображения (отображать можно часть окна).

Наконец, комбинация символических параметров в угловых скобках определяет статус окна. Параметр WS.RED разрешает задаче TASK2 чтение данных из района. При передаче задаче TASK2 района с данными с помощью программного запроса SREF $ ей также будет передан и способ доступа к этим данным. В рассматриваемом примере задаче TASK2 будет разрешено только чтение. Добавление параметра WS.WRT разрешит ей также и запись в район. Параметр WS.MAP не имеет отношение к передаче данных. Он требует автоматического отображения окна на район в процессе создания окна директивой CRAW $ . Если этот параметр не указан, то после создания окна надо его отобразить директивой MAP $ .





Рис. 8.12. Блок описания окна(слева указаны символические смещения)



.MCALL RDBBK $ RDBD $ , WDBBK $ , WDBDF $

.MCALL CRRG $ C CRAW $ C, MAP $ C, EXIT $ S

.PSECT

RDB1: RDBBK $ 768..REG1, GEN, ,177400

RDB2: RDBBK $ 768.,REG2,GEN,, 177400

WDB: WDBBK $ 1,768.,0,0,768.,

; созданы блоки описания обоих районов

; и окна

START: CRRG $ С RDB1; создание района REG1 и прикрепление к нему задачи

CRRG $ С RDB2; создание района REG2 и прикрепление к нему задачи

MOV RDB1+R.GID, WDB+W.NRID; передача идентификатора района

в БОО

CRAW $ С WDB ; создание окна и его отображение на REG1


; строки ввода данных и их записи в память

; в последовательные слова, начиная

; с метки MAS (в район REG1)


MOV RDB2+R.GID, WDB+W.NRID ; передача в БОО идентификатора

; района REG2

MAP $ С WDB ; отображение окна на REG2


; строки ввода данных и их записи в память,

; начиная с метки MAS (в район REG2)


EXIT $ S

.PSECT DATA


MAS: .BLKW 24576.

.END START


Программа, создающая и заполняющая районы REG1 и REG2, выглядит следующим образом (см. пред. стр.).

В первых строках программы в поле параметров директивы АССЕМБЛЕРа .MCALL указываются все системные директивы, которые будут встречаться в тексте программы. При использовании директив RDBBK $ и WDBBK $ в список систем­ных директив следует включить вспомогательные директивы RDBDF $ и WDBDF $ , которые неявно используются системой при создании БОР и БОО.

Текст программы содержит две секции. Первая (непоименованная) секция включает в себя ту часть программы (а именно программные строки), которая войдет в район задачи и будет отображена через окно 0. В секции DATA зарезерви­рованы 24К слов для записи данных. Эта секция будет отображаться через окно 1 сначала на район REG1, а затем на район REG2.

Метки RDB1 и RDB2 характеризуют блоки описания районов REG1 и REG2 соответственно. Блоки отличаются только именами районов REG1 и REG2. Метка WDB характеризует блок описания окна.

Выполняемая часть программы начинается с метки START. С помощью директивы CRRG $ создаются районы REG1 и REG2. Информацию о характеристи­ках районов директива берет из БОР, адрес которого указывается в качестве параметра директивы. Одновременно задача прикрепляется к этим районам, как это было затребовано параметром RS.ATT в БОР. Далее идентификатор района REG1 передается из БОР в БОО. Директива CRAW $ с адресом БОО в качестве параметра создает окно и одновременно отображает его на район REG1, поскольку в БОО записан параметр WS.MAP. На этом подготовительная часть программы заканчивается. Массив MAS отображен на физическую память района REG1 и любые обращения к виртуальным адресам этого массива (например, MAS, MAS+2, MAS+4 и т. д.) приведут к записи информации в район REG1.

После того как массив MAS (и, соответственно, район REG1) заполнен, задача должна снять отображение окна 1 на район REG1 и заново отобразить это окно на район REG2. Соответствующей программной строкой идентификатор района REG2 передается в БОО и издается директива MAP $ с указанием в качестве параметра адреса БОО. Эта директива отображает окно на район, при этом, если окно уже было отображено, управляющие программы ОС снимают старое отображение, перед тем как выполнить новое.

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

Для того чтобы секцию DATA можно было использовать в качестве отобра­жаемого виртуального пространства, ее надо объявить виртуальной и начать на границе 4К слов. Назначение секциям тех или иных атрибутов и виртуальных адресов производится компоновщиком, для чего ему надо передать соответствующую информацию с помощью опций. В данном случае используются опции VSECT и WNDWS:


VSECT = DATA:20000:49152.

WNDWS = 1


Опция VSECT объявляет секцию виртуальной. В качестве параметров опции указывается имя секции, требуемый виртуальный адрес ее начала и длина в байтах. Опция WNDWS задает количество окон, создаваемых в задаче дополнительно к окну 0. В данном случае создается дополнительно одно окно.

Рассмотренная программа в приведенной редакции, естественно, лишена смысла, так как записанные в память данные никак не используются и безвозвратно теряются после завершения задачи программным запросом EXIT $ S.

Рассмотрим теперь пример программного комплекса, соответствующего рис. 8.9. Для того чтобы передать в задачу TASK2 характеристики районов с данными, следует воспользоваться директивами SREF $ и RREF $, а также синхронизировать выполнение задач с помощью, например, флагов событий.

Программный запрос SREF $ образует пакет, содержащий характеристики передаваемого района (идентификатор района, смещение относительно начала района и размер области отображения и т. д.), а также имя пересылающей задачи. Этот пакет ставится в специальную очередь приема по отсылке к приемной задаче, где и находится до тех пор, пока приемная задача не выдаст запрос RREF $ . В очереди могут быть несколько пакетов, поэтому не требуется очень жесткой синхронизации передачи и приема данных — передающая задача, подготовив данные, устанавливает соответствующие пакеты в очередь к приемной задаче и продолжает выполнять далее. Приемная задача, когда она будет готова к этому, последовательно забирает пакеты из очереди запросами RREF $ и обрабатывает передаваемые данные.

Выполнение программного запроса SREF $ приводит к автоматическому прикреплению приемной задачи к передаваемому району. В результате, даже если передающая задача завершится, данные не будут потеряны. Район не может быть удален из памяти, пока к нему прикреплена какая-либо задача.

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

Исходный текст передающей задачи будет выглядеть (см. с. 300—301(ниже)).

Работа программного комплекса начинается с запуска приемной задачи TASK2. Задача сбрасывает глобальный флаг 33, создает виртуальное окно и блокируется в ожидании отработки задачи TASK1. Затем запускается задача TASK1. Она создает районы REG1 и REG2, заполняет первый район REG1 данными и ставит первый пакет со ссылкой на район REG1 в очередь к задаче TASK2 (это можно сделать, так как задача TASK2 активна). Затем задача TASK1 отображает окно на второй район, заполняет его данными и ставит в очередь к приемной задаче второй пакет со ссылкой на район REG2. После этого она устанавливает глобальный флаг 33, чем разблокирует приемную задачу, и завершается.

Приемная задача (см. с. 301) программным запросом RREF $ забирает из очереди первый пакет, отображает свою виртуальную секцию с массивом MASR на район REG1 и начинает группировать получаемые оттуда данные. Закончив обработку данных из REG1, задача повторно выдает запрос RREF $ , что приводит к получению из очереди второго пакета и отображению виртуальной секции с массивом MASR на район REG2. Обработав данные из этого района, задача передает результат своей работы (содержимое массива OUT) на магнитный диск и завер­шается.

В исходном тексте приемной задачи есть характерные особенности. Так, в БОО с меткой WDBR определены только два параметра: номер РАС и размер окна. Этой информации достаточно для создания окна запросом CRAW $ . Информация же, требуемая для отображения окна (идентификатор района, смещение относительно начала района и размер области отображения), передается в БОО из пакета, полученного из передающей задачи. Оттуда же берется содержимое статусного слова.


.MCALL RDBBK $, RDBDF $, WDBBK $ , WDBDF $ , SETF $ С

.MCALL CRRG $ C, CRAW $ C, MAP $ C, SREF $ C, RREF $ С

.PS ЕСТ

RDB1: RDBBK $ 768., REG1, GEN,,177400 RDB2: RDBBK $ 768., REG2, GEN,, 177400.,

WDB: WDBBK $ 1,768.,0,0,768.,

START: CRRG $ C RDB1 ; создание района REG 1

CRRG $ C RDB2 ; создание района REG2

MOV RDB1+R.GID, WDB+W.NRID

CRAW 3 С WDB ; создание окна и отображение на REG I


; строки ввода данных


SREF $ С TASK2, WDB ; передача первого пакета

MOV RDB2+R.GID, WDB+W.NRID

MAP $ С WDB ; отображение окна на REG2


; строки ввода данных

SREF $ С TASK2, WDB ; передача второго пакета

SETF $ С 33. ; установка глобального флага 33

EXIT 3 S

.PSECT DATA

MAS: .BLKW 24576.

.END START


Исходный текст прием­ной задачи:


.MCALL WDBBK $, WDBDF $ , WTSE $ С, CRAW $ С

.MCALL RREF $ C, EXIT $ S, MAP $ С

.PSECT

WDBR: WDBBK $ 2,768.

STARTR: CLEF $ С 33. ; сброс глобального флага 33

CRAW $ С WDBR ; создание окна без отображения

WTSE $ С 33. ; ожидание установки флага

; задачей TASK1

RREF $ C WDBR ; получение первого пакета

MAP $ С WDBR ; отображение окна на REG1


; обработка данных из массива

; MASR (из района REG1) и

; запись результата в массив OUT


RREF $ С WDBR ; получение второго пакета

MAP $ С WDBR ; отображение окна на район

; REG2


; обработка данных из массива MASR

; (из района REG2) и запись результата

; в массив OUT

; передача данных из массива OUT на

; магнитный диск

EXIT $ S

OUT: .BLKW 4096.

.PSECT DATAR

MASR: .BLKW 24576.

.END STARTR


В непоименованной секции приемной задачи зарезервирован массив OUT под результат группировки размером 4К слов. В результате размер секции наверняка превысит 4К слов и виртуальная секция DATAR должна начинаться на границе 8К слов и ослов и отображаться через RАС 2, что и указано в БОО с меткой WDBR.

При компоновке задачи TASK2 компоновщику надо задать следующие опции:


VSECT = DATAR : 40000 : 49152. WNDWS = 1


Рассмотренный программный комплекс будет неэффективно использовать оперативную память. Действительно, во время работы части программы, органи­зующей вывод на магнитный диск, районы будут продолжать существовать, хотя необходимость в них к этому моменту уже отпала. Для того чтобы ликвидировать районы и освободить память, можно использовать директиву DTRG $ , которая открепляет задачу от указанного района и удаляет район из памяти, если данное открепление было последним (т. е. не осталось задач, прикрепленных к району). Динамическое освобождение памяти потребует некоторого изменения приве­денных программ. Список параметров БОР, определяющих статус района в задаче TASK1, следует дополнить параметром RS.DEL, разрешающим удаление района. Статус окна надо дополнить параметром WS.DEL, который разрешает удаление района приемной задаче. После окончания работы с районами в задаче TASK1 и передаче ссылок в задачу TASK2, можно выдать программные запросы


DTRG $ С RDB1

DTRG $ С RDB2


которые открепят задачу TASK1 от районов. Поскольку перед этим были выполнены запросы SREF $, автоматически прикрепившие к районам задачу TASK2, открепление от них задачи TASK1 не приведет к их уничтожению.

В приемной задаче надо создать «фиктивный» БОР, адрес которого указывается в качестве параметра директивы DTRG $. БОР создается директивой RDBBK $ :


RDBR: RDBBK $,,,


Параметр RS.MDL разрешает удаление района из памяти при последнем открепле­нии. После получения ссылки на район REG1 в БОР надо занести идентификатор района:


MOV WDBR+W.NRID,RDBR+R.GID


Теперь выдача запроса DTRG $ С RDBR открепляет задачу TASK2 от района REG1 и уничтожает район, так как это открепление было последним. Аналогично уничтожается район REG2.

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

Представим себе, что данные из экспериментальной установки вводятся в случайные моменты времени, как это часто и бывает на практике. Тогда задача TASK1 должна работать в режиме прерываний. Как известно, задача, связанная с вектором прерывания, становится невыгружаемой. Поэтому задачу TASK1 целесообразно сделать как можно короче, чтобы она не занимала место в памяти. Рассмотренный вариант TASK1 удовлетворяет этому требованию: в нем выполняются только минимально необходимые действия по приему данных из установки и передаче их в оперативную память. Вся обработка данных возложена на задачу TASK2, которая до получения данных находится в заблокированном состоянии и, следовательно, может быть выгружена на диск. Более того, задача TASK2 не обязательно должна быть активизирована одновременно с задачей TASK1. В этом случае задача TASK1, получив экспериментальные данные, программным запросом RQST $ С TASK2 запускает задачу TASK2 в нужный момент времени.

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

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


Разделяемые районы

В предыдущем разделе описывалась методика динамического создания, передачи и удаления районов памяти. Использование динамических районов полезно, когда задачи работают с большими массивами данных (в том числе больше 32К), которые с целью более эффективного использования оперативной памяти создаются по ходу выполнения задачи лишь на время работы. Часто, однако, возникает необходимость иметь общие для ряда задач массивы данных, постоянно находящиеся в памяти, так, чтобы их существование не зависело от хода обращающихся к ним задач. В таких разделяемых районах могут храниться некоторые константы, например ядерно-физические характеристики нуклидов, используемые при расшифровке сложных спектров гамма-излучения, или результаты градуировки аппаратуры; в этих случаях данные записываются в разделяемый район заранее, а задачи обращаются к ним только для чтения. Другой пример использования разделяемого района – запись в него текущих характеристик аппаратуры, периодически измеряемых одной из оперативных задач. Остальные задачи могут пользоваться этими данными для коррекции результатов измерений, автоматической градуировки и т. д.

Рассмотрим простой пример использования разделяемого района. Пусть установка имеет 10 амплитудно-цифровых преобразователей (АЦП) с ненулевым выходом в отсутствие сигнала (пьедестал). Каждый АЦП измеряет амплитуду сигнала от отдельного детектора в некотором эксперименте на ускорителе. Точное измерение амплитуд приходящих от детектора сигналов требует учета пьедесталов АЦП, значения которых изменяются со временем («плывут»). Поэтому в программном комплексе предусмотрена задача Т1, периодически (в промежутках между сбросами ускорителя) считывающая значения пьедесталов и помещающая их в разделяемый район PED. Задача сбора данных Т2 считывает отсчеты АЦП, вычитает из них хранящиеся в PEDтекущие значения пьедесталов и накапливает их с целью дальнейшей записи на диск.

Для создания в памяти разделяемого района PED нужно прежде всего оттранслировать и скомпоновать задачу, в которой нет ни заголовка, ни стека, ни программных строк, а имеется лишь секция данных с именем PED (сама задача также должна носить имя PED). Пусть разделяемый массив содержит всего 10 целых чисел. Исходный текст программы на ФОРТРАНе состоит из двух строк:


COMMON /PED/M(10)

END


При компоновке объектного модуля этой задачи компоновщику требуется передать командную строку

PED / PI, TI :, SY : PED / -Н = PED


Этой строкой задается создание образа задачи с именем PED, вывод карты загрузки на терминал пользователя T1:, запись таблицы определения символов (файл PED.STB) на системное устройство SY:. Ключ /PI придает образу задачи необходимый атрибут «позиционно-независимый» (созданный район может в различных задачах отображаться на различные области виртуальных дисков); ключ/ - Н лишает задачу заголовка. Далее компоновщику надо задать следующие опции:


STACK = О

PAR = PED : 0 : 100


Опция STACK в данном случае лишает образ задачи стека, опция PAR определяет раздел в оперативной памяти, в который компонуется данная задача. Виртуальный базовый адрес раздела устанавливается равным 0, а его длина — 1008 байт, что составляет 3210 слова (длина раздела задается в блоках по 32 слова).

Для физического размещения района PED в памяти требуется перенести верхнюю границу системно-управляемого раздела GEN на один блок:


SET/TOP = GEN:-1


Затем надо создать главный раздел с именем PED:


SET / MAIN = PED : 7377 : 1 : COM


Раздел начинается с физического адреса 737700, имеет длину 32 слова (1 блок) и объявлен разделяемым (СОМ).

Наконец задачу PED можно установить в системе (в разделе с тем же именем PED):


INS PED/ PAR = PED


Все программы, в которых имеется общий блок вида


COMMON /PED/ 1(10)


(если программа написана на ФОРТРАНе), либо программная секция длиной 10 слов с именем PED и атрибутами RW, D, GBL, REL и OVR (если про­грамма написана на АССЕМБЛЕРе), могут быть прикомпонованы к созданному району с помощью опции компоновщика RESCOM:


RESCOM = PED/RW




Рис 8.13. Отображение за­дач на разделяемый район


На рис. 8.13 показано отображение двух задач Т1 и Т2, скомпонованных с разделяемым районом PED. Обе задачи имеют нулевой начальный вирту­альный адрес и отображаются в память через РАС 0; отображение на район RED происходит через РАС 7, и соответствующие программные секции в задачах начинаются с виртуального адреса 160000. Если задачи невелики, часть виртуальных адресов не используется.

Вернемся к рассматриваемому примеру. Пусть задача Т1 работает в режиме прерываний, запускаясь в какие-то моменты времени между сбросами ускорителя, Считав значения пьедесталов, она записывает их сначала в буфер, находящийся в ПОП, а затем, перейдя на уровень асинхронных системных прерываний (АСП), переписывает в общий блок (секцию) PED, после чего данные остаются в оперативной памяти в разделяемом районе. Задача Т2 также работает в режиме прерываний, инициируясь сигналами готовности АЦП. Приняв код из АЦП, задача переходит на уровень АСП, вычитает из принятого кода текущее значение соответствующего пьедестала и, выполнив, если нужно, необходимую сортировку и обработку, запи­сывает результаты измерений на диск.

Переход с уровня прерываний на уровень АСП необходим потому, что в режиме прерываний (см. § 8.6) нельзя обратиться к разделяемому району. Это ограничение требует введения в каждой задаче промежуточного буфера для приема данных из установки.


§ 8.6. УПРАВЛЕНИЕ НЕСТАНДАРТНЫМИ ВНЕШНИМИ УСТРОЙСТВАМИ В РАМКАХ ОПЕРАЦИОННОЙ СИСТЕМЫ


При создании программ и программных комплексов, управляющих нестандартными ВУ, например аппаратурой КАМАК, не всегда оправдано создание соответствующих драйверов. Написание и отладка драйвера требуют хорошего знания системы ввода - вывода, структуры и функций монитора, изучения специальных требований, предъявляемых к драйверу, и являются весьма трудоемкими процес­сами. Вместе с тем конфигурация аппаратуры реального времени часто подвержена изменениям, которые влекут за собой корректирование программы драйвера. Поэтому во многих случаях более целесообразно создание программ управления процессами реального времени, взаимодействующих непосредственно на физическом уровне с тем или иным набором аппаратных средств. При этом желательно, чтобы вся задача в целом по-прежнему работала под управлением ОС. В зависимости от конфигурации ВК, такое программирование имеет свои особенности.