Автор: Пользователь скрыл имя, 15 Июня 2012 в 14:25, лабораторная работа
Продумайте систему сегментного хранения информации. Исходные данные:
Программа на Cи (Си++), под Windows, Консольное приложение.
Вся доступная память представлена массивом 10 КБайт. Все операции с выделением, доступом и освобождением памяти проводятся только с памятью внутри этого массива.
Санкт-Петербургский
Государственный
Кафедра
Измерительных Информационных Технологий
Отчет по дисциплине Операционные системы
По лабораторной работе №1
По теме
«Менеджер сегментированной памяти»
Выполнил:
Разов Владимир
группа 1085/4
2012
Санкт-Петербург
Задание
Продумайте систему сегментного хранения информации. Исходные данные:
Инициализация менеджера памяти (если необходима) должна вся находиться в функции:
void InitMemory(void);
int AllocMemory(int Size);
Size – запрашиваемый размер в байтах.
Функция возвращает описатель выделенного блока или 0, если нет доступной памяти.
void FreeMemory(int MemoryHandle);
MemoryHandle – описатель ранее выделенной памяти.
int WriteMemory(int MemoryHandle, int Offset, int Size, void *Data);
MemoryHandle – описатель ранее выделенной памяти.
Offset – смещение внутри выделенного блока от его начала до места с которого необходимо записать данные.
Size – размер блока данных для записи в байтах.
Data – указатель на буфер, содержащий данные для копирования.
Функция возвращает 0, если запись в память осуществлена корректно или 1, если произошла какая-либо ошибка.
int ReadMemory(int MemoryHandle, int Offset, int Size, void *Data);
MemoryHandle – описатель ранее выделенной памяти.
Offset – смещение внутри выделенного блока от его начала до места с которого необходимо прочитать данные.
Size – размер блока данных для чтения в байтах.
Data – указатель на буфер, куда должны быть скопированы данные. Функция возвращает 0, если чтение из памяти осуществлено корректно или 1, если произошла какая-либо ошибка.
void DumpMemory(void);
Функция выводит на экран для каждого блока внутри массива следующую информацию (одна строка на один блок):
Пример:
H:35 B:1234 S:345 Yes 2,3,3,2,1,1,2,3,4,5
Здесь: H–описатель, B-начало блока, S-размер блока, Yes(No)-занят или свободен блок.
- Когда у вас происходит «утряски» памяти, в момент выделения памяти или в момент освобождения и почему? Приведите пример когда выгоднее использовать противоположную модель«утряски» памяти.
- Можно ли в качестве
описателя блока использовать смещение
внутри массива памяти (в 10 кБайтов)? Если
да, то что для этого нужно?
Принцип работы
Структура.
Каждый сегмент описывается структурой типа Block.
Свойства:
Инициализация.
Определяется
количество свободной памяти.
Создание
нового сегмента (выделение)
памяти.
Метод принимает размер выделяемой памяти в байтах (int) и возвращает handle сегмента или 0, если выделение невозможно (int).
Создание происходит по сценарию:
Освобождение
памяти.
Функция принимает handle (int).
Производим
поиск совпадения ID (handle) по всем сегментам,
удаляем сегмент. Удаление заключается
в «занулении» элементов массива, принадлежащих
данному и присвоении биту занятости 0.
Запись
данных
Функция принимает описатель ранее выделенной памяти(Handle), смещение внутри выделенного блока от его начала до места с которого необходимо записать данные(Offset), размер блока данных для записи в байтах(Size), указатель на буфер, содержащий данные для копирования(Data).
Первоначально ищется сегмент с необходимым описателем(Handle), предполагается, что сегмент с необходимым описателем выделен. Затем проверяются следующие условия:
Смещение меньше, чем размер сегмента.
Если хоть одно из условий не выполняется то запись не осуществляется и функция возвращает 1.
Затем, начиная
со смещения данные побайтово копируются
из буфер (указатель на него подается
в функцию).
Чтение
данных
Функция принимает описатель ранее выделенной памяти(Handle), смещение внутри выделенного блока от его начала до места с которого необходимо записать данные(Offset), размер блока данных для записи в байтах(Size), указатель на буфер, куда должны быть скопированы данные(Data).
Первоначально ищется сегмент с необходимым описателем(Handle), предполагается, что сегмент с необходимым описателем выделен. Затем проверяются следующие условия:
Смещение меньше, чем размер сегмента.
Если хоть одно из условий не выполняется то запись не осуществляется и функция возвращает 1.
Затем, начиная
со смещения данные побайтово копируются
в буфер (указатель на него подается
в функцию).
«Утряска»
памяти.
Ищется
сегмент, у которого бит занятости равен
0. Затем все сегменты смещаются на его
размер. Затем каждую структуру, у которой
поле bool Bit равно 0 удаляем и производим
смещение всех структур на её размер.
Дамп
памяти
Данная
функция выводит информацию о
блоках. Выводятся данные сегментов, у
которых у описывающей структуры переменная
Sort не равна 1. Так же выводится информация
о количестве свободной памяти.
Вывод.
Листинг
test.cpp
#include "prot.h"
#include "stdio.h"
#include "conio.h"
#include <locale.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main(int)
{
setlocale(LC_ALL, "Russian_Russia.1251");
InitMemory();
int h=AllocMemory(1500);
DumpMemory();
printf("\n");
int m=AllocMemory(1500);
DumpMemory();
printf("\n");
int k=AllocMemory(1500);
int Offset=2;
char xm[]="ololosh\0";
void *Data=(void*)xm;
int Offset1=3;
int Size1=7;
char ololo[30]="\0";
void *Data1=(void*)ololo;
WriteMemory(m, Offset,sizeof(xm),Data);
ReadMemory(m, Offset1,Size1,Data1);
DumpMemory();
printf("\n");
Информация о работе Отчет по дисциплине Операционные системы