Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 51

Работа добавлена на сайт samzan.net: 2015-07-10

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 15.5.2024

Лабораторная работа № 5. Использование механизма виртуальной памяти в ОС Windows

Цель: Изучение виртуальной памяти в операционной системе Windows.

Задачи:

1. Изучение теоретического материала по виртуальной памяти.

2. Составление алгоритма программы.

3. Программная реализация.

Ход работы:

1. Ознакомиться со спецификациями функций WinAPI по работе с разделами виртуального адресного пространства процессов и «кучами».

2. Получить индивидуальный вариант задания у преподавателя.

3. Разработать программу в соответствии с полученным заданием, в которой должны использоваться «кучи» или механизм захвата и освобождения разделов виртуальной памяти.

4. Написать отчет и представить его для защиты вместе с исполняемым модулем программы и ее исходными текстами.

Ход защиты:

1. Продемонстрировать преподавателю программу, использующую механизмы виртуальной памяти.

2. Пояснить программный код разработанного приложения.

Виртуальное адресное пространство каждого процесса в ОС Windows NT/2000/XP организовано следующим образом. В момент своего создания, оно почти полностью пусто. Для использования какой-то его части, необходимо выделить в нем определенные регионы с помощью функции
VirtualAlloc, эта операция называется резервированием. При этом ОС должна выравнивать начало региона в соответствии с так называемой гранулярностью выделения памяти, которая составляет на текущий момент времени 64 Кб. Также система должна учитывать, что размер региона должен быть кратен размеру страницы. Для процессоров Pentuim размер страницы составляет 4 Кб. Иными словами, если процесс попытается зарезервировать 10 Кб, то будет выделен регион размером 12 Кб. Когда регион становится не нужен, его необходимо освободить вызовом функции VirtualFree.

Чтобы использовать выделенный регион виртуального адресного пространства (ВАП), для него необходимо также выделить физическую память, спроецировав ее на регион. Эта операция называется передачей физической памяти и осуществляется с помощью функции VirtualAlloc. Для физической памяти определяют ее возврат, что выполняется с помощью функции VitualFree. Обе упомянутые функции будут описаны ниже.

Отдельным страницам физической памяти можно устанавливать атрибуты защиты:

PAGE_NOACCESS

Любая операция вызовет нарушение доступа

PAGE_READONLY

Попытки записи или исполнения могут вызвать нарушение доступа

PAGE_READWRITE

Попытки исполнить содержимое страницы вызывают нарушение доступа

PAGE_EXECUTE

Чтение и запись могут вызвать нарушение доступа

PAGE_EXECUTE_READ

Нарушение доступа при попытке записи

PAGE_EXECUTE_READWRITE

Возможны любые операции

PAGE_WRITECOPY

При исполнении этой страницы нарушение доступа, при записи процессу дается личная копия страницы

PAGE_EXECUTE_WRITECOPY

Любые операции, при записи процессу дается личная копия страницы

PAGE_NOCACHE

Отключает кэширование страницы (флаг)

PAGE_WRITECOMBINE

Объединение нескольких операций записи (флаг)

PAGE_GUARD

Используется для получения информации о записи на какую-либо страницу (флаг)

Узнать размеры страницы, гранулярность выделения памяти и другие параметры ОС можно с помощью функции Win32 API

VOID GetSystemInfo (LPSYSTEM_INFO SysInfo);

В эту функцию в качестве параметра передается адрес структуры данных, описанной следующим образом

typedef struct {

  union {

     DWORD Oem; // не используется

     struct {

        WORD ProcArchitecture; // типа архитектуры процессора

        WORD Reserved; // не используется

     };

  };

  DWORD PageSize; // размер страницы в байтах

  LPVOID MinApplnAddress; // минимальный адрес доступного ВАП

  LPVOID MaxApplnAddress; // максимальный адрес доступного ВАП

  DWORD_PTR ActiveProcessors; // процессоры, выполняющие потоки

  DWORD NumberOfProc; // количество установленных процессоров

  DWORD ProcType; // тип процессора для Windows 98/Me

  DWORD Granularity; // гранулярность

  WORD ProcLevel, ProcRevizion;

     // дополнительные параметры для ОС Windows 2000

} SYSTEM_INFO, *LPSYSTEM_INFO;

