Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры ОС1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.61 Mб
Скачать

33. Распределение первого мегабайта оперативной памяти в персональных компьютерах.

Распределения памяти в 1-ом мб физ памяти

ОС MS-DOS может оперировать 1 мб физ памяти благодаря особенностям адрессации процессора 8086 адрес состоял из 20б. В эту область умещался и BIOS компьютера, и видеопамять, и область программ, включая ОС. Сразвитием процессорной архитектуру появлисаь возможность адресовать память 1-ым мб. Однока для сохранения совместимости с IBM-PC при включении компьютера до настоящего времени 20 линия адреса всегда равна нулюпри обращении к ОЗУ. Реальные значения 20 линии адреса можновключить посредствам команды мат паты с через клавиатурный порт. После этго в распоряжении MS-dos оказыввется 1мб+64б-4б адресного пространства.Такое включение в ms-dos производят драйверы hymen.sys.

35. Резервирование памяти с помощью функции VirtualAlloc

Вся виртуальная память программы в ОС windows делится на 3 классса:

-Доступная – все адресное пространство процесса

-Заерезервированная-выделенное адресное пространство без подключения памяти.

-Выделенная- выделенное адресное пространство с подключенной к нему памятью.

Память в любой момент времени может находиться в оперативной памяти

Резервирвоание или выделение памяти делается с помощью ф-ии Virtual

LPVOID VirtualAlloc( LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect);

Параметры функции:

  • lpAddress – предпочтительный адрес выделения памяти,

  • dwSize – размер выделяемого блока (выравнивается по границе 4 Кб),

  • flAllocationType – тип выделения (MEM_RESERVE – память резервируется, MEM_COMMIT – память выделяется),

  • flProtect – тип защиты страниц (см. функцию MemoryMapFile).

Освобождение памяти осуществляется с помощью функции

LPVOID VirtualFree( LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);

Параметры функции:

lpAddress –адрес выделения памяти,

dwSize – размер выделенного блока,

dwFreeType – тип освобождения (MEM_DECOMMIT).

Память под исполняемый код программ выделяется в самих файлах программ, а не в файле свопинга.

По сути, происходит процесс memory mapping.

При отсутствии свободной ОП код программы в ОЗУ просто уничтожается, а затем при необходимости загружается из файла программы.

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

Например, имеется массив на 4 Мб памяти.

typedef int TData[100][100][100];

Из этого массива потребуется лишь небольшая часть. Тогда память массива можно не выделять, а зарезервировать.

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

void main()

{

TData *pData;

pData = (TData*)VirtualAlloc(0,sizeof(TData),

MEM_RESERVE,PAGE_READWRITE);

int *pSomeData = &(*pData)[50][50][50];

__try {

*pSomeData = 1;

}

__except(VirtualAlloc(pSomeData,sizeof(int),

MEM_COMMIT,PAGE_READWRITE),-1) { }

printf("Some Data = %d",*pSomeData);

VirtualFree(pData,sizeof(TData),MEM_DECOMMIT);

return;

}

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

Выделенние памяти в адресном простарнстве windows происходит 64кб блоками. Ядро windows определяет блок в который попадает указатель pSomeData и выделяет память в эит блоки ( 64 кб или 128 кб) «-1» вернет нас в try «1» присваивается.