пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Архитектура памяти в OC Windows. Организация физической памяти. Страничный файл, передача физической памяти

В Win32 виртуальное адресное пространство каждого процесса составляет 4 Гб, т.е. соответствующий 32-битный указатель может быть числом от $00000000 до $FFFFFFFF. 

Для 64-разрядных процессов размер адресного пространства равен 16 экзабайтам, поскольку 64-битный указатель может быть любым числом от 0x00000000 00000000 до 0xFFFFFFFF FFFFFFFF.

 В DOS или в 16-разрядной Windows все процессы находились в едином адресном пространстве, поэтому сбой в процессе A мог привести к краху процесса B или всей ОС.

В Win32 каждому процессу отводится закрытое адресное пространство:

Например, процесс А хранит массив информации по адресу $12345678. В то же время процесс B также хранит свою информацию по тому же адресу $12345678.

Но процесс A имеет доступ к своему массиву, а процесс В к своей информации. Обращаясь к памяти по адресу 0x12345678, потоки, выполняемые в процессе А, получают доступ к структуре данных процесса А, Но, когда по тому же адресу обращаются потоки, выполняемые в процессе В, они получают доступ к структуре данных процесса В. Иначе говоря, потоки процесса А не могут обратиться к структуре данных в адресном пространстве процесса В, и наоборот

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

Организация физической памяти:

Физическую память в Windows 95 и Windows NT следует рассматривать данные, хранимые в дисковых файлах со страничной структурой – так называемые страничные файлы. Когда приложение передает физическую память какому-нибудь региону адресного пространства (например, вызывая функцию VirtualAlloc), она на самом деле выделяется из файла, размещенного на жестком диске.

Современные операционные системы умеют имитировать память за счет дискового пространства. При этом на диске создается страничный файл (paging file), который и содержит виртуальную память, доступную всем процессам.

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

С точки зрения прикладной программы, страничный файл просто увеличивает объем памяти, которой она может пользоваться. Если установлено 64 Мб оперативной памяти, а размер страничного файла на жестком диске составляет 100 Мб, приложение считает, что объем оперативной памяти равен 164 Мб.

Конечно, 164 Мб оперативной памяти на самом деле нет. ОС в тесной координации с процессором сбрасывает содержимое части оперативной памяти в страничный файл и по мере необходимости подгружает его порции обратно в память. Если такого файла нет, система просто считает, что приложениям доступен меньший объем памяти.

Поэтому размер страничного файла – главный фактор, определяющий количество физической памяти. Реальный объем оперативной памяти имеет гораздо меньшее значение.

Перед использованием памяти ее необходимо зарезервировать. ОС резервирует память по так называемым регионам ("порции" памяти). Границы региона памяти выбираются кратными некоторому числу, которое обеспечивает так называемую гранулярность выделения ресурсов. Это число зависит от типа процессора (для x86 - 64Кб). Гранулярность позволяет упростить хранение информации о регионах, а также снизить степень фрагментации регионов в адресном пространстве. 

Резервируя память под регион ОС обеспечивает кратность размера региона размеру страницы. Размер страницы зависит от типа процессора (для x86 - 4Кб). Например, осуществляется попытка выделить 10 Кб памяти. ОС округлит этот объем до ближайшего большего числа, кратного странице и следовательно выделит 12 Кб.

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

В Win32 API существует функция, позволяющая запрашивать определенную информацию об участке памяти по заданному адресу: размер, тип памяти и атрибуты защиты:

SIZE_T WINAPI VirtualQuery(

LPCVOID lpAddress,

PMEMORY_BASIC_INFORMATION lpBuffer,

SIZE_T dwLength

); 

...

Функция 

      void WINAPI GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

позволяет отслеживать текущее состояние памяти. В качестве возвращаемого параметра используется структура:

typedef struct _MEMORYSTATUS


26.12.2015; 23:13
хиты: 0
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь