Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 07.10.2013
Сообщений: 58

Стратегия управления оперативной памятью

08.12.2015, 13:37. Показов 643. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите редактировать код, чтобы сортировка данных йшла по убыванию
Стратегия наименее пригоден.
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <new>

using namespace std;

typedef unsigned int ui;

class MemoryManager {
protected:
struct MMI {
ui address = 0;
ui size = 0;
bool free = true;
MMI * previous = nullptr;
MMI * next = nullptr;
} *oHEAD = nullptr, *oTAIL = nullptr, *fHEAD = nullptr, *fTAIL = nullptr;

ui start_address = 0;
ui number_of_free_blocks = 0;
ui number_of_occupied_blocks = 0;
ui size_of_allowed_memory = 0;

void firstAllocateMemory(ui size) {
this->fHEAD = new MMI;
this->fHEAD->address = this->start_address;
this->fHEAD->size = size;
this->fHEAD->free = true;
this->fTAIL = this->fHEAD;
}

void unite() {
MMI * tmpo = this->oHEAD;

if (tmpo) {
tmpo->address = this->start_address;
tmpo = tmpo->next;
while (tmpo) {
tmpo->address = tmpo->previous->address + tmpo->previous->size;
tmpo = tmpo->next;
}
}

MMI * tmpf = this->fHEAD;
MMI * new_free_node = new MMI;
MMI * old_tmp;

if (tmpf) {
new_free_node->size += tmpf->size;
old_tmp = tmpf;
tmpf = tmpf->next;
delete old_tmp;
while (tmpf) {
new_free_node->size += tmpf->size;
old_tmp = tmpf;
tmpf = tmpf->next;
delete old_tmp;
}

if (this->oTAIL) new_free_node->address = this->oTAIL->address + this->oTAIL->size;
else new_free_node->address = start_address;

this->fHEAD = new_free_node;
this->fTAIL = new_free_node;
this->number_of_free_blocks = 1;
}

return;
}



//Разбивает блок на два блока
MMI * partitionBlock(MMI *& block, ui realSize) {
MMI * tmp = new MMI;

tmp->address = block->address;
tmp->size = realSize;
block->address += tmp->size;
block->size -= realSize;
this->number_of_free_blocks++;

return tmp;
}

MMI * searchBlock(ui size) {
MMI * f = this->fHEAD;
ui index = 0, indexSize = 0;
bool find = false;

//Нахождение самого неподходящего блока
for (ui i = 0; f; ++i) {
if (f->size >= size) {
if (f->size > indexSize) {
indexSize = f->size;
index = i;
find = true;
}
}
f = f->next;
}

//Прогон списка к самому подходящему блоку
f = this->fHEAD;
for (ui i = 0; f && i < index; ++i) f = f->next;

//Если блок не равен запрашиваемому размеру, разделить блок
if (find)
{
if (f->size != size) {
//f = this->partitionBlock(f, size);
return this->partitionBlock(f, size);
}
if (f->previous) f->previous->next = f->next;
else this->fHEAD = f->next;
if (f->next) f->next->previous = f->previous;
else this->fTAIL = f->previous;
f->previous = nullptr;
f->next = nullptr;
}

return find ? f : nullptr;
}

bool allocate(ui size) {
MMI * otmp = this->searchBlock(size);
if (!otmp) {

this->unite();
otmp = this->searchBlock(size);
if (!otmp) return false;
}
if (!oHEAD) {
this->oHEAD = otmp;
this->oHEAD->free = false;
this->oHEAD->next = nullptr;
this->oHEAD->previous = nullptr;
this->oTAIL = this->oHEAD;

this->number_of_occupied_blocks++;
this->number_of_free_blocks--;
return true;
}
this->number_of_free_blocks--;
this->number_of_occupied_blocks++;

otmp->free = false;
this->insertOccupiedBlock(otmp);
/*otmp->previous = this->oTAIL;
this->oTAIL->next = otmp;
this->oTAIL = otmp;*/
return true;
}

void insertOccupiedBlock(MMI * occupied_block) {
MMI * tmp = this->oHEAD;
bool find = false;

ui index = 0, address = 0;

for (ui i = 0; tmp; tmp = tmp->next, i++) {
if (tmp->address < occupied_block->address) {
if (tmp->address >= address) {
address = tmp->address;
index = i;
find = true;
}
}
}

tmp = this->oHEAD;
for (ui i = 0; i < index && tmp; ++i, tmp = tmp->next);

if (find) {
occupied_block->next = tmp->next;
occupied_block->previous = tmp;
tmp->next = occupied_block;
if (!occupied_block->next) this->oTAIL = occupied_block;
}
else {
occupied_block->next = tmp;
occupied_block->previous = nullptr;
tmp->previous = occupied_block;
this->oHEAD = occupied_block;
}

occupied_block->free = true;
}

MMI * searchBlockFromIndex(ui index) {
MMI * occupied_node = this->oHEAD;

for (ui i = 0; i < index && occupied_node; ++i, occupied_node = occupied_node->next);

return occupied_node;
}

void insertFreeBlock(MMI * free_block) {
MMI * tmp = this->fHEAD;
bool find = false;

ui index = 0, address = 0;

for (ui i = 0; tmp; tmp = tmp->next, i++) {
if (tmp->address < free_block->address) {
if (tmp->address >= address) {
address = tmp->address;
index = i;
find = true;
}
}
}

tmp = this->fHEAD;
for (ui i = 0; i < index && tmp; ++i, tmp = tmp->next);

if (find) {
free_block->next = tmp->next;
free_block->previous = tmp;
tmp->next = free_block;
if (!free_block->next) this->fTAIL = free_block;
}
else {
free_block->next = tmp;
free_block->previous = nullptr;
tmp->previous = free_block;
this->fHEAD = free_block;
}

free_block->free = true;
}


public:
MemoryManager(){};
MemoryManager(ui size) {
this->size_of_allowed_memory = size;
this->firstAllocateMemory(size);
}

~MemoryManager() {
MMI * tmp = this->fHEAD;

while (this->fHEAD) {
tmp = this->fHEAD;
this->fHEAD = this->fHEAD->next;
cout << "delete free" << endl;
delete tmp;
}

tmp = this->oHEAD;
while (this->oHEAD) {
tmp = this->oHEAD;
this->oHEAD = this->oHEAD->next;
cout << "delete occupied" << endl;
delete tmp;
}
}

bool setAllowedMemory(ui size) {
if (this->size_of_allowed_memory != 0) return false;
this->size_of_allowed_memory = size;
this->number_of_free_blocks++;
this->firstAllocateMemory(size);
return true;
}

bool allocateMemory(ui size) {
if (size > this->size_of_allowed_memory || size == 0) return false;
else return this->allocate(size);
}

bool freeMemory(ui index){
if (index > this->number_of_occupied_blocks) return false;

MMI * tmp = this->searchBlockFromIndex(index);

if (!tmp) return false;

if (tmp->previous) tmp->previous->next = tmp->next;
else this->oHEAD = tmp->next;
if (tmp->next) tmp->next->previous = tmp->previous;
else this->oTAIL = tmp->previous;

this->insertFreeBlock(tmp);

this->number_of_free_blocks++;
this->number_of_occupied_blocks--;

return true;
}

void show() {
cout << "--------------------------------" << endl;
cout << "Size: " << this->size_of_allowed_memory << endl;
cout << "Occupied blocks: " << this->number_of_occupied_blocks << endl;
cout << "Free blocks: " << this->number_of_free_blocks << endl;

MMI * tmp = this->oHEAD;
this->oTAIL;

cout << std::boolalpha;
cout << "\nOccupied blocks:" << endl;
cout << "Address:\tFree:\tSize:" << endl;
while (tmp) {
cout << tmp->address << "\t\t" << tmp->free << "\t" << tmp->size << endl;
tmp = tmp->next;
}

tmp = this->fHEAD;
this->fTAIL;

cout << "\nFree blocks:" << endl;
cout << "Address:\tFree:\tSize:" << endl;
while (tmp) {
cout << tmp->address << "\t\t" << tmp->free << "\t" << tmp->size << endl;
tmp = tmp->next;
}
cout << "--------------------------------" << endl;
}
};

