Продолжение и изучение виртуальной памяти.
Структуризация виртуального адресного пространства в 64х разрядных системах намного похоже на структуризацию 32х, за некоторыми исключениями. Все виртуальное адресное пространство делится на две части, где первое чуть более 8гб закрыты виртуальными адресами процесса, а остальное 8тб являются памятью ядра ОС. Начиная с win vistа, память ядра в виртуально адресном пространстве, не разбивается на статические регионы под различные нужды(кэш, пул подкачиваемой памяти, пул не подкачивемой памяти, пространства обращения процессов) а стала разбиваться и распределятся динамически, в соответствии с текущими потребностями.
В серверной версии win, используют другую структуризацию:
8FFFFFFF
С0000000
FFFFFFFF
ВАП для Windows AS/Datacenter.
В общем для 32х и 64х разрядных систем является то, что размер виртуальной памяти как правило превышает размер оперативной памяти и соотвественно используется вытеснение не используемых страниц ОП на внешний носитель, при этом происходит проецирование на эти страницы оперативной памяти на соответсвующие страницы виртуальной памяти. При чем как только процесс пытается получить доступ к вытесненым страницам просходит прерывание называемое ошибкой страницы, котроая заставляет ОС загрузить страницу из области подкачки на страницу физической памяти, т.е подкачать. Когда приложение выделяет для себя некоторый объем виртуальной памяти ОС резервирует необходимое место в области подкачки, не проицурая выделенные страницыв оперативную память до первого к ним обращения, это называется подкачка по требованию или чаще всего называется lazy swapping. Размер страницы зависит от процессора. Для микропроцессоров intel x86 размер страницы состовляет 4096 байт, для микропроцессоров Alpha axp 8192 байта. Система всегда выделяет память объемом кратным размеру страницы, в соответсвующем гранулярностью выделения.
Win Api.
Есть большой набор функций позволяющий получить(часто доступо только для пользовательских приложений) информацию о состоянии ВП.
VirtualAlloc – резервирует регион страниц в ВАП.
VirtualAlloc Ex – резервирует регион страниц в ВАП для конкретного процесса.
VirtualFree – освобождает регион страниц внутри ВАП вызываемого процесса.
VirtualFree Ex – освобождает регион страниц внутри ВАП вызываемого процесса для конкретного процесса.
VirtualLock – закрывает указанный регион с указанным размером в ВАП вызываемого процесса и физической памяти.
VirtualProtect – изменяет защиту доступа в регионе страниц вызываемого процесса.
VirtualProtect Ex – изменяет защиту доступа в регионе страниц для конкретного процесса.
VirtualQuery – позволяет использовать информацию о регионе памяти по заданному адресу вызываемого процесса.
VirtualQuery Ex – позволяет использовать информацию о регионе памяти по заданному адресу для указанного процесса.
VirtualUnlock – открывает закрытый участок.
Лекция номер 8
Потоки.
Потоком называется объект ядра (Thread) отвечающий за выполнение программного кода в процессе при инициализации процесса система создает его первичный поток. Первичный поток начинает свое выполнение с функции main в консольных приложениях или WinMain в приложениях обладающих GUI и существует до тех пор пока main или WinMain не вернет управление. Большинство процессов (несколько устаревшая информаци) обходятся одним потоком однако(с присутствующим многоядерностью и многопроцессорностью) создается несколько главных потоков выполняющих код параллельно. На системах с одним процессором или одним ядром, диспетчер последовательно переключает процессор между запущенными потоками, потоки представлены на уровне ОС блоком со следующими структурами:
1. Thread ID – индентификатор потока. ( вещь угикальная)
2. Стартовый адрес потока- данные о стеке потока в двух возможных режимах.
3. Контекст потока
4. Информация для деспетчиризации. (ее много)
5. Время создания и завершения потока.
6. Информация о локальной памяти потока. (TLS)
Фактически в контексте потока выделяются три составляющие:
1. Пользовательский контекст
2. Системный контекст. Заносится:
1. Стек ядра.
2. Записи таблицы областей процесса, сопоставление из LDT.
3. Регистровый контекст:
1. Счетчик команд
2. Регистр состояния процессора
3. Указатель вершины стека (stack pointer).
4. Информация о состоянии регистров потока.
Контекст– аппаратно зависимая структура, описание контекстов можно найти в структуре контекстов Context SDK WinAPI.
Переключение контекста потока происходит в следующих случаях:
1. Когда текущий процесс "засыпает" ожидая освобождения недоступного ему на данный момент ресурса.
2. Когда текущий процесс завершает свое выполнение отдавая управление ОС
3. Если в очередь поступил процесс с более высоким приоритетом
4. Если "пробудился" процесс ожидавший долгое время находившийся в системе и ему присвоен более высокий приоритет.
Для хранения набора переменных окружения используются ini файлы или ключи системного реестра. При порождении нового процесса происходит следующее: резервируется место в области свопинга для сегмента данных и стека процесса, сохраняются переменные окружения, в таблице процессов появляется новая запись и процессу присваивается уникальный ID, генерируется таблица описателей, связывающий виртуальный адрес в физич, инициализируется контекст процесса путем копирования с родительского контекста, процесс помечается готовым к запуску и отправляется в очередь на исполнение. Завершение процесса проходит в несколько этапов:
1. Отключаются все сигналы
2. Закрываются все открытые файлы
3. В соответствующей записи таблицы описателей сохраняется код возврата.
4. Родительскому процессу направляется сигнал о закрытии потомка.
5. Уничтожается контекст завершаемого процесса.
1. Эта последовательность шагов выполняется каждый раз при закрытии пользовательского/системного процесса.
В таблице приведем различия для процессов и потоков характерные для каждого из них.
Элементы процесса присущие всем потокам процесса
| Элементы потока, присущие индивидуальные для потока
| Адресное пространство
| Счетчик команд
| Глобальные переменные
| Регистры
| Открытые файлы
| Стек
| Дочерние процессы
| Состояние
| Аварийные сигналы
|
| Обработчики сигналов
|
| Ресурсы
|
|
Многопоточность это свойство присущие разным ОС, потоки реализованы как достаточно самостоятельная часть системы платформы windows и как интегрированная вовлеченная часть (*nix) системы. Работа с потоками предполагает наличие механизмов позволяющих выполнять управлением потока так же как и процессом. Многие функции работы с потоками переносятся со структуры процессов, можно отправлять в сон заставляя их заснуть, возобновляя выполнение, завершая их выполнение.
Лекция номер 9.
Исполняемый поток взаимодействует с процессором блокированный поток ожидает системного события, которое его разблокирует его, готовый к исполнению поток помещается в очередь на исполнение. При запуске нового потока система:
1. Создает новый объект ядра, типа поток возвращая его описателю.
2. Помечает объект индентиыикатором STILL_ACTIVE и устанавливает счетчик простоя потока в 1.
3. Создает новую структуру типа COMTEXT.
4. Создает стэк потока.
5. Устанавливает указатель стека на начало стека, а указатель комманд на начало исполняемой в потоке процедуры.
6. Если все шаги выполнены успешно, то счетчик простоя сбрасывается в 0.
При завершении потока выполняются следующие шаги:
1. Освобождаются все описатели объектов принадлежащих потоку.
2. Объект ядра типа поток получает статус не занятого.
3. Код завершения потока меняется на код ExitThread() / TerminateThread().
4. Если данный поток является последним активным в процессе то завершается и процесс.
5. Счетчик пользователе объекта ядра типа поток уменьшается на 1.
6. Если счетчик пользователей после уменьшения на 1 становится равным 0 т.е все ссылки на этот объект ядра закрыты, то закрывается и объект ядра потока.
7. Управление выполнения потока происходит при помощи функции SuspenThread () –приостанавливает выполнения потока(счетчик простоя потока увеличивается на 1и Nc+1<=127) and Resume Thread () – возобновляет выполнение потока с точки остановки(уменьшает счетчик простоя на 1).
Начиная с Win2000 введины еще два вида рабочих сущностей job(s) and fiber. Fiber – это поток в потоке у каждого потока может быть несколько полотен минимум одно все полотна исполняются в контексте родительского потока и отдельного объекта ядра не имеют.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|