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

Особенности внутреннего представления программы и ее исполнения 9*

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

Организация памяти компьютера

Все данные, хранящиеся в памяти компьютера, представляются в двоичной системе счисления в виде машинных словнаборов двоичных разрядов (совокупность битов – нулей и единиц). Биты объединяются в последовательности: байты, слова и т.д. Минимальный размер машинного слова для хранения, обработки и передачи данных – 8 битов (1 байт). Все остальные слова кратны ему. Стандартное машинное слово имеет разрядность, соответствующую разрядности процессора (32 разряда или 4 байта).

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

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

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

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

Рис. 1.6. Организация памяти компьютера

Сегментация программы

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

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

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

Процессор имеет в своем составе набор машинных слов – регистров. В зависимости от назначения они могут хранить как данные, так и адреса памяти. Сегментация поддерживается в процессоре при помощи регистров двух видов. Базовый регистр сегмента содержит его начальный адрес. Регистры, работающие с данными сегмента, содержат относительный адрес данных от начала сегмента, или смещение. Результирующий адрес получается путем сложения содержимого этих регистров. Таким образом, каждый сегмент имеет собственную «систему координат», связанную с его началом (Рис.1.7). Если программа использует только сегментную адресацию, то сегменты можно перемещать по памяти при сохранении работоспособности программы: достаточно перенастроить соответствующие им базовые регистры.

Выполняемая программа состоит из нескольких сегментов. Некоторые из них создаются при трансляции, другие – при загрузке и при работе программы. В принципе, программа может иметь несколько сегментов одного вида:

Сегмент

Регистры

Что содержит

Когда создается

Сегмент команд

CS- сегментный, IP- адрес команды

Программный код (операции, операторы)

трансляция

Сегмент данных

DS – сегментный

Глобальные (статические) данные

трансляция

Сегмент стека

SS – сегментный, SP– указатель стека

Локальные данные функций, «история» работы программы

при загрузке

Динамическая память

DS – сегментный

Динамические переменные, создаваемые при работе программы

при загрузке, выполнении

Динамически связываемые библиотеки (DLL)

CS– сегментный, IP– адрес команды

Программный код разделяемых библиотек

при загрузке

Рис. 1.7. Сегментация программы

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