void menu();

int main() {



menu();

return 0;
}

void menu() {
MemoryManager mmi;

mmi.setAllowedMemory(700);

char mode;
ui tmp = 0;

do {
cout << "A - allocate memory" << endl;
cout << "F - free memory" << endl;
cout << "M - map of memory" << endl;
cout << "E - exit" << endl;
cin >> mode;

switch (mode) {
case 'A':
case 'a':
cout << "Size of allowed memory: ";
cin >> tmp;
mmi.allocateMemory(tmp);
mmi.show();
break;
case 'F':
case 'f':
cout << "Set index for free memory: ";
cin >> tmp;
mmi.freeMemory(tmp);
mmi.show();
break;
case 'M':
case 'm':
mmi.show();
break;
case 'E':
case 'e':
default: break;
}

} while (mode != 'E' && mode != 'e');

}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2015, 13:37
Ответы с готовыми решениями:

Разработка подсистемы управления памятью
Нужно разработать подсистему управления памятью с сегментной организацией виртуальной памяти и алгоритмом замещения страниц LRU. Честно...

Работа с оперативной памятью
Доброго дня. Есть интересная задача. Планируется создание чего-то типа сканера оперативной памяти. Необходимо сделать его работающим из под...

Си/Си++/Линукс, тесты на тему управления памятью и работе с ос линукс, папками и каталогами
Создал его в гугл формах, там вопросы об управлении памятью и тест по работе с ос Линукс, папками и каталогами. Заранее благодарю всех...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2015, 13:37
Помогаю со студенческими работами здесь

Заморочка с оперативной памятью!
Проблема в следующем: в играх стал вылетать синий экран( по коду смотрел что что-то с оперативной памятью), после перезагрузки таже игра...

Проблемы с оперативной памятью
Добрый День! Прошу вас о помощи. У меня в Материнской плате 4 разъема для оперативной памяти. Два желтых и два черных. Идут они: Желтый...

Проблемы с оперативной памятью
Переустановил винду с х64 на х32... Биос видит 8 Гб, а винда видит 4Гб памяти... Неужели из-за разрядности системы?

Сложности с оперативной памятью
Недавно столкнулся с такой проблемой, что на компьютер стал дико глючить, как в играх, так и в браузере (пользуюсь Хромом).Памяти у меня 8...

Чудеса с оперативной памятью
Здравствуйте! система - 7ка стояло 4 гб оператиной памяти, но этого не хватало(тормозили некоторые программы), сделали вывод,что надо...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru