
- •Структура оконного приложения и обработка сообщений.
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Обзор темы работы
- •Структура оконного приложения
- •Задания к лабораторной работе
- •Содержание отчета к лабораторной работе
- •Контрольные вопросы.
- •Многозадачность и многопоточность
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Обзор темы работы
- •Обобщенный алгоритм доступа к критическому ресурсу с использованием объектов синхронизации
- •Практические аспекты
- •Задания на лабораторную работу
- •Контрольные вопросы и задания
- •Управление распределением памяти (win api)
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Обзор темы работы
- •Порядок выполнения работы.
- •Задания к выполнению.
- •Содержание отчета
- •Контрольные вопросы и задания
- •Управление файлами
- •Цель работы
- •Указания по подготовке к выполнению лабораторной работы
- •Обзор темы работы
Контрольные вопросы и задания
Поясните принцип многозадачности современных операционных систем.
Чем отличается многозадачность от многопоточности?
Каким образом аппаратно решаются задачи обеспечения многозадачности?
Приведите примеры использования многопоточности в прикладных программах.
Каким образом осуществляется синхронизация потоков?
Что такое "критический раздел"?
Что такое "событие"?
Объясните назначение локальной и глобальной памяти потоков.
Управление распределением памяти (win api)
Цель работы
Изучить способы статического и динамического распределения памяти, функции для работы с виртуальной и реальной памятью при программировании в 32-битном режиме.
Указания по подготовке к выполнению лабораторной работы
Управление памятью является одной из основных функций ОС. Оперативная память – это важнейший ресурс любой вычислительной системы, поскольку без нее (как, впрочем, и без центрального процессора) невозможно выполнение ни одной программы. Память является разделяемым ресурсом. От выбранных механизмов распределения памяти между выполняющимися процессами в значительной степени зависит эффективность использования ресурсов системы, ее производительность, а также возможности, которыми могут пользоваться программисты при создании своих программ.
При подготовке к работе необходимо изучить конспект лекций по указанной теме, методические указания, а также разделы, указанные в [16, c.763-809], [17, c.59-87].
Обзор темы работы
При подготовке к работе изучите архитектуру памяти в 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может выполнить функции:
Связать регион страниц с физической памятью, выделенный при предыдущем вызове функции VirtualAlloc.
Зарезервировать регион из свободных страниц.
Зарезервировать и связать.
Можно выделить большой регион, а затем связать с физической памятью только небольшой блок региона. Связь с физической памятью делается только для того участка, для которого необходимо.
Страницы могут быть в одном из 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).