Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3501

.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
6.07 Mб
Скачать

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

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

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

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

Можно выделить следующие варианты дифференцированной защиты при различных операциях с памятью:

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

Задается одно из следующих отношений к области памяти собственной программы:

-разрешается доступ к данному блоку как для записи, так и для считывания;

-разрешается только считывание;

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

-разрешается обращение по адресу из любого регистра, кроме счетчика команд.

Если нарушается защита памяти, исполнение программы приостанавливается и вырабатывается запрос прерывания по нарушению защиты памяти.

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

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

например, в составе АСУ ТП, необходимо обеспечить возможность отладки

240

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

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

7.9.2. Метод граничных регистров Идея метода состоит в том, что вводят два граничных регистра,

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

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

 

Схема

x

 

Прерывание

 

 

 

 

 

 

 

сравнения

 

Память

 

 

 

x

 

 

 

 

 

 

 

 

РгН

 

 

 

 

РгА

 

Разрешение

N ячеек

 

обращения

 

 

 

 

 

+ N

 

 

 

 

 

РгВ

x

+ N

 

 

 

 

 

Схема

 

 

 

 

 

сравнения

 

 

Разрешенная

 

 

x > + N

 

Прерывание

область памяти

РгН - регистр нижней границы; РгВ - регистр верхней границы;

- адрес нижней границы допустимой зоны обращений; N - количество ячеек разрешенной зоны памяти

Рис. 99. Защита памяти с помощью граничных регистров

241

РгН – регистр нижней границы; РгВ – регистр верхней границы;

– адрес нижней границы допустимой зоны обращений; N – количество ячеек разрешенной зоны памяти.

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

7.9.3. Метод ключей защиты По сравнению с предыдущим данный метод является более гибким. Он

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

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

Метод ключей защиты не исключает использование метода контрольного разряда для защиты отдельных ячеек памяти и метода граничных регистров для защиты отдельных зон памяти. В современных ЭВМ эти методы часто используются совместно и тесно переплетаются.

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

-Проверка атрибутов доступа (ключей защиты) перед предоставлением возможности обращения к памяти.

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

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

242

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

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

Межуровневое

распространение ошибок, предотвращаемое системой

Задача А

Ядро (Р=0)

Системный сервис (Р=1)

Прикладной сервис (Р=2)

Прикладные программы (Р=3)

Задача С

Задача В

Межзадачное распространение ошибок, предотвращаемое проверкой атрибутов доступа

Рис. 100. Система защиты памяти ЭВМ на процессоре I80386

Функционирование изображенной структуры можно проиллюстрировать следующим примером. Пусть данные хранятся на уровне P=2. Тогда доступ к ним возможен для программ, находящихся на уровнях P=2, 1 или 0. Для программ с P=3 они недоступны. Аналогично программа прикладного сервиса с P=2 может быть вызвана сегментами или процедурами, находящимися на уровнях P=2, 1 или 0, но не на уровне P=3.

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

243

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

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

7.10. Алгоритмы управления многоурвневой памятью

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

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

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

Q = {1,2, …, k}.

244

Все страницы программы постоянно хранятся в памяти нижнего уровня, а, кроме того, r из них могут находиться в памяти верхнего уровня (оперативной памяти), при этом

1 < r < k.

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

q0, q1, q2, …, qt,

где qt – случайная дискретная величина, принимающая в момент времени t значение одного из номеров страниц программы (qt Q).

Если St – совокупность страниц в памяти верхнего уровня в момент t, причем в любой момент в этой памяти присутствует r страниц программы, то изменение состояния памяти верхнего уровня после обращения qt описывается следующими соотношениями:

St 1

St ,

 

если qt

St

St

v t

qt , если qt

St .

 

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

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

страница vt

St для удаления из памяти верхнего уровня, – алгоритмом

замещения.

 

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

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

245

уровня следует удалить страницу, к которой обращений больше не будет (вероятность обращений в будущем равна 0).

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

Алгоритмы замещения можно разделить на две группы:

физически нереализуемые, использующие информацию (реально отсутствующую) о потоке обращений в будущие моменты времени;

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

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

