Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
aurora_87
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 5
#1

списки(управление свободной памятью ОС в С) - C++

09.06.2010, 21:30. Просмотров 410. Ответов 0
Метки нет (Все метки)

Необходимо написать программу выделения и возврата свободной памяти по алгоритму "наиболее подходящему".
Существуют свободные участки(дыры) ( наверное, нужно хранить размер участка и адрес), вводим размер задания и ищем дыру, размер которой меньше всех превосходит размер требуемого задания и помещаем туда это задание. Для облегчения поиска список дыр должен быть отсортирован по возрастанию размеров дыр.
Помогите исправить программу: может можно как-то проще сделать, в массивах например
Код
#include <stdio.h>

#define BUF_SIZE 1024 // обьем памяти

#define BSIZE sizeof(block)


typedef struct block 
{
  long size;  
  struct block* next;

} block;
// память
char buffer[BUF_SIZE];


void* my_malloc(long size)
{
  static char is_first = 1;
 
 block *p, *prev, *min;
  
p = prev = min = NULL;
  
  
if(size <= 0)  return NULL;
  
  
if(is_first) 
{  // создание фиктивного блока( голова списка )
    
p = (block*)buffer;
    
p->next = p + 1;
    p->size = 0;
    
p++;
    p->next = NULL;
    
p->size = BUF_SIZE - 2*BSIZE; 
    
is_first = 0;
  }

  
size = (size + BSIZE - 1) &~ (BSIZE - 1);  // доводим размер нужной памяти до кратности размера блока
  
p = (block*) buffer;   
 
p = p->next;
  min = p;

// нахождение минимального элемента в списке
  
for(; p != NULL; prev = p, p = p->next)
    
if( p->size > size && p->size < min->size ) min = p; 
  
p = min;
    
  
  
if( !p )  return NULL;
  
  
if(p->size > size) {
    p->size -= size + BSIZE;   // отрезание нужного куска памяти от найденного блока
    
p = (block*)(((char*)p) + p->size + BSIZE);  
   
 p->size = size;
    p->next = NULL;
  }
else
    prev->next = p->next;
   
 return (void*) ((block*) ( (char*)p + BSIZE) );
}



void my_free(void *ptr)
{
  block *p, *tmp, *t;
  
p = (block*) buffer;
  tmp = NULL;
  
t = (block*)((char*)ptr - BSIZE);
  
  
if( !ptr) return;
  
  // поиск подходящего места для вставки в список с сохранением предыдущего элемента( имитация двусвязного списка )
  
for(; p && p < t; tmp = p, p = p->next); 
  
  
t->next = tmp->next;
  tmp->next = t;
  
  
// обьединение свободных блоков
  
if( (block*)((char*)t + BSIZE + (t->size)) == t->next)
{ 
    t->size += t->next->size + BSIZE;
   
 t->next = t->next->next;
  }
  
if( (block*)((char*)tmp + BSIZE + tmp->size) == tmp->next )
{
    tmp->size += t->size + BSIZE;
    tmp->next = t->next;
  
}

}


void print()
{
  block *p = NULL;
  
int i = 1;
 
 p =(block *) buffer;
  
while (p != NULL)
{
    
printf("%d, p = %p, p->size = %ld, p->next = %p\n",i++, p, p->size, p->next);
    
//printf("%d ", p->size);
    
p = p->next;
  
}
  
printf("\n");

}


int main() 
{
  char *a = my_malloc(100);
  
print();
  
char *b = my_malloc(234);
 
 print();
 
 my_free(a);
 
 print();
 
 char *c = my_malloc(150);
 
 char *d = my_malloc(5);
 
 my_free(c);
  my_free(b);
  
print();
  
my_free(d);
  
print();
  
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2010, 21:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос списки(управление свободной памятью ОС в С) (C++):

управление памятью - C++
500 Кбайт физической памяти в системе. Размер блока памяти 2 кбайт. Выделить блок , стратегия выделение быстрый подходящий

Управление памятью - C++
Заранее прошу прощения за глупый вопрос (задаю его по причине новизны для меня C++) У меня есть функция, которая делает какие-то...

Управление памятью в C++ - C++
Здравствуйте! Сколько уже читаю про указатели, но никак не пойму кое-что: когда их использовать? Когда нужно думать о распределении памяти...

Управление памятью - C++
1. Требования к управлению памятью 1.1. перемещение 1.2. защита 1.3. совместное использование 1.4. логическая организация ...

Работа с allocator (управление памятью) - C++
Нормальной инфы на русском языке я так и не нашел в инете( про него читал в книге Программирование принципы и практика С++ Страуструп, но...

Управление памятью с использованием malloc и free - C++
int n=3; int * v = (int*) malloc(n*sizeof(int)); // обьявил вектор из 3-х целочисельных елементов v = 0; v = 1; v =...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2010, 21:30
Привет! Вот еще темы с ответами:

Программирование с использованием ссылок. Управление памятью в С++ - C++
Народ, помогите программу написать, пожалуйста. Условие : Написать программу с использованием операций управления памятью для...

Управление динамической памятью при работе с классами - C++
Всем привет! Есть очень сложный класс, внутри которого есть куча указателей, в его конструкторе все эти указатели получают память при...

Реализовать алгоритм работы планировщика. Управление виртуальной памятью. Управление файловой системой - C++
Разработка программы менеджера памяти. Свопинг. Сегментная схема организации памяти. Управление виртуальной памятью. Глобальное и локальное...

Управление памятью другой программы - C++
Добрый день. Необходим постоянно устанавливать значение переменной в другой запущенной программе в 0. Ну это понятно, что значение надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru