Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6262.pdf
Скачиваний:
34
Добавлен:
13.02.2021
Размер:
6.54 Mб
Скачать

86

2.5 Лабораторная работа по теме №8

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

Методически, учебный материал данного раздела представлен:

2.5.1 — описывает обобщенную структуру процесса, теоретически обоснован-ную и реализованную в ОС UNIX;

2.5.2 — демонстрирует возможность контроля ряда сегментов процесса;

2.5.3 — закрепляет практическую работу с загрузкой и выгрузкой процессов, которая скрытым образом связана с распределением памяти ЭВМ;

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

Замечание

Весь изложенный учебный материал, в практическом плане, привязан к архитектуре ОС УПК АСУ.

Рабочая область приложений находится в директории /home/upk/lab8. Если такая директория отсутствует, то студенту следует обратиться к преподавателю для получения необходимых данных и инструкции по их установке.

В качестве среды разработки используется IDE Eclipse.

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

выйти из среды разработки Eclipse, если она еще запущена;

правой кнопкой мыши активировать меню значка EclipseC, расположенного на рабочем столе и выбрать пункт меню «Свойства...»;

отредактировать команду запуска, указав рабочую область среды Eclipse в директорию /home/upk/lab8;

закрыть окно «Eclipse — Свойства» и снова запустить среду разработки, которая должна содержать проекты лабораторной работы №8.

2.5.1 Структура поцесса

Как было отмечено ранее, основная память (ОП) или ее рассматриваемя часть ОЗУ занимает особое положение в плане теории и практики ее применения.

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

Чтобы конкретизировать сделанное утверждение, рассмотрим общую классическую структуру процесса ОС UNIX, показанную на рисунке 2.15.

87

Рисунок 2.15 - Структура виртуального адресного пространства процесса ОС UNIX

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

cегмент text - содержит машинные инструкции и константы; его содержание не изменяется при выполнения процесса;

сегмент data - содержит внешние и статические переменные, которые инициализированы, при компиляции программы процесса;

сегмент bss - содержит внешние и статические переменные, которые неинициализированы, при компиляции программы процесса;

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

Замечание

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

Когда процесс создан, то измение размера его сегментов осуществляется в случаях загрузки нового тела процесса. Если новое тело не загружается, то:

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

изменение размера сегментов данных осуществляется за счет сегмента BSS и, обычно, реализуется системными вызовами динамического распределения памяти brk(...) и sbrk(...);

изменение размеров сегментов стеков осуществляется автоматически, во время выполнения процесса.

Замечание

Считается, что ОС Linux придерживается идеологии ОС UNIX и, поэтому, должна иметь одинаковую структуру сегментов процесса.

На самом деле, - это не так, хотя общая идея выделения сегмента кода и сегмента данных + стека — присутствует.

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

88

для ОС УПК АСУ.

2.5.2 Определяемые сегменты процесса

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

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

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

Такими параметрами (внешними переменными) являются:

etext — первый адрес, следующий за последним адресом сегмента кода процесса (text segment);

edata — первый адрес, следующий за последним адресом сегмента инициализированных данных процесса (initialized data segment);

end — первый адрес, следующий за последним адресом сегмента не иници-

ализированных данных процесса (uninitialized data segment), известный также как BSS.

Чтобы подробно изучить назначение описанных выше внешних переменных, следует воспользоваться командой: man etext. Там же, приведены примеры их использования.

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

Листинг 2.1 - Пример вывода на печать переменных: etext, edata и end

#include <stdio.h> #include <stdlib.h>

// Внешние данные процесса, доступные из программы на языке С extern char etext, edata, end; /* The symbols must have some type,

or "gcc -Wall" complains */

int main(void) {

 

 

 

 

puts("Проект lab8.1");

 

 

 

printf("Первый адрес после:\n");

 

 

 

printf("

программного

текста

(etext)

%10p\n", &etext);

printf("

инициализированных

данных

(edata)

%10p\n", &edata);

printf("

неинициализированных данных

(end)

%10p\n", &end);

return EXIT_SUCCESS;

} // Конец листинга 2.1

Задание 2.1

С помощью утилиты man, провести изучение переменных: etext, edata и end.

В среде разработки Eclipse, создать проект с именем lab8.1, в котором набрать текст программы, руководствуясь текстом листинга 2.1.

Отладить и провести исследование работы полученной программы.

89 Отразить краткое описание работы данного примера в личном отчете.

Задание 2.2

Создать проект с именем lab8.2, в который скописовать текст листинга 2.1, затем - модифицировать скопированный текст, руководствуясь текстом листинга 2.2. Отладить программу и провести сравнительное исследование результатов. Отразить краткое описание работы данного примера в личном отчете.

Листинг 2.2 - Пример вывода с использованием определенных данных

#include <stdio.h> #include <stdlib.h>

// Внешние данные процесса, доступные из программы на языке С extern char etext, edata, end; /* The symbols must have some type,

or "gcc -Wall" complains */

char t1[] = "Всем привет!..."; char m1[0x100];

int main(void) {

 

 

 

 

puts("Проект lab8.2");

 

 

 

printf("Первый адрес после:\n");

 

 

 

printf("

программного

текста

(etext)

%10p\n", &etext);

printf("

инициализированных

данных

(edata)

%10p\n", &edata);

printf("

неинициализированных данных

(end)

%10p\n", &end);

return EXIT_SUCCESS;

} // Конец листинга 2.2

Замечание

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

В следующем подразделе, мы рассмотрим характеристики процессов 64-битных ОС Linux, которой также является ОС УПК АСУ.

Значения многих параметров процесса можно посмотреть непосредственно, используя возможности «просмотрищика» файлого менеджера «Midnight Commander». Пример такого просмотра, для программы проекта lab8.2, приведен на рисунке 2.16.

Замечание

Чтобы осуществить такой просмотр, следует запустить mc, затем войти в директо-рию /home/upk/lab8/lab8.2/Debug/, установить курсор на файл lab8.2 и нажать кла-вишу F3.

90

Рисунок 2.16 — Просмотр параметров программы проекта lab8.2

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