Главная страница

№1 Лабораторная работа (2). Отчет по лабораторной работе 1 по Технологиям и методам программирования


Скачать 21.02 Kb.
НазваниеОтчет по лабораторной работе 1 по Технологиям и методам программирования
Дата18.04.2022
Размер21.02 Kb.
Формат файлаdocx
Имя файла№1 Лабораторная работа (2).docx
ТипОтчет
#483145


Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования
«Новосибирский государственный технический университет»

Кафедра Автоматизированных систем управления

Отчет

по лабораторной работе №1

по Технологиям и методам программирования

МОДЕЛИРОВАНИЕ СИСТЕМЫ УПРАВЛЕНИЯ ВИРТУАЛЬНОЙ ПАМЯТЬЮ

Выполнил Проверил

студенты гр. АП-026 Лукоянычева О.В.

Губарев Артём

Заикин Данил

г. Новосибирск

2022г.

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

Постановка задачи
Реализовать класс для управления виртуальной памятью. Объект этого класса моделирует массив целого типа очень большой размерности (>10000 элементов).

При создании объекта инициализируется файл подкачки (двоичный файл прямого доступа). Файл содержит сигнатуру - два байта, представляющие символы ‘ВМ’, и блоки (страницы) размерности 512 байт, Каждая страница состоит из элементов, соответствующих ячейкам моделируемого массива, и содержащих байты значений целого типа. Каждой странице предшествует битовая карта (массив байтов), в которой каждый бит соответствует ячейке моделируемого массива, находящейся на странице. Значение бита 0 означает, что в эту ячейку ничего не записано.

Количество страниц определяется путём выравнивания суммарного объема памяти моделируемого массива на границу страницы.

Описание работы классов
Класс VirtualMemory
Поля класса:
const string name = “Page” - часть имени файла .dat который будет хранить в себе страницу (часть массива размером 512 байт или 128 элементов значений типа int).
Page page - хранит в себе страницу памяти с которой в данный момент производятся действия (запись элементов, чтение, перезапись, удаление).
long arraySize - размер массива
long countPage - количество страниц для хранения массива размером arraySize
Конструктор класса принимает значение arraySize - размер массива. Далее вычисляется количество страниц для хранения массива заданного размера и создаются файлы .dat которые являются страницами памяти.

Определены методы для записи, чтения, перезаписи, удаления элементов.

Деструктор класса удаляет все созданные файлы .dat которые были использованы для хранения массива.
Класс Page
Хранит в себе массив значений data
Битовая карта (массив bool таким же размером как и data) которая хранит в себе сведения о том была ли произведена запись в ячейку массива.

Исходный код


Содержимое файла Program.cs

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.Serialization.Formatters.Binary;

using System.Text;

using System.Threading.Tasks;

namespace programming_technologies_labwork1

{

class Program

{

static void Main(string[] args)

{

Interface userInterface = new Interface();

userInterface.Run();

}

}

}

Содержимое файлаVirtualMemory.cs

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.Serialization.Formatters.Binary;

using System.Text;

using System.Threading.Tasks;

namespace programming_technologies_labwork1

{

public class VirtualMemory

{

const string name = "Page";

Page page;

long arraySize;

long countPage;

public VirtualMemory(long arraySize)

{

if (arraySize <= 0)

throw new Exception("Размер массива не может быть отрицательным или равным 0!");

this.arraySize = arraySize;

this.countPage = arraySize / Page.size;

Page[] pages = new Page[countPage + 1];

for (int i = 0; i <= this.countPage; i++)

{

pages[i] = new Page(i);

BinarySerializble(name + i.ToString() + ".dat" , pages[i]);

}

}

VirtualMemory()

{

for (int i = 0; i <= countPage; i++)

{

File.Delete(name + i.ToString() + ".dat");

}

}

public void writeValue(int index, int value)

{

if (index >= arraySize)

throw new Exception("Индекс за пределами массива!\n");

int numberPage = index/Page.size;

page = BinaryDeserializble(name + numberPage.ToString() + ".dat");

if (page.bitmap[index % Page.size] == true)

{

throw new Exception("В ячейку уже записанно значение!\n");

}

else

{

page.data[index % Page.size] = value;

page.bitmap[index % Page.size] = true;

}

BinarySerializble(name + numberPage.ToString() + ".dat", page);

}

public int readValue(int index)

{

if (index >= arraySize)

throw new Exception("Индекс за пределами массива!\n");

int numberPage = index / Page.size;

page = BinaryDeserializble(name + numberPage.ToString() + ".dat");

return page.data[index % Page.size];

}

public void deleteValue(int index)

{

if (index >= arraySize)

throw new Exception("Индекс за пределами массива!\n");

int numberPage = index / Page.size;

page = BinaryDeserializble(name + numberPage.ToString() + ".dat");

page.data[index % Page.size] = 0;

page.bitmap[index % Page.size] = false;

BinarySerializble(name + numberPage.ToString() + ".dat", page);

}

public void overwriteValue(int index, int value)

{

if (index >= arraySize)

throw new Exception("Индекс за пределами массива!\n");

int numberPage = index / Page.size;

page = BinaryDeserializble(name + numberPage.ToString() + ".dat");

if(page.bitmap[index % Page.size] == false)

{

throw new Exception("В ячейку не было ничего записанно!\n");

}

else

{

page.data[index % Page.size] = value;

}

BinarySerializble(name + numberPage.ToString() + ".dat", page);

}

public void printArray()

{

this.countPage = arraySize / Page.size;

for (int i = 0; i <= this.countPage; i++)

{

page = BinaryDeserializble(name + i.ToString() + ".dat");

Console.WriteLine("");

for (int j = 0; j < Page.size; j++)

{

if (j % 10 == 0 && j != 0)

Console.Write("\n");

Console.Write(page.data[j] + " ");

}

Console.WriteLine("");

}

}

public void printBitmap()

{

long countPage = arraySize / Page.size;

for (int i = 0; i <= countPage; i++)

{

page = BinaryDeserializble(name + i.ToString() + ".dat");

Console.WriteLine("");

for (int j = 0; j < Page.size; j++)

{

if (j % 10 == 0 && j != 0)

Console.Write("");

Console.Write(Convert.ToInt32(page.bitmap[j]) + " ");

}

Console.WriteLine("");

}

}

private void BinarySerializble(string path, Page page)

{

BinaryFormatter formatter = new BinaryFormatter();

using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))

{

formatter.Serialize(fs, page);

}

}