Физически нереализуемые алгоритмы Алгоритм Михновского-Шора. При каждом замещении страницы из памяти

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

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

Таким образом, алгоритм Михновского-Шора реализует минимально возможную для данной программы последовательность замещений, поэтому этот алгоритм называют МИН-алгоритмом.

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

Физически реализуемые (эвристические) алгоритмы замещения

Был предложен ряд алгоритмов этого класса.

Алгоритм случайного замещения (СЗ-алгоритм). При возникновении страничного сбоя из памяти верхнего уровня с равной вероятностью отсылается любая из находящихся там страниц.

246

НДИ-алгоритм. Из памяти верхнего уровня отсылается страница, наиболее давно использовавшаяся.

Алгоритм "первый пришел – первый ушел" (ПППУ-алгоритм). Отсылается страница, дольше других находившаяся в памяти верхнего уровня.

Алгоритм "последний пришел – первый ушел". Отсылается страница, позже других поступившая в память верхнего уровня.

Следующие два алгоритма обладают определенными свойствами адаптации к потоку обращений к памяти.

Алгоритм "карабкающаяся страница" (КС-алгоритм). Страницы в памяти верхнего уровня образуют последовательность:

St j1, j2 , ..., jm 1, jm , jm 1,..., jr .

При очередном обращении qt к памяти эта последовательность изменяется по правилу:

 

St ,

 

 

при qt

j1;

St 1

j1, j2

,...,jm , jm 1,...,jr ,

при qt

jm , m 1;

 

j1, j

2

,...,jr 1,qt ,

при qt

St .

При обращении к странице jm, присутствующей в памяти верхнего уровня, последняя меняется местами с соседней слева страницей, другими словами, "карабкается" к началу последовательности, подальше от ее конца, куда происходит замещение при страничном сбое. Этот процесс иллюстрирует схема на рис. 101.

Память

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j

 

j

 

 

 

 

jm-1

jm

jm+1

 

 

jr-1

jr

верхнего

1

2

уровня

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

qt S t

Память нижнего уровня

Рис. 101. Алгоритм замещения "карабкающаяся страница"

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

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

247

-очередь страниц, в которые вносились изменения.

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

При этом сначала подлежат замещению страницы из первой очереди. Описанный алгоритм использовался еще в компьютерах IBM-360/370. Предположим, что последовательность обращений q1, q2, …, qt соответствует последовательности независимых случайных дискретных величин, таких что

k

 

P qt j pj , 1 j k ,

p j 1.

j

1

Примем за состояние процесса замещения набор (а в некоторых случаях упорядоченную последовательность) страниц, находящихся в памяти верхнего уровня. Тогда для ряда алгоритмов замещения (СЗ, НДИ, ПППУ и некоторых других) процесс изменения состояния верхнего уровня описывается однородной конечной эргодической цепью Маркова, что указывает на существование стационарных вероятностей пребывания процесса в определенных состояниях и, как следствие этого, стационарных вероятностей страничных сбоев.

В качестве критерия эффективности Wr,k алгоритма замещения А примем стационарную вероятность страничных сбоев:

Wr,k A limP qt St .

t

Можно для ряда алгоритмов замещения найти зависимость Wr,k от p1, p2, …, pk и сравнить алгоритмы между собой, а также с физически нереализуемым ОПТ-алгоритмом. Определить Wr,k для ряда алгоритмов можно, используя метод, основанный на однородных эргодических цепях Маркова.

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

248

Такой механизм позволяет ускорить процесс подкачки страниц при повторном обращении.

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

7.11. Сопроцессоры

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

команд, в которых нуждается тот или иной пользователь.

 

Наиболее

распространенной

разновидностью

дополнительного

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

Для использования команд, реализуемых сопроцессором в современных процессорах (в частности, 32-разрядных), предусматривается командная маска. Она представляет собой группу резервных кодов операции, которая идентифицируется процессором по заданному набору значений определенных битов кода. В остальных битах кода операции определяется конкретная дополнительная операция.

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

249

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]