Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
спиос-методичка-часть2.doc
Скачиваний:
15
Добавлен:
13.04.2015
Размер:
266.75 Кб
Скачать
    1. Контрольные вопросы и задания

  1. Поясните принцип многозадачности современных операционных систем.

  2. Чем отличается многозадачность от многопоточности?

  3. Каким образом аппаратно решаются задачи обеспечения многозадачности?

  4. Приведите примеры использования многопоточности в прикладных программах.

  5. Каким образом осуществляется синхронизация потоков?

  6. Что такое "критический раздел"?

  7. Что такое "событие"?

  8. Объясните назначение локальной и глобальной памяти потоков.

  1. Управление распределением памяти (win api)

    1. Цель работы

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

    1. Указания по подготовке к выполнению лабораторной работы

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

При подготовке к работе необходимо изучить конспект лекций по указанной теме, методические указания, а также разделы, указанные в [16, c.763-809], [17, c.59-87].

    1. Обзор темы работы

При подготовке к работе изучите архитектуру памяти в WIN32. Виртуальное адресное пространство составляет 4 ГБ (232). Отдельный процесс имеет свое адресное пространство, недоступное другим процессам.

Таблица 3.2 – Особенности разбиения адресного пространства для Windows NT

Диапазон адресов

Размер (байт)

Назначение

000000000h-00000FFFFh

65536

Не используется. Для задания недействительных адресов

000010000h-07FFEFFFFh

2Гб – 2*64 Кбайт

Для процессов пользователя

07FFF0000h-07FFFFFFFh

64 Кбайт

Не используется. Для задания недействительных указателей

080000000h-0FFFFFFFFh

2 Гб

Для ОС. Недоступны пользователю.

Регионы в адресном пространстве

Резервирование памяти начинается с выделения региона памяти – определения требуемого виртуального адресного пространства.

Для этого используется функция VirtualAlloc:

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

LPVOID VirtualAlloc(

LPVOID lpAddress,

DWORD dwSize,

DWORD flAllocationType,

DWORD flProtect

);

lpAddress – определяет начальный адрес выделенной области. Адрес виртуальной памяти выравнивается на границу 64-kilobyte. Если память уже связывается (выделяется физическая память), адрес выравнивается на границе страницы. Для определения размера страницы можно использовать функциюGetSystemInfo. Если это параметр =NULL, система определяет возможность выделения региона.

DwSize– Размер региона в байтах. ЕслиlpAddress= NULL, это значение округляется до границы страницы в сторону увеличения.

FlAllocationType – тип операции выделения. Можно задать флаги или их комбинации:

Таблица 3.3 – Флаги, определяющие тип операции и состояние выделенного участка памяти.

Флаг

Назначение

MEM_COMMIT

Выделяет физическую память или страничный файл на диске. Попытка повторного выделения той же области не приводит к ошибке

MEM_RESERVE

Резервирует виртуальное адресное пространство заданного размера. Зарезервированный диапазон не может использоваться другими функциями, например LocalAlloc. Выделенный регион может быть связан в дальнейшем с физической памятью

MEM_TOP_DOWN

Выделяется память в верхней области адресного пространства. В Windows 95 не поддерживаются

FlProtect

Тип защиты. Для физической памяти могут быть заданы флаги PAGE_GUARD и PAGE_NOCACHE совместно с флагами, определенными ниже

PAGE_READONLY

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

PAGE_READWRITE

r/w

PAGE_EXECUTE

Выполнимый

PAGE_EXECUTE_READ

r/e

PAGE_EXECUTE_READWRITE

r/w/e

PAGE_GUARD

Охраняемая (защищенная) страница. Любой доступ к странице – ошибка (см. Гл.7)

PAGE_NOACCESS

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

PAGE_NOCACHE

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

PAGE_WRITECOPY

Запись в страницу приводит к тому, что процессу предоставляется личная копия этой страницы физической памяти.

PAGE_EXECUTE_WRITECOPY

Любые действия, в т.ч. и исполнение приводит к формированию новой копии.

Возвращаемое значение:

Успех – адрес памяти.

Ошибка – NULL. (GetLastError).

Т.о. VirtualAllocможет выполнить функции:

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

  2. Зарезервировать регион из свободных страниц.

  3. Зарезервировать и связать.

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

Страницы могут быть в одном из 3-х состояний:

Свободная – страница не зарезервирована и не связана. Такие страницы функция VirtualAllocможет зарезервировать или зарезервировать и связать.

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

Связанные – физическая память выделена и установлены атрибуты доступа. Система фактически инициализирует и загружает выделенные страницы при первой попытке доступа к заданной памяти. Когда завершается процесс, ОС освобождает все закрепленные страницы. Функция VirtualAllocможет повторно связать уже связанные страницы. ФункцияVirtualFreeможет освободить физическую память, связанную со страницами.

Если lpAddress!=NULL, функция использует параметрыlpAddressиdwSizeдля вычисления количества требуемых страниц. Если заданное число страниц не может быть выделено, функция завершается ошибочно.

Модификатор защиты PAGE_GUARDустанавливает защиту для страниц.

Для определения состояния памяти целесообразно использовать системный вызов GlobalMemoryStatus.

Синтаксис: BOOL WINAPI GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer );

lpBuffer – указатель на структуруMEMORYSTATUS, которая определена следующим образом:

typedef struct _MEMORYSTATUS {

DWORD dwLength; // размерструктурыMEMORYSTATUS

DWORD dwMemoryLoad; // процент использования памяти

SIZE_T dwTotalPhys; // всего физической памяти в байтах

SIZE_T dwAvailPhys; // доступно физической памяти в байтах

SIZE_T dwTotalPageFile; // всего виртуальной памяти в байтах

SIZE_T dwAvailPageFile; // доступно виртуальной памяти

SIZE_T dwTotalVirtual;

/* всего виртуального адресного пространства доступного пользовательскому процессу для собственных нужд в байтах. Зависит от процесса и настроек ОС. Обычно около 2Gb или 3Gb. */

SIZE_T dwAvailVirtual;

/* свободное виртуальное адресное пространство доступное пользовательскому процессу для собственных нужд в байтах */

}MEMORYSTATUS, *LPMEMORYSTATUS;

Перед использованием структуры она должна быть распределена и dwLengthдолжно быть заполнено фактическим размером структуры. ОбычноdwLength=sizeof(MEMORYSTATUS).