Если есть необходимость узнать параметры, которые имеют отношение к памяти (а их всего четыре), достаточно выполнить всего два оператора

SYSTEM_INFO SysInfo;

GetSystemInfo (&SysInfo);

После этого можно спокойно просматривать содержимое полей структуры SysInfo, где и будут находиться искомые системные параметры.

Следующая функция позволяет отслеживать состояние памяти на
текущий момент времени, однако она имеет довольно странное название

VOID GlobalMemoryStatus (LPMEMORY_STATUS MemStat);

Как видно, ей необходимо передать адрес некоторой структуры, которая описана следующим образом.

typedef struct {

  DWORD Length; // размер структуры в байтах

  DWORD MemLoad;

     // Занятость подсистемы управления памятью (0 - 100)

  SIZE_T TotalPhysMem; // объем физической памяти

  SIZE_T AvailablePhysMem; // объем свободной физической памяти

  SIZE_T TotalPageFile; // максимальный размер файла подкачки

  SIZE_T AvailablePageFile;

     // размер свободного места в файле подкачки

  SIZE_T TotalVirtual; // максимальный размер ВАП процесса

  SIZE_T AvailableVirtual; // размер доступного ВАП процесса

} MEMORY_STATUS, *LPMEMORY_STATUS;

Если нужно получить какие-то параметры памяти, потребуется еще несколько операторов, но предварительно потребуется установить длину всей структуры.

MEMORY_STATUS MemStat;

MemStat.Length = {sizeof (MemStat)};

GlobalMemoryStatus (&SysInfo);

В дальнейшем можно смело пользоваться значениями остальных полей структуры MemStat.

В ОС Windows NT/2000/XP есть функция, которая позволяет получать информацию о конкретном участке памяти в пределах ВАП процесса.

DWORD VirtualQuery (

  LPCVOID Address, // адрес участка памяти

  PMEMORY_BASIC_INFORMATION MemBase,

     // адрес структуры с информацией о памяти

  DWORD Length); // размер структуры с информацией о памяти

Этой функции требуется адрес структуры типа MEMORY_BASIC_INFORMATION, описанной как

typedef struct {

  PVOID Base;

   // Address, округленный до адреса, кратного размеру страницы

  PVOID AllocBase;

     // Базовый адрес региона, в который входит адрес Address

  DWORD AllocProtection; // атрибут защиты для региона

  SIZE_T RegionSize;

     // размер страниц, имеющих одинаковые атрибуты

  DWORD State; // состояние всех смежных страниц

  DWORD Protection; // атрибуты защиты всех смежных страниц

  DWORD Type; // тип физической памяти всех смежных страниц

} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

В том случае, если понадобится вывести информацию о регионах ВАП текущего процесса, можно это сделать следующим образом, однако весьма «грубо»:

// сначала необходимо получить размер страницы для данной системы

SYSTEM_INFO SysInfo;

GetSystemInfo (&SysInfo);

PVOID BaseAddr = NULL;

MEMORY_BASIC_INFORMATION MemBase;

