Программа для управления памятью для задачи на С - PullRequest
0 голосов
/ 10 октября 2010

У меня есть задача для решения, это немного загадочно. Задача состоит в том, чтобы сделать программу на C, которая обрабатывает текстовые сообщения, программа должна имитировать систему с небольшим объемом памяти, система должна иметь возможность хранить только X сообщений с максимальным количеством символов X, каждый символ занимает 1 байт (ASCII) , Для управления сообщениями я должен сделать систему, которая хранится в основной памяти (для симуляции системы с ограниченной памятью). При запуске программы программа должна выделить ОДНУ область памяти для всей информации для сообщений.


Это называется метаданной структурой в задаче:

Область памяти, используемая для хранения в целом, чтобы быть непрерывной в памяти, но разделенной на 32 байта блоков данных, количество блоков данных в системе должно быть ограничено 512.

В заданиях также сказано, что я должен создать X блоков данных числа, X зависит от значения сообщения числа X, которое система должна содержать.

Мне кажется, мне нужно создать структуру, например кольцевой буфер, для хранения каждого сообщения (блока данных?).


Это называется растровым изображением для блоков данных:

Чтобы отследить свободный и занятый блок данных ведьмы, я должен реализовать растровое изображение, где у меня есть 1, но для каждого блока данных. Значение бита 0 (занято) / 1 (свободно). Это растровое изображение следует использовать для поиска свободных блоков данных, когда я хочу добавить сообщение. Растровое изображение должно быть актуальным, когда системы удаляют или создают блок данных для сообщения.

Выделенная память для этой системы должна быть разделена на 3 блока / области, 1 для метаданной структуры, 1 для растрового изображения для каждого блока данных и 1 для блоков данных.


Мне нужна помощь, чтобы вслух рассказать о решениях и о том, как это можно решить в C. Спасибо

1 Ответ

2 голосов
/ 10 октября 2010

В начале вашей программы malloc большой блок.Указатель возврата находится там, где он начинается, и вы знаете, насколько велик запрашиваемый блок, чтобы вы знали, где он заканчивается.

Это хранилище вашей памяти.

Напишите распределитель и разделитель, которые используют хранилище (и только хранилище), и вызовите их из остальной части вашей программы вместо вызовов malloc и free ...


Эта задача также может быть выполнена с колоссальным большим массивом и использованием смещений массива в качестве эквивалентов указателя, но это было бы глупо в c.Я упоминаю об этом только потому, что в течение многих лет я использовал такую ​​конструкцию в Фортране в основной части программного обеспечения для физики элементарных частиц под названием PAW .


относительно битовой карты

Ваш распределитель должен всегда знать, какие части магазина используются, а какие нет.Это единственный способ, которым он может надежно дать вам неиспользованный блок, верно?Поддержание растрового изображения - один из способов сделать это.

Почему это хорошо?Представьте, что вы уже давно используете эту память.Многие объекты были размещены в этом пространстве, а некоторые были освобождены.Доступное пространство не является длинным непрерывным, но вместо этого является довольно неоднородным.

Внезапно вам нужно выделить большой объект.

Где вы найдете большой кусок непрерывногосвободной памяти, чтобы положить его в?Сканирование растрового изображения будет быстрее, чем обход сложной структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...