|
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
|
|
| 08.12.2015, 13:37 | |
|
Ответы с готовыми решениями:
0
Разработка подсистемы управления памятью Работа с оперативной памятью Си/Си++/Линукс, тесты на тему управления памятью и работе с ос линукс, папками и каталогами |
| 08.12.2015, 13:37 | |
|
Помогаю со студенческими работами здесь
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|