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

7.2 Задания к лабораторной работе

7.2.1 Система устраняет свободные участки памяти с помощью уплотнения. Предположим, что множество свободных участков сегментов данных распределены случайно, а время для чтения или записи 32-разрядного слова в памяти равно 10 нс. Сколько времени займет уплотнение 128 Мбайт памяти в худшем случае? Построить график времени уплотнения в зависимости от объема занятой памяти.

7.2.2 Компьютер имеет 32-разрядное адресное пространство и страницы размером 8 кбайт. Таблица страниц целиком поддерживается аппаратно, на запись в ней отводится одно 32-разрядное слово. При запуске процесса таблица страниц копируется из памяти в аппаратуру, одно слово требует 10 тс. Какая доля времени процессора жертвуется на загрузку таблицы страниц, если каждый процесс работает в течение 100 мс (включая время загрузки таблицы страниц)?

7.2.3 Используя командную строку, получить отчеты о распределении памяти в системе с помощью команды mem. Указанная команда предназначена для вывода информации о распределении оперативной памяти между загруженными программами. Выполнение команды без параметров выводит информацию об объемах свободной и занятой памяти. Ключ /program выводит информацию обо всех загруженных в память программах, включая системные программы. При ключе /debug в отчет включаются данные о внутренних системных драйверах. Просмотреть и проанализировать отчеты о распределении памяти всеми указанными способами.

7.3 Требования к отчету

Отчет по работе выполняется на бумажном носителе и должен содержать:

- задание к работе;

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

- снимки экрана с результатами работы;

- выводы по каждому заданию.

7.4 Контрольные вопросы

7.4.1 Какие способы распределения памяти используются в современных операционных системах?

7.4.2 Какие способы разделения используются при разделении оперативной памяти?

7.4.3 Какие способы разделения используются при разделении внешней памяти?

7.4.4 Что характерно для методов неразрывного распределения памяти?

7.4.5 Чем характеризуются методы непрерывного распределения и распределения с перекрытием?

7.4.6 Что характерно для методов разрывного распределения памяти?

7.4.7 Какую информацию можно получить с помощью Сведений о системе?

7.4.8 С какой целью используется файл подкачки?

7.4.9 Какую информацию о памяти позволяет получить утилита TaskList?

7.4.10 Как осуществляется изменение размера файла подкачки?

8 Лабораторная работа. Исследование механизмов работы с памятью

Цель работы: приобрести практические навыки использования

8.1 Общие сведения

ОС Windows может реализовать следующие механизмы работы с памятью:

1) виртуальную память для работы с большими массивами объектов или структур;

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

3) кучи – для работы с множеством малых объектов.

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

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

1) для загрузки и выполнения exe- и dll-файлов;

2) для получения доступа к файлу данных, размещенных на диске;

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

В процессе загрузки и выполнения ехе–файла используется функция CreateProcess и выполняются следующие действия:

а) отыскивается ехе-файл, указанный в вызове функции, если файл не найден, новый процесс не создается, а функция возвращает значение false;

б) если файл найден, создается новый объект ядра «процесс»;

в) создается адресное пространство процесса;

г) резервируется такой регион адресного пространства, чтобы в него поместился данный ехе-файл. Желательное расположение этого региона указывается внутри самого ехе-файла. По умолчанию базовый адрес ехе-файла 0х00400000;

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

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

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

Для С++-программ существуют два основных способа хранения информации в основной памяти:

1) использование переменных. Область памяти, предоставляемая переменным, закрепляется за ними во время компиляции и не может быть изменена при выполнении программы;

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

Система динамического распределения памяти – это средство получения программой некоторой области памяти во время ее выполнения.

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

высокая область адресов

Стек

Куча

Глобальные данные

нижняя область адресов

Код программы

Рисунок 8.1 – Размещение разделов в областях памяти

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

Оператор new, позволяющий динамически выделить область памяти, имеет вид:

переменная-указатель = new тип переменной;

Оператор delete, который освобождает ранее выделенную динамическую память, имеет вид:

delete переменная-указатель;

Пример 8.1 – Использование операторов new и delete в программах.

#include<iostream.h>

void main()

{int *p;

p=new int; //выделение памяти

*p=55; //в выделенную область помещается значение 55

cout<<*p<<endl; //значение выводится на экран

delete p;} //освобождение памяти

Пример 8.2 – Пример инициализации выделенной памяти.

#include<iostream.h>

void main()

{int *p;

p=new int(345); //инициализация памяти

cout<<*p<<endl;

delete p;}

Для выделении памяти для одномерного массива используется операция:

переменная-указатель = new тип [размер];

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

delete переменная-указатель;

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

Пример 8.3 – Пример использования динамической памяти при работе с одномерным массивом.

#include<iostream.h>

void main()

{int *p; int i;

p=new int [10]; //выделение памяти для массива

из 10 элементов

for(i=0;i<10;i++)

p[i]=10+i; //заполнение массива

for(i=0;i<10;i++)

cout<<p[i]<<" "; //вывод массива на экран

cout<<endl;

delete p; } //освобождение памяти

Существует несколько способов создания динамического массива. Наиболее универсальный способ – когда обе размерности массива задаются на этапе выполнения программы.

Пример 8.4 – Пример использования динамической памяти при работе с двумерным массивом.

#include<iostream.h>

void main()

{int nrow, ncol, i,j;

cout<<"enter count rows and columns"<<endl;

cin>>nrow>>ncol;

int**a=new int *[nrow];

for(i=0;i<nrow;i++)

a[i]=new int[ncol];

for(i=0;i<nrow;i++)

for(j=0;j<ncol;j++)

cin>>a[i][j];

for(i=0;i<nrow;i++)

{for(j=0;j<ncol;j++)

cout<<a[i][j]<<" ";

cout<<endl;}

cout<<endl;}