for (;;) {

  if(VirtalQuery(BaseAddr,&MemBase,sizeof(MemBase)) !=

     sizeof(MemBase)) break;

  printf (“%Lp\t\”, MemBase.AllocBase); // Базовый адрес

  printf (“%d\t”, MemBase.RegionSize / SysInfo.PageSize);

     // Страниц на регион

  switch (MemBase.State) { // Состояние региона

     case MEM_FREE: printf (“Свободный\t”); break;

     case MEM_RESERVE: printf (“Зарезервирован,

            память не передана\t”); break;

     case MEM_COMMIT: printf (“Зарезервирован,

            память передана\t”); break;

     }

  switch (MemBase.Protection) { // Атрибуты защиты региона

     case PAGE_NOACCESS: printf (“----\t”); break;

     case PAGE_READONLY: printf (“R---\t”); break;

     case PAGE_READWRITE: printf (“RW--\t”); break;

     case PAGE_EXECUTE: printf (“--E-\t”); break;

     case PAGE_EXECUTE_READ: printf (“R-E-\t”); break;

     case PAGE_EXECUTE_ READWRITE: printf (“RWE-\t”); break;

     case PAGE_EXECUTE_ WRITECOPY: printf (“RWEC\t”); break;

     }

  switch (MemBase.Type) { // Тип региона

     case MEM_FREE: printf (“Свободный”); break;

     case MEM_PRIVATE: printf (“Закрытый”); break;

     case MEM_IMAGE: printf (“Образ файла”); break;

     case MEM_MAPPED: printf (“Отображаемый файл”); break;

     default: printf (“Неизвестно”);

     }

  printf (“\n”);

  BaseAddr = MemBase.BaseAddress+ MemBase.RegionSize;

  }

Виртуальная память очень удобна для работы с большими массивами данных. Для малых по размеру объектов больше подходят так называемые «кучи». Если есть надобность в обмене данными между процессами, то ОС Windows предлагает еще один механизм – отображаемые на память файлы.
О них более подробно будет рассказано там, где речь пойдет о подсистеме управления файлами. Ниже будут описаны функции для управления кучами. Функции, имеющие дело с виртуальной памятью, позволяют резервировать регион, отдавать ему физическую память и устанавливать параметры защиты.

Для резервирования предназначена функция

PVOID VirtualAlloc (

  PVOID Address,

     // адрес, где система должна резервировать память

  SIZE_T Size, // размер региона, который надо зарезервировать

  DWORD AllocType,

    //тип резервирования(резервировать или передать физ.память)

  DWORD Protect);   // атрибут защиты (PAGE_*)

Функция возвращает NULL, если не удалось выделить память для
региона. Для резервирования достаточно при вызове указать тип
MEM_RESERVE. Если теперь надо передать ему физическую память, нужно еще раз вызвать VirtualAlloc с уже знакомым флагом доступа MEM_COMMIT. Можно выполнить обе операции одновременно

