Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.11.2016, 17:44
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Распределение памяти. Алгоритм

Написать программу, моделирующую динамическое распределение памяти в операционной системе. В качестве модели оперативной памяти программа должна использовать байтовый массив размера не менее 1024 байт. Использование других глобальных переменных в программе запрещено (то есть вся информация о свободных/занятых участках должна храниться внутри массива). В программе в обязательном порядке должны присутствовать следующие функции:
а) выделить участок заданного размера. В случае успеха вывести начальный адрес выделенного участка. Если участка подходящего для выделения не найдено, необходимо вывести диагностическое сообщение о нехватке памяти.
б) освободить ранее выделенный участок. В качестве параметра функция должна принимать начальный адрес освобождаемого участка. Ранее выделенный участок может быть освобожден только целиком (освобождение части участка не допускается).
в) получить информацию о свободных/занятых участках в «оперативной памяти» (количество участков каждого типа, начальные адреса, размеры, общее количество занятой и свободной памяти).

Условие!!! Алгоритм выделения - наиболее подходящий; способ хранения информации - список блоков !!!

Устно это я понимаю так: потребуется объявить массив типа Byte и размерностью [0..1023]
Потом сделать еще один массив, в котором будут храниться начальные координаты занятых участков памяти и их длина.
Потом сделать функцию, в которую задают необходимый размер памяти, и которая пробегает по массиву в поисках незанятого участка.
Потом сделать процедуру, которая будет высвобождать память.
Потом сделать функцию, которая выводит информацию об участке памяти по его начальному значению
Потом сделать функцию, которая выводит информацию по всем участкам памяти.

Итого, два массива (один из них динамический), три функции и одна процедура.

Необходимо сделать это в среде Delphi 7. Алгоритм,сказали, должен быть создан через консольное приложения. Помогите с кодом, пожалуйста. Заранее спасибо!
Ответить с цитированием
  #2  
Старый 05.11.2016, 19:17
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Массив должен быть только один!!!

Цитата:
вся информация о свободных/занятых участках должна храниться внутри массива
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 05.11.2016, 21:14
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Распределение памяти. Алгоритм

Хорошо, уже что-то. А можно пример процедуры/функции, которая выводит информацию об участке памяти по его начальному значению?
Ответить с цитированием
  #4  
Старый 06.11.2016, 02:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тут в задании несоответствие.
с одной стороны - массив байт.
С другой - "способ хранения информации - список блоков"
Т.е. либо у нас список, либо массив.

Хотя тут может быть такое: физическая память представляется массивом (одним), а вот информация менеджера памяти хранится в виде списка блоков. Т.е. на самом деле 2 массива.
Ответить с цитированием
  #5  
Старый 06.11.2016, 08:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Ну вот физическая память в ПК как-то уже несколько десятилетий обходится одним массивом байт и ведь все работает Никто в этом задании не запрещает хранить таблицу менеджера памяти в том же массиве. А еще есть дисковые устройства...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 06.11.2016, 09:16
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну самое простое — зацапать первые (1 + block_size/total_size байт)/8, где каждый бит будет определять признак занятости блока памяти. Мастдай операционные системы так и делают.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 06.11.2016 в 09:20.
Ответить с цитированием
  #7  
Старый 06.11.2016, 09:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Чтобы при освобождении памяти не заморачиваться с выделенным объемом придется хранить таблицу: начальный адрес, размер.
Код:
procedure GetMem(var P: Pointer; Size: Integer);
procedure FreeMem(var P: Pointer);
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 06.11.2016, 14:28
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да, в условии небольшое несоответствие: информация должна храниться в виде списка блоков.
Ответить с цитированием
  #9  
Старый 06.11.2016, 14:59
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

То есть, у нас должен быть массив блока памяти 1..1024 и структурная запись в которой хранится начальный адрес памяти и его длина ? Ну а дальше я должен буду создать глобальные функции/процедуры для работы с памятью, так ли?
Ответить с цитированием
  #10  
Старый 06.11.2016, 19:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну, получается, что так.
А у препода разъяснения спросить?
Ответить с цитированием
  #11  
Старый 07.11.2016, 20:25
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Не, у препода никак не спросить: он ничего не говорит. Можно пример кода, как создать этот массив вместе с записью?
Ответить с цитированием
  #12  
Старый 07.11.2016, 20:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  LHeap: array [0..1023] of Byte;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 08.11.2016, 21:40
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ну а структурная запись в которой хранится начальный адрес памяти и его длина? Это же уже в разделе type?
Ответить с цитированием
  #14  
Старый 08.11.2016, 21:50
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
type
  TStruct = record
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 10.11.2016, 22:20
theonewhocantbecalled theonewhocantbecalled вне форума
Прохожий
 
Регистрация: 05.11.2016
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

NumLock, ты же пишешь проги за еду) Я могу покормить тебя в приложение в ВК, если сделаешь эту прогу) Это задание мне, пока что, не по уровню. Теоретически я понял что нужно сделать, но реализовать сам код я точно не смогу. Хотя бы в самом коротком виде
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter