Изучение организации памяти и функций управления памятью: Методические рекомендации по выполнению лабораторной работы, страница 3

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);

}