PVOID Region = VirtualAlloc (NULL, 25 * 1024,

  MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

Здесь содержится запрос на выделение региона размером 25 Кб и передачи ему физической памяти. Поскольку первый параметр функции равен NULL, ОС попытается найти подходящее место, просматривая все ВАП.
Регион и переданная ему память получат одинаковый атрибут защиты
PAGE_EXECUTE_READWRITE.

Для освобождения зарезервированного региона или возврата физической памяти можно пользоваться функцией

BOOL VirtualFree (

  PVOID Address,  // адрес, где система зарезервировала память

  SIZE_T Size,    // размер региона, который был зарезервирован

  DWORD FreeType);  //тип освобождения

Для освобождения региона нужно вызвать VirtualFree с его адресом, в Size указать 0, поскольку система знает размер региона, а в FreeTypeMEM_RELEASE. Если же возникла необходимость просто вернуть часть физической памяти, то Address должен адресовать первую возвращаемую страницу, Size – количество освобождаемых байтов, а FreeType – идентификатор MEM_COMMIT.

PVOID Region;

VirtualFree (Region, 0, MEM_RELEASE);

Атрибуты защиты страницы памяти можно вызовом функции

PVOID VirtualProtect (

  PVOID Address,   // адрес, где система зарезервировала память

  SIZE_T Size,     // число байтов, для которых меняется защита

  DWORD NewProtection, // новые атрибуты защиты

  PDWORD OldProtecttion);  //старые атрибуты защиты

Для изменения атрибутов защиты у тех страниц, которые принадлежат разным регионам функцию VirtualProtect использовать нельзя.

PVOID Region = VirtualAlloc (NULL, 25 * 1024,

  MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

DWORD OldProt;

VirtualProtect (Region, 3 * 1024, PAGE_READONLY, &OldProt);

Еще один механизм управления памятью – «куча» - это также регион зарезервированного адресного пространства. Этому региону большая часть физической памяти не передается. В зависимости оттого, что делает программа со своими данными, специализированный «менеджер куч» передает региону физическую память или возвращает страницы.

В ОС Windows NT/2000/XP при инициализации процесса в его ВАП создается стандартная куча, размер которой 1 Мб. Описатель этой кучи можно при помощи вызова функции

HANDLE GetProcessHeap ();

Можно создать и дополнительные кучи, для этого нужна функция

HANDLE HeapCreate (

  DWORD Options, // способ выполнения операций над кучей

  SIZE_T StartSize, // начальное количество байтов в куче

  SIZE_T MaxSize); // максимальное количество байтов в куче

Если в Options указан 0, то к куче могут одновременно обращаться несколько потоков. Атрибут HEAP_NO_SERIALIZE позволяет потоку осуществлять доступ к куче монопольно, однако пользоваться таким способом не рекомендуется. Другой флаг HEAP_GENERATE_EXCEPTIONS при ошибке обращения к куче дает системе возможность уведомлять программы об этом. Если в третьем параметре MaxSize указать значение больше 0, то будет создана нерасширяемая куча именно такого размера, в противном случае система резервирует регион и может расширять его до максимального размера. Данная функция в случае успеха возвращает описатель вновь созданной кучи.

Для выделения блока памяти из кучи необходимо вызвать функцию

PVOID HeapAlloc (

  HANDLE Heap,      // описатель кучи

  DWORD Flags,      // флаги выделения памяти

  SIZE_T Bytes);    // количество выделяемых байтов

Если в качестве флага указан HEAP_ZERO_MEMORY, функция возвратит блок памяти, заполненный нулями. Назначение HEAP_GENERATE_EXCEPTIONS и HEAP_NO_SERIALIZE очевидно.

Иногда требуется изменить размер выделенного блока памяти: уменьшить или увеличить. Для этого вызывается функция

PVOID HeapReAlloc (

  HANDLE Heap,      // описатель кучи

  DWORD Flags,      // флаги изменения памяти

  PVOID Memory,     // текущий адрес блока

  SIZE_T Bytes);    // новый размер в байтах

Возможны четыре значения флага: HEAP_NO_SERIALIZE, HEAP_GENERATE_EXCEPTIONS, HEAP_ZERO_MEMORY и HEAP_REALLOC_IN_PLACE_ONLY. Два первых из них знакомы по
HeapAlloc. При использовании HEAP_ZERO_MEMORY нулями заполняются только дополнительный байты. Флаг HEAP_REALLOC_IN_PLACE_ONLY говорит о том, что блок перемещать внутри кучи нельзя. Возвращает эта функция адрес нового блока либо NULL, если не удалось изменить размер.

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

SIZE_T HeapSize (

  HANDLE Heap,      // описатель кучи

  DWORD Flags,     

     // флаги изменения памяти (0 или HEAP_NO_SERIALIZE)

  PVOID Memory);    // текущий адрес блока

После того, как блок перестал быть нужным, его освобождают функцией

BOOL HeapFree (

  HANDLE Heap,      // описатель кучи

  DWORD Flags,      

     // флаги изменения памяти (0 или HEAP_NO_SERIALIZE)

  PVOID Memory);    // текущий адрес блока

В случае успеха эта функция возвращает TRUE. Аналогично работает функция HeapDestroy, которая освобождает все блоки памяти внутри кучи и возвратит системе регион, занятый кучей.

BOOL HeapDestroy (HANDLE Heap);      // описатель кучи

Небольшой фрагмент кода демонстрирует использование некоторых из этих функций.

// получение описателя стандартной кучи активного процесса

HANDLE SysHeap = GetProcessHeap ();

UINT MAX_ALLOCATIONS = 15;

  // максимальное количество выделений памяти

UINT NumOfAllocations = 0;

  // текущее количество выделений памяти

for (;;) {

  // выделение из кучи 2 Кб памяти

  if (HeapAlloc (SysHeap, 0, 2 * 1024) == NULL) break;

  else ++ NumOfAllocations;

  // условие прерывания цикла

  if (NumOfAllocation == MAX_ALLOCATIONS) break;

  }

// вывод соответствующих сообщений в зависимости от ситуации

if (NumOfAllocations == 0)

    printf (“Память из кучи не выделялась.”);

else printf (“Память из кучи выделялась %d раз.”,

            NumOfAllocations);

В ОС Windows NT/2000/XP есть пара функций Win32 API, которые позволяют блокировать (или зафиксировать) и разблокировать страницу в оперативной памяти. Функция VirtualLock позволяет предотвратить запись памяти на диск.

BOOL VirtualLock (

  LPVOID Address,   // адрес начала памяти

  SIZE_T Size);    // количество байтов

Если фиксация больше не нужна, то ее можно убрать функцией.

BOOL VirtualUnlock (

  LPVOID Address,   // адрес начала памяти.

  SIZE_T Size);     // количество байтов

Обе функции возвращают ненулевое значение в случае успеха.
Следующий фрагмент демонстрирует их использование.

int MEMSIZE = 4096;

PVOID Mem = NULL;

int num;

Mem = VirtualAlloc(NULL,4 * 1024, MEM_RESERVE,

                  PAGE_EXECUTE_READWRITE);

if (Mem != NULL) {

  if (VirtualLock (Mem, MEMSIZE)) printf ("Привязка\n");

  else printf (“Ошибка привязки”);

  scanf (“%d”, &num);

  if (VirtualUnlock (Mem, MEMSIZE))

       printf ("Привязка снята\n");

  else printf ("Ошибка снятия привязки\n");

  if (VirtualFree (Mem, 0, MEM_RELEASE))

       printf ("Память освобождена\n");

  else printf ("Память не освобождена\n");

  }

else printf ("Память не выделена\n");

}

Варианты заданий к лабораторной работе №5

Вариант №1

Разработать программу, которая демонстрирует управление структурами данных типа «стек», элементы которого занимают 10 кб. Операции, выполняемые над стеком:

  •  проверить, стек пуст/не пуст;
  •  втолкнуть элемент;
  •  вытолкнуть элемент;
  •  просмотреть вершину стека;
  •  обменять значения двух верхних элементов стека.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №2

Разработать программу, которая демонстрирует управление структурами данных типа «стек», элементы которого занимают 15 кб. Операции, выполняемые над стеком:

  •  проверить, стек пуст/не пуст;
  •  втолкнуть элемент;
  •  вытолкнуть элемент;
  •  просмотреть вершину стека;
  •  продублировать вершину стека.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №3

Разработать программу, которая демонстрирует управление структурами данных типа «стек», элементы которого занимают 12 кб. Операции, выполняемые над стеком:

  •  проверить, стек пуст/не пуст;
  •  втолкнуть элемент;
  •  вытолкнуть элемент;
  •  просмотреть вершину стека;
  •  обменять значения второго и третьего сверху элементов стека.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №4

Разработать программу, которая демонстрирует управление структурами данных типа «очередь», элементы которого занимают 10 кб. Операции, выполняемые над очередью:

  •  проверить, очередь пуста/не пуста;
  •  добавить элемент в хвост очереди;
  •  удалить элемент из головы очереди;
  •  просмотреть голову очереди;
  •  обменять значения из головы и хвоста очереди.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №5

Разработать программу, которая демонстрирует управление структурами данных типа «очередь», элементы которого занимают 15 кб. Операции, выполняемые над очередью:

  •  проверить, очередь пуста/не пуста;
  •  добавить элемент в хвост очереди;
  •  удалить элемент из головы очереди;
  •  просмотреть голову очереди;
  •  продублировать хвост очереди.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №6

Разработать программу, которая демонстрирует управление структурами данных типа «очередь», элементы которого занимают 12 кб. Операции, выполняемые над очередью:

  •  проверить, очередь пуста/не пуста;
  •  добавить элемент в хвост очереди;
  •  удалить элемент из головы очереди;
  •  просмотреть голову очереди;
  •  продублировать голову очереди.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №7

Разработать программу, которая демонстрирует управление структурами данных типа «дек» (очередь с двумя концами), элементы которого занимают 10 кб. Операции, выполняемые над деком:

  •  проверить, дек пуст/не пуст;
  •  добавить элемент в левый конец дека;
  •  добавить элемент в правый конец дека;
  •  удалить элемент слева;
  •  удалить элемент справа;
  •  просмотреть элемент слева;
  •  просмотреть элемент справа.

Воспользоваться механизмом управления разделами виртуальной памятью.

Вариант №8

Разработать программу, которая демонстрирует управление структурами данных типа «ограниченный слева дек» (очередь с двумя концами), элементы которого занимают 15 кб. Операции, выполняемые над деком:

  •  проверить, дек пуст/не пуст;
  •  добавить элемент в левый конец дека;
  •  добавить элемент в правый конец дека;
  •  удалить элемент справа;
  •  просмотреть элемент справа.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №9

Разработать программу, которая демонстрирует управление структурами данных типа «ограниченный справа дек» (очередь с двумя концами), элементы которого занимают 12 кб. Операции, выполняемые над деком:

  •  проверить, дек пуст/не пуст;
  •  добавить элемент в левый конец дека;
  •  добавить элемент в правый конец дека;
  •  удалить элемент слева;
  •  просмотреть элемент слева.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №10

Разработать программу, которая демонстрирует управление структурами данных типа «линейный однонаправленный список» (L1-list), элементы которого занимают 10 кб. Операции, выполняемые над списком (при этом определяется указатель списка и элемент списка за указателем):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  добавить элемент за указателем;
  •  удалить элемент за указателем;
  •  просмотреть элемент за указателем;
  •  переместить указатель вправо.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №11

Разработать программу, которая демонстрирует управление структурами данных типа «линейный двунаправленный список» (L2-list), элементы которого занимают 15 кб. Операции, выполняемые над списком (при этом определяется указатель списка, элемент списка за указателем и элемент до указателя):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  установить указатель в конец списка;
  •  добавить элемент за указателем;
  •  добавить элемент до указателя;
  •  удалить элемент за указателем;
  •  удалить элемент до указателя;
  •  просмотреть элемент за указателем;
  •  просмотреть элемент до указателя;
  •  переместить указатель вправо;
  •  переместить указатель влево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №12

Разработать программу, которая демонстрирует управление структурами данных типа «динамический вектор» (одномерный массив), элементы которого занимают 12 кб. Операции, выполняемые над вектором (при этом определяются начало и конец вектора, индекс элемента вектора):

  •  проверить, вектор пуст/не пуст;
  •  прочитать элемент с указанным индексом;
  •  изменить значение элемента с указанным индексом;
  •  добавить элемент в конец вектора;
  •  опустошить вектор.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №13

Разработать программу, которая демонстрирует управление структурами данных типа «последовательность» (файл в оперативной памяти), элементы которого занимают 10 кб. Операции, выполняемые над последовательностью (при этом определяются указатель на текущий элемент, начало и конец последовательности):

  •  проверить, последовательность пуста/не пуста;
  •  установить указатель в начало последовательности;
  •  прочитать элемент последовательности;
  •  добавить элемент в конец последовательности;
  •  опустошить последовательность.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №14

Разработать программу, которая демонстрирует управление структурами данных типа «кольцевой однонаправленный список», элементы которого занимают 15 кб. Операции, выполняемые над списком (при этом определяется указатель списка, который может автоматически перемещаться на начало списка, если достигнут его конец, и элемент списка за указателем):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  добавить элемент за указателем;
  •  удалить элемент за указателем;
  •  просмотреть элемент за указателем;
  •  переместить указатель вправо.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №15

Разработать программу, которая демонстрирует управление структурами данных типа «кольцевой двунаправленный список», элементы которого занимают 12 кб. Операции, выполняемые над списком (при этом определяется указатель списка, который может автоматически перемещаться на начало списка, если достигнут его конец, и в конец списка – в случае достижения его начала, а также элемент списка за указателем и элемент до указателя):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  установить указатель в конец списка;
  •  добавить элемент за указателем;
  •  добавить элемент до указателя;
  •  удалить элемент за указателем;
  •  удалить элемент до указателя;
  •  просмотреть элемент за указателем;
  •  просмотреть элемент до указателя;
  •  переместить указатель вправо;
  •  переместить указатель влево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №16

Разработать программу, которая демонстрирует управление структурами данных типа «двоичное упорядоченное дерево», элементы которого занимают 10 кб. Операции, выполняемые над деревом (при этом определяется один узел дерева, являющийся его корнем, все значения в узлах дерева разные):

  •  проверить, дерево пусто/не пусто;
  •  добавить элемент в дерево;
  •  удалить элемент из дерева;
  •  найти элемент с заданным значением;
  •  опустошить дерево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №17

Разработать программу, которая демонстрирует управление структурами данных типа «сбалансированное двоичное упорядоченное дерево», элементы которого занимают 15 кб. Операции, выполняемые над деревом (при этом определяется один узел дерева, являющийся его корнем, все значения в узлах дерева разные, длины путей от корня до всех узлов-листьев отличаются не более, чем на единицу):

  •  проверить, дерево пусто/не пусто;
  •  добавить элемент в дерево;
  •  удалить элемент из дерева;
  •  найти элемент с заданным значением;
  •  опустошить дерево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №18

Разработать программу, которая демонстрирует управление структурами данных типа «неупорядоченное 2-3-дерево», элементы которого занимают 12 кб. Операции, выполняемые над деревом (при этом определяется один узел дерева, являющийся его корнем, все значения в узлах дерева разные, количество потомков каждого узла – не более трех):

  •  проверить, дерево пусто/не пусто;
  •  добавить элемент в дерево;
  •  удалить элемент из дерева;
  •  найти элемент с заданным значением;
  •  опустошить дерево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №19

Разработать программу, которая демонстрирует управление структурами данных типа «линейный двунаправленный список» (L2-list), элементы которого занимают 10 кб. Операции, выполняемые над списком (при этом определяется указатель списка, элемент списка за указателем и элемент до указателя):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  установить указатель в конец списка;
  •  обменять значения элементов за указателем и до указателя, если это возможно;
  •  добавить элемент за указателем;
  •  добавить элемент до указателя;
  •  удалить элемент за указателем;
  •  удалить элемент до указателя;
  •  просмотреть элемент за указателем;
  •  просмотреть элемент до указателя;
  •  переместить указатель вправо;
  •  переместить указатель влево.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №20

Разработать программу, которая демонстрирует управление структурами данных типа «линейный однонаправленный список» (L1-list), элементы которого занимают 15 кб. Операции, выполняемые над списком (при этом определяется указатель списка и элемент списка за указателем):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  добавить элемент за указателем;
  •  удалить элемент за указателем;
  •  просмотреть элемент за указателем;
  •  переместить указатель вправо;
  •  обменять значения начала списка и элемента за указателем.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №21

Разработать программу, которая демонстрирует управление структурами данных типа «линейный однонаправленный список» (L1-list), элементы которого занимают 12 кб. Операции, выполняемые над списком (при этом определяется указатель списка и элемент списка за указателем):

  •  проверить, список пуст/не пуст;
  •  установить указатель в начало списка;
  •  добавить элемент за указателем;
  •  удалить элемент за указателем;
  •  просмотреть элемент за указателем;
  •  переместить указатель вправо;
  •  обменять значения конца списка и элемента за указателем.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №22

Разработать программу, которая демонстрирует управление структурами данных типа «стек», элементы которого занимают 10 кб. Операции, выполняемые над стеком:

  •  проверить, стек пуст/не пуст;
  •  втолкнуть элемент;
  •  вытолкнуть элемент;
  •  просмотреть вершину стека;
  •  обменять значения первого и третьего сверху элементов стека.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №23

Разработать программу, которая демонстрирует управление структурами данных типа «дек» (очередь с двумя концами), элементы которого занимают 15 кб. Операции, выполняемые над деком:

  •  проверить, дек пуст/не пуст;
  •  добавить элемент в левый конец дека;
  •  добавить элемент в правый конец дека;
  •  удалить элемент слева;
  •  удалить элемент справа;
  •  просмотреть элемент слева;
  •  просмотреть элемент справа;
  •  обменять значениями элементы на концах дека.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №24

Разработать программу, которая демонстрирует управление структурами данных типа «динамический вектор» (одномерный массив), элементы которого занимают 12 кб. Операции, выполняемые над вектором (при этом определяются начало и конец вектора, индекс элемента вектора):

  •  проверить, вектор пуст/не пуст;
  •  прочитать элемент с указанным индексом;
  •  изменить значение элемента с указанным индексом;
  •  добавить элемент в конец вектора;
  •  опустошить вектор;
  •  обменять значениями текущий элемент и конец вектора.

Воспользоваться механизмом управления разделами виртуальной

памятью.

Вариант №25

Разработать программу, которая демонстрирует управление структурами данных типа «последовательность» (файл в оперативной памяти), элементы которого занимают 10 кб. Операции, выполняемые над последовательностью (при этом определяются указатель на текущий элемент, начало и конец последовательности):

  •  проверить, последовательность пуста/не пуста;
  •  установить указатель в начало последовательности;
  •  прочитать элемент последовательности;
  •  добавить элемент в конец последовательности;
  •  опустошить последовательность;
  •  обменять значениями текущий элемент и конец последовательности.

Воспользоваться механизмом управления разделами виртуальной

памятью.




1. Проблема взаємодії людини з природою в історії філософії
2. Показатель 2 В названии любого ОСП содерж
3. .Нормативноправовое регулирование несостоятельности банкротства в России
4. Лабораторная работа- Изучение работы с файлами на языке Delphi.html
5. Введение Право на защиту жизни здоровья свободы собственности и других благ является важнейшим естест
6. К. Рериха. Его не случайно называют Водителем Культуры
7. . Економічна теорія
8. ВСТУП Фондова біржа це організаційна форма ринку на якому здійснюється торгівля цінними паперами
9. LECTURE 7 ntithesis is stylistic device presenting two contrsting ides in close neighborhood
10. Методы проведения экспертиз при разработке управленческих решений
11. реферату- Диявольська спокуса розумуРозділ- Твори шкільні Диявольська спокуса розуму Будьте тверезi пиль
12. тематик юрист философ считается последним видным представителем философии нового времени и предшественн
13. Запорізька Січ у 18 столітті
14. ДРОБЬ буквы не повторяются 1 2
15. Московское царство 1
16. по теме- Политические и правовые учения в Древнем мире
17. капл до 6 р 2 3 Антисепт риніт Sol Нафтизину 0
18. Контрольная работа 1 Учебный шифр- 0965АТС1028 Задача 1 Рассчитать и построить амплитудночастотные спек
19. Функции почек
20. из варяг в греки и проповедовал новую религию