Сист. прогр. Ч1 (1085770), страница 2
Текст из файла (страница 2)
Рис.1.3. Пример распределения памяти при загрузке по фиксированным
адресам.
На рис. 1.3 представлен пример распределения памяти при этой негибкой схеме загрузки. На этом рисунке память изображена в виде линейного массива ячеек, а занимаемые программой области заштрихованы. Обратите внимание на то, что между программой 1 и подпрограммой SQRT расположен свободный участок памяти, а программа 2 перекрывает и поэтому разрушает часть подпрограммы SQRT.
Программисты хотели пользоваться такими подпрограммами, в которых связь с другими программами задается символически. Они считали неудобным иметь дело с конкретными адресами отдельных частей своих программ. Они полагали, что сама вычислительная система могла бы приписывать конкретные адреса их подпрограммам и подставлять эти адреса вместо символических ссылок.
Системные программисты заметили, что было бы удобно, если бы подпрограммы транслировались в такую форму объектной программы, что загрузчик мог разместить их непосредственно после программы пользователя. Настройка программ, позволяющая помещать их в произвольном месте памяти, называется перемещением. Настраивающие загрузчики выполняют четыре функции:
1. Выделение в памяти места для программ (распределение памяти).
2. Разрешение символических ссылок между объектными программами (редактирование связей).
3. Настройка всех адресозависимых величин, таких, как адресные константы, в соответствии с адресом выделенной для программы области памяти (перемещение).
4. Физическое помещение машинных команд и данных в память (загрузка).
Разные типы загрузчиков, которые будут рассмотрены в этой книге («компиляция-выполнение», абсолютный, настраивающий, непосредственно связывающий, динамически загружающий и динамически связывающий), различаются главным образом способом выполнения этих четырех функций.
Время, в течение которого выполняется программа пользователя, называется временем выполнения. Время трансляции исходной программы пользователя называется временем ассемблирования или компиляции. Термин время загрузки определяет время, затрачиваемое на загрузку и приготовление объектной программы к выполнению.
МАКРООПРЕДЕЛЕНИЯ
Для того чтобы освободить программиста от необходимости повторно писать идентичные части программы, в операционных системах предусматриваются средства, позволяющие программисту задавать сокращенные названия определенных частей программы и использовать эти сокращения вместо соответствующих частей программы. Макропроцессор рассматривает идентичные части программы, поименованные сокращениями, как макроопределения и сохраняет их, подставляя определение вместо сокращения (макрокоманды, макровызова) при каждом его появлении в программе.
Помимо того, что макросредства помогают программисту сократить программы, они используются как универсальные обработчики текстов и для приспособления операционных систем к конкретной конфигурации вычислительной установки. В последнем случае (генерация системы) операционная система в целом записывается в виде ряда макроопределений.
Для выполнения генерации конкретной конфигурации операционной системы пишут соответствующий набор макрокоманд.
Они обрабатываются макропроцессором, в результате чего в систему подставляются необходимые определения, в совокупности составляющие все программы операционной системы.
КОМПИЛЯТОРЫ
Постепенное разделение задач по областям применения, таким, как наука, экономика и статистика, привело к разработке специализированных языков (языков высокого уровня), позволяющих легко и компактно описывать решаемую задачу. Тексты, написанные на этих языках, например ФОРТРАНе, КОБОЛе, АЛГОЛе, ПЛ/1, Паскале, С, С++ обычно обрабатываются программами одного из двух типов: компиляторами или интерпретаторами. Результатом работы компилятора является объектная программа. Интерпретатор непосредственно выполняет исходную программу, предложение за предложением, как если бы ее язык был языком машины. Часто и компилятор, и связанный с ним язык называют одинаково (ФОРТРАН, КОБОЛ и т. д.).
Современные компиляторы должны обеспечивать в полном объеме те услуги, которые требуются сейчас программистам. Компиляторы должны обеспечивать сложные методы доступа для указательных переменных и структур данных, используемых в языках, подобных КОБОЛу, Паскалю, С, С++. Они также должны тесно взаимодействовать с операционной системой для того, чтобы обрабатывать операторы, управляющие прерываниями вычислительной машины (например, условные операторы в Паскале).
ФОРМАЛЬНЫЕ СИСТЕМЫ
Формальная система есть неинтерпретированное исчисление. Она состоит из алфавита, множества слов, называемых аксиомами, и конечного множества отношений, называемых правилами вывода. Примерами формальных систем являются теория множеств, булева алгебра, системы Поста и Бэкусова нормальная форма. Формальные системы приобретают все большее значение при разработке, реализации и изучении языков программирования. В частности, они могут использоваться при описании синтаксиса (формы) и семантики (значений) языков программирования. Они нашли применение в синтаксически управляемой компиляции, проверке правильности компиляторов и изучении сложности языков.
ЭВОЛЮЦИЯ ОПЕРАЦИОННЫХ СИСТЕМ
Еще несколько лет назад пользователь, написавший программу на ФОРТРАНе, подходил к ЭВМ с колодой карт, представляющей собой компилятор с ФОРТРАНа, и с собственной колодой программы. Затем он действовал следующим образом:
1. Помещал компилятор с ФОРТРАНа (зеленую колоду) в приемный карман и нажимал кнопку загрузки. ЭВМ загружала компилятор.
2. Помещал колоду с программой на исходном языке в приемный карман, после чего компилятор с ФОРТРАНа выполнял трансляцию этой программы в программу на машинном языке, которая выводилась на перфоратор в виде колоды красных карт.
3. Обращался в архив за розовой колодой перфокарт, озаглавленной «загрузчик», и помещал ее в приемный карман, после чего программа-загрузчик загружалась в память.
4. Помещал полученную в результате трансляции объектную колоду в приемный карман, после чего загрузчик загружал ее.
5. Помещал в приемный карман колоды подпрограмм, обращение к которым содержится в основной программе. Загрузчик загружал эти подпрограммы.
6. Наконец, загрузчик передавал управление программе пользователя, которая могла потребовать ввода дополнительных перфокарт с необходимыми для решения задачи данными.
Эта система разноцветных перфокарт была не вполне удовлетворительна, и имелись достаточно серьезные мотивы для перехода к более гибкой схеме. Одно из соображений заключалось в том, что дорогое машинное время пропадало зря, когда машина простаивала во время обработки карт и между заданиями (задание — это отдельная заданная работа, например ассемблирование программы). Для исключения простоев была разработаны средства пакетирования заданий, позволяющие помещать в приемный карман для считывания сразу несколько заданий. Задача пакетирования работ решается с помощью операционной системы пакетной обработки. Например, система пакетной обработки могла бы выполнить упомянутые выше шаги с первого по шестой, извлекая компилятор и загрузчик с внешнего запоминающего устройства.
По мере возрастания потребностей в машинном времени, в выделяемой для задачи памяти, числе и типах устройств и наборов данных эффективное управление этими ресурсами становилось все более важной задачей. Далее рассмотрим различные методы управления ими. Эти ресурсы представляют собой большую ценность, и неэффективное их использование может стоить очень дорого. Методы управления каждым из ресурсов развивались по мере того, как возрастали стоимость и сложность его использования.
В простых системах пакетной обработки вся память выделяется для единственной программы. Если программе не требуется вся выделенная память целиком, часть этого ресурса не используется. Для устранения такого рода потерь были созданы операционные системы с организацией памяти разделами, обеспечивающие мультипрограммный режим работы. Мультипрограммирование позволяет нескольким программам находиться одновременно в отдельных областях памяти. Программам выделяются разделы, размеры которых фиксированы (мультипрограммирование с фиксированным числом задач — MFT) , или разделы памяти, размеры которых определяются динамически (мультипрограммирование с переменным числом задач — МVТ).
Часто в системах с организацией памяти разделами некоторые участки памяти не могут быть использованы, так как слишком малы и не могут вместить подлежащую обработке программу. Возникновение таких «дыр», или неиспользуемых участков памяти, называется фрагментацией. Фрагментация была
сведена к минимуму методом переместимых разделов (Burroughs 6500) и страничной организацией памяти (XDS940, HIS 645). Применение метода переместимых разделов обеспечивает объединение всех неиспользуемых участков в один раздел и уплотнение области памяти, отведенной остальным разделам.
Страничная организация памяти подразумевает деление программы на равные части, или страницы, и деление памяти на равные части, или блоки. Страницы загружаются в блоки.
Различают два метода страничной организации—простой и по запросам. При простой организации все страницы программы при ее выполнении должны находиться в памяти. При организации по запросам для выполнения программы нет необходимости держать в памяти все страницы, они помещаются в память по мере необходимости.
Как уже упоминалось, вычислительная система с несколькими процессорами называется мультипроцессорной. Действие процессоров и процессов координирует регулировщик потоков. Время процессора распределяется программой, называемой планировщиком. Процессор, связанный с выполнением операций ввода-вывода, называется процессором ввода-вывода, а составление программ для этого процессора — программированием ввода-вывода.
Массивы данных как ресурсы управляются и выделяются файловой системой (системой управления данными). Группа информации, которая с точки зрения пользователя представляет собой единое целое, называется сегментом. Файлы являются сегментами. Существуют два типа файлов; (1) оглавления (индексы), (2) данные или программы. Оглавления содержат информацию о местонахождении других файлов. В иерархических файловых системах оглавления могут содержать ссылки на другие оглавления, которые в свою очередь могут указывать на оглавления или файлы второго типа.
Разделение времени — один из методов распределения времени процессора. Обычно этот метод характеризуется интерактивной обработкой (множественным доступом к системе) и квантованием времени центрального процессора с целью обеспечения малого времени реакции системы на запросы каждого из пользователей.
Виртуальная память (математическая память, адресное пространство) содержит все адреса, которые могут генерироваться процессором во время выполнения вычислений. Пространство памяти состоит из множества адресов, соответствующих ячейкам физической памяти. Метод сегментации обеспечивает большое адресное пространство и хороший механизм защиты. Защита и разделение (совместное использование) методы обеспечения управляемого доступа к сегментам.
ОПЕРАЦИОННАЯ СИСТЕМА С ТОЧКИ ЗРЕНИЯ ПОЛЬЗОВАТЕЛЯ. ФУНКЦИИ СИСТЕМЫ
С точки зрения пользователя операционная система (управляющая программа) предназначена для оказания ему помощи в организации процесса решения задач. В частности, система выполняет следующие функции:
1. Упорядочение заданий, планирование и регулирование.
2. Программирование ввода-вывода.
3. Защита системы от пользователей, защита пользователей друг от друга.
4. Управление внешней памятью.
5. Обработка ошибок.
Пусть задание одного пользователя требует для своего выполнения четыре часа машинного времени, а задание другого четыре секунды. Если оба задания были переданы одновременно, представляется разумным четырехсекундное задание пропустить первым. На основе критериев подобного рода операционная система автоматически планирует выполнение заданий. Если оказывается возможным, как это имеет место в многомашинных системах, осуществление операций ввода и вывода одновременно с выполнением программы, такой режим реализуется под управлением регулировщика.