Выделить / Отменить выделение ресурса - PullRequest
1 голос
/ 04 августа 2011

Я должен управлять ресурсом.Это в основном уникальный номер для идентификации соединения уровня 2 в коммутаторе.Таких соединений может быть 16 тыс., Поэтому каждый раз, когда пользователь желает настроить соединение, ему / ей необходимо назначить уникальный индекс.Точно так же, когда пользователь желает удалить соединение, ресурс (номер) должен быть освобожден и должен быть доступен для настройки (и идентификации) других соединений.На данный момент я использую растровое изображение, основанное на массивах без знака, чтобы поддерживать, какой бит установлен / не установлен

для мониторинга 16k чисел. Я использую массив без знака из 2048 байтов, где каждый бит представляет ресурс:

unsigned char bitmap_array[2048];

Есть ли лучший способ сделать то же самое, который не требует такого огромного куска статического распределения?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

другим способом может быть использование Set [Hash / Tree], размер которого будет выбираться динамически.каждый элемент находится в наборе тогда и только тогда, когда этот ресурс выделен.

проблемы с этим решением:
1.это будет медленнее.
2.когда количество элементов велико, это займет больше памяти, чем статический массив.

для 2k, я бы придерживался статического растрового массива.

еще одна возможность:

при использовании того же трюка Виртуальная память использует (страницы) .
разбейте ваш «массив» на N частей и создайте дополнительную таблицу размера N.
каждому элементу таблицы будет сопоставлена ​​часть массива, к которой он относится.
теперь, когда вы выделяете ресурс k, вам нужно будет выделить часть массива, в которой находится k, [и установить все остальные значения в 0].

это все равно будет медленнее, чем порция, и когда все входы распределены, это потребует дополнительных N * 4 байта.

Я бы использовал это решение, только если данные намного больше, чем 2k.

больше информации: http://tldp.org/LDP/tlk/mm/memory.html

0 голосов
/ 04 августа 2011

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

Мой C может быть немного искажен, но если я помню, он должен выглядеть так:

unsigned char *ptr = (unsigned char *) malloc(2048 * sizeof (unsigned char));
//insert null pointer check here

Просто не забудьте позвонить free, когда вы закончите ...

Серьезно, 2k статического распределения, вероятно, хорошо.

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