5. Составьте и выполните программу, в которой для выделения и освобождения памяти используются функции malloc() и free().
6. Составьте и выполните программу, в которой для управления динамической памятью используются операторы new и delete.
7. Составьте и выполните программу, в которой с помощью функции 48h INT 21h выделяется память размером 256 байт, в неё вводится с клавиатуры символьная строка, которая затем записывается в файл и ранее выделенная память освобождается.
8. Объясните механизм функционирования виртуальной памяти.
9. Каковы особенности страничной организации виртуальной памяти?
10. Как осуществляется преобразование виртуального адреса в физический при страничной организации памяти?
11. Почему размер страницы в страничной виртуальной памяти выбирается равным степени два?
12. Объясните назначение и синтаксис функции VirtualAlloc().
13. Каким образом можно с помощью VirtualAlloc() зарезервировать память, а затем выделить её частями?
14. Поясните синтаксис функции VirtualFree().
15. Составьте и выполните программу, в которой с помощью функции VirtualAlloc() выделяется память и заполняется случайными числами.
16. Каковы преимущества и недостатки функции VirtualAlloc() по сравнению с обычными средствами языка С (С++) для управления динамической памятью?
5. ЛИТЕРАТУРА
1. Сетевые операционные системы / В.Г. Олифер, Н.А. Олифер. – СПб.: Питер, 2001,
стр. 162 – 212.
2. Вильямс А. Системное программирование в Windows 2000 для профессионалов. -
СПб.: Питер, 2001, стр.359 - 379
Приложение 1.
// Пример программы с использованием функций calloc()/free()
// для динамического выделения / освобождения памяти
#include <iostream.h>
#include <alloc.h>
#include <conio.h>
#define COUNT 10
int main(void)
{
int *pBlock;
int i;
// Выделение памяти
if ((pBlock = (int*) malloc(COUNT*sizeof(int)))== NULL)
// Вариант
//if ((pBlock = (int*) calloc(COUNT,sizeof(int)))== NULL)
{
cout << "Ошибка выделения памяти!\n";
return 1;
}
// заполнение выделенной памяти
for (i=0; i<COUNT; i++)
*(pBlock+i) = i;
// Вывод на экран
for (i=0; i<COUNT; i++)
cout << (*pBlock++) << '\n';
// освобождение памяти
cout << "Для освобождения памяти нажмите любую клавишу\n";
getch();
free(pBlock);
return 0;
}
Приложение 2.
// Пример динамического выделения памяти с использованием
// операций new/ delete
#include <iostream.h>
#include <conio.h>
#include <new.h>
// собственный обработчик ошибок выделения памяти
void newHandler()
{
cout << "\n Inadequate memory!\n";
}
int main()
{
int *iptr, i;
// установка собственного обработчика ошибок
set_new_handler(newHandler);
// выделение памяти
iptr = new int[100];
// заполнение и вывод выделенного блока памяти
for (i=0; i<100; i++)
*(iptr+i)= 100-i;
for(i =0; i<100; i++)
cout<<*(iptr+i) << " ";
// Освобождение выделенного блока
delete[] iptr;
// выделение огромного блока памяти
long double *lptr;
if(lptr = new long double[1000000])
{
cout << "\n Finished!"<<"\nPress any key";
getch();
delete[] lptr;
}
else
cout << "\n Failure...";
return 0;
}
Приложение 3.
// Программа выделения памяти в ОС MS-DOS
// Программа выделяет блок памяти с помощью функции 48h INT 21h
// флаг CF=1 в случае неуспеха
// Освобождение памяти с помощью функции 49h
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define NUMPARAGR 32 // Число параграфов
main()
{
unsigned seg;// Адрес сегмента выделен. памяти
char *str;
printf(" Выделяем %d параграфов памяти\n", NUMPARAGR);
asm {
mov AH,48h
mov BX,NUMPARAGR
int 21h
jc error
mov seg,AX
}
puts(" Успешное выделение!\n");
str = (char *)MK_FP( seg,0); //получение полного адреса
printf("\nInput a string: ");
gets(str); //ввод строки по выделенному адресу
puts("\n Для освобождения памяти нажмите любую клавишу\n");
getch();
//Освобождение выделенной памяти
asm {
mov AH,49h
mov ES,seg
int 21h
}
return 0;
error: puts("Неудачное выделение...");
return 1;
}
Приложение 4.
// Программа, демонстрирующая использование функции API Windows
// VirtualAlloc() - резервирование и выделение памяти
#include <windows.h>
#include <iostream.h>
#define MEGABYTE 1048576
#define MEMORYSIZE 15
char *p=NULL;
// Размер резервируемой памяти в МВ может передаваться
//как параметр командной строки или устанавливаться равным MEMORYSIZE
void main(int argc, char *argv[])
{
int choice;
int size=0;
if (argc>1) size=atoi(argv[1]);
if (!size) size=MEMORYSIZE;
do
{
int flag=1;
if(p)
{
cout<<"\n Free memory\n";
VirtualFree(p,0,MEM_RELEASE);
p=NULL;
cout<<"Completed!\n";
}
//Вывод меню
cout<<"\n\n MENU\n\n";
cout<<"1 - Allocate "<<size<<" MB memory\n";
cout<<"2 - Reserve "<<size<<" MB memory\n";
cout<<"3 - Reserve "<<size<<" MB and allocate 1MB memory\n";
cout<<"4 - Exit\n\n";
cout<<" YOUR CHOICE: ";
cin >> choice;
//Выбор команды
switch (choice)
{
case 1:
cout<<"\n Allocate memory\n";
p=(char*)VirtualAlloc(NULL, size*MEGABYTE,
MEM_COMMIT, PAGE_READWRITE);
break;
case 2:
cout<< "\n Reserve memory\n";
p=(char*)VirtualAlloc(NULL, size*MEGABYTE,
MEM_RESERVE, PAGE_READWRITE);
break;
case 3:
cout<< "\n Reserve and portion allocation memory\n";
p=(char*)VirtualAlloc(NULL, size*MEGABYTE,
MEM_RESERVE, PAGE_READWRITE);
cout<<"\n Allocation\n";
VirtualAlloc(p, MEGABYTE, MEM_COMMIT, PAGE_READWRITE);
break;
case 4:
exit(0);
default:
cout<<"What-what?";
flag=0;
}
//Вывод начального адреса выделенного блока памяти
if (p && flag)
cout<<"Block memory @ "<<hex<<(unsigned int)p<<"\n";
if(!p && flag) cout<<"Failure allocation memory!\n";
} while (1);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.