Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_ОС.doc
Скачиваний:
44
Добавлен:
14.02.2015
Размер:
506.88 Кб
Скачать

2.2.2. Связывание информации

Как правило, при написании программы в явном или неявном виде используются виртуальная адресация (подразд. 3.7). Чаще всего пространство виртуальных адресов определяется разрядностью центрального процессора n: 2П. Но бывают редкие исключения. Одно из них относится к тому периоду развития машин семейства IBM PC, когда они были 16-разрядными. 64 кб адресуемого пространства было явно мало для поддержки «дружелюбного к пользователю» интерфейса. В этом пространстве не могла разместиться, например, даже одна интегральная среда разработки программ Turbo СИ. Это адресуемое пространство удалось расширить за счет двойного обращения при вычислении адреса к ЦП, что привело к существенному замедлению вычислительного процесса. В процессоре 8086 (фактически первом из этой серии) оно было расширено до 220 и на первых моделях совпадало с объемом физической памяти. Кстати, последующие успехи в построении аппаратных средств сделали такое решение не только не нужным, но и «вредным», определив на долгие годы в качестве основного режима реальный режим. Более того, необходимость поддержки 16-разрядных приложений ОС для машин этого типа, судя по всему, доставила бы много хлопот разработчикам. В частности, в Windows 95 эта поддержка сыграла не последнюю роль в организации многочисленных «пробоин» в этой ОС. Поэтому в данной ситуации отступление от правил больших дивидендов не принесло.

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

  • указатель независимо от размера объекта имеет фиксированную длину;

  • указатель может использоваться для контроля доступа (например, для подсчета количества доступов);

  • через указатель можно осуществить доступ к другому объекту без компиляции (т. е. динамически изменить цепь доступа);

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

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

Создание программы. На этапе написания программного продукта связывание информации можно осуществить, если прибегнуть к приемам «старины глубокой» и создать эту программу непосредственно в машинных кодах.

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

Однако машинные коды являются аппаратно-зависимыми. Поэтому требуют знания команд конкретного процессора и непереносимы на другую машину.

Трансляция. На этапе трансляции исходный программный код преобразуется в объектные коды. Существует два типа трансляторов: компиляторы и интерпретаторы.

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

Интерпретаторы переводят с языка программирования в коды, понятные машине, по одной «фразе», конец которой в классическом понимании определяется нажатием клавиши «Enter». К языкам, имеющим интерпретаторы, относятся, например, Бейсик и Java. На этапе интерпретации осуществляется связывание информации. В этом плане зависимость от различных платформ проявляется существенно в меньшей степени. Именно это обстоятельство определило популярность языка Java. Однако этой популярности предшествовало увеличение быстродействия аппаратных средств, так как переносимость возможна только на уровне исходных модулей, и каждый раз перед выполнением производится связывание информации, что приводит к некоторому замедлению этого процесса.

Линковка. При линковке на основе откомпилированных программ строится исполняемый файл. Это единственный этап обработки, на котором не происходит связывание данных.

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

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

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