private Page BinaryDeserializble(string path)

{

BinaryFormatter formatter = new BinaryFormatter();

using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))

{

return (Page)formatter.Deserialize(fs);

}

}

}

}

Содержимое файла Page.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace programming_technologies_labwork1

{

[Serializable]

public class Page

{

public static int size = 128;

public int number;

public int[] data;

public bool[] bitmap;

public Page(int number)

{

this.number = number;

data = new int[size];

bitmap = new bool[size];

}

}

}

Содержимое файла Interface.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace programming_technologies_labwork1

{

class Interface

{

private VirtualMemory virtualMemory;

public Interface()

{

this.virtualMemory = null;

}

private void TakeAction(VirtualMemory virtualMemory)

{

int action, index, value;

string menu = "1 - Записать значение по индексу\n2 - Прочитать значение по индексу в переменную\n" +

"3 - Удалить значение по индексу\n4 - Перезаписать значение по индексу\n" +

"5 - Вывести массив на экран\n0 - Выйти\n";

Console.WriteLine(menu);

bool flag = true;

while (flag)

{

action = Convert.ToInt32(Console.ReadLine());

switch (action)

{

case 1:

Console.Write("Индекс = ");

index = Convert.ToInt32(Console.ReadLine());

Console.Write("Значение = ");

value = Convert.ToInt32(Console.ReadLine());

try

{

virtualMemory.writeValue(index, value);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("\n" + menu);

break;

case 2:

Console.Write("Индекс = ");

index = Convert.ToInt32(Console.ReadLine());

try

{

value = virtualMemory.readValue(index);

Console.WriteLine("Значение = {0}\n", value);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("\n" + menu);

break;

case 3:

Console.Write("Индекс = ");

index = Convert.ToInt32(Console.ReadLine());

try

{

virtualMemory.deleteValue(index);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("\n" + menu);

break;

case 4:

Console.Write("Индекс = ");

index = Convert.ToInt32(Console.ReadLine());

Console.Write("Значение = ");

value = Convert.ToInt32(Console.ReadLine());

try

{

virtualMemory.overwriteValue(index, value);

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

Console.WriteLine("\n" + menu);

break;

case 5:

virtualMemory.printArray();

break;

case 0: flag = false; break;

default: Console.WriteLine("Неверные данные\n"); break;

}

}

}

private VirtualMemory CreateArray()

{

VirtualMemory virtualMemory = null;

int action = 0;

Console.WriteLine("1 - Создать массив\n0 - Выйти\n");

bool flag = true;

while (flag)

{

action = Convert.ToInt32(Console.ReadLine());

switch (action)

{

case 0: flag = false; break;

case 1:

Console.WriteLine("Введите размер массива\n");

int arraySize = Convert.ToInt32(Console.ReadLine()); ;

try

{

virtualMemory = new VirtualMemory(arraySize);

flag = false;

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

break;

default: Console.WriteLine("Неверные данные\n"); break;

}

}

return virtualMemory;

}

public void Run()

{

try

{

virtualMemory = CreateArray();

if (virtualMemory != null)

{

TakeAction(virtualMemory);

}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

}

}



написать администратору сайта