Любая парадигма использования памяти, кроме стека и кучи? - PullRequest
5 голосов
/ 23 февраля 2010

Поскольку я изучил структуру данных, я знаю, что существует множество других структур данных, кроме Stack и Heap, почему процессы в настоящее время содержат только эти две парадигмы в качестве «стандартного оборудования» в своем адресном пространстве?Может ли быть какая-то новая парадигма использования памяти?

Спасибо за ваши ответы.Да, я понял, что что-то не так с моим утверждением.Структура данных кучи не совпадает со структурой кучи в адресном пространстве процесса.Но что мне интересно, кроме области стека и области кучи в адресном пространстве proecss, есть ли новая парадигма использования памяти?Кажется, что другие способы использования памяти построены на этих двух основных парадигмах.И эти две парадигмы являются своего рода мета-парадигмами?

Ответы [ 8 ]

4 голосов
/ 23 февраля 2010

Давайте подумаем немного. У нас есть две основные дисциплины хранения. Смежные и раздробленные.

прилежащей.

  • Стек ограничен порядком. Последний в первом вышел. Вложенные контексты вызовов функций требуют этого.

  • Мы можем легко инвертировать этот шаблон, чтобы определить Очередь . Первым прибыл, первым обслужен.

  • Мы можем добавить границу в очередь, чтобы создать Круговую очередь . Обработка ввода-вывода требует этого.

  • Мы можем объединить оба ограничения в Dequeue .

  • Мы можем добавить ключ и порядок в очередь для создания Приоритетная очередь . Планировщик ОС требует этого.

    Итак. Это куча вариантов смежных структур, ограниченных порядком входа. И есть несколько реализаций этого.

  • Вы можете иметь непрерывное хранилище без ограничений по порядку ввода: Массив и Хеш . Массив индексируется по «позиции», хеш индексируется с помощью хэш-функции ключа.

Fragmented:

  • Голая «куча» - это фрагментированное хранилище без каких-либо связей. Это обычный подход.

  • У вас может быть кучное хранилище с помощью дескрипторов, чтобы разрешить перемещение. Для этого использовалась старая Mac OS.

У вас может быть фрагментированное хранилище со связями - списками, деревьями и т. П.

  • Связанные списки . Односвязные и двусвязные списки являются вариантами реализации.

  • Двоичные деревья имеют 0, 1 или 2 детей.

  • Деревья высшего порядка. Пытается и тому подобное.

Что мы делаем? Дюжина?

Вы также можете рассматривать это как «коллекции», которые существуют независимо от хранилища. В этом случае вы смешиваете дисциплину хранения (heapish или array-ish)

Сумки: неупорядоченные коллекции с разрешенными дубликатами. У вас может быть сумка, построенная на нескольких дисциплинах хранения: LinkedBag, TreeBag, ArrayBag, HashBag. Ссылка и дерево используют фрагментированное хранилище, массив и хэш используют непрерывное хранилище.

Наборы: неупорядоченные коллекции без дубликатов. Нет индексации. Опять же: LinkedSet, TreeSet, ArraySet, HashSet.

Списки: заказанные коллекции. Индексируется по позиции. Опять же: LinkedList, TreeList, ArrayList, HashList.

Отображение: коллекции ассоциаций ключ-значение. Индексируется по ключу. LinkedMap, TreeMap, ArrayMap, HashMap.

3 голосов
/ 23 февраля 2010

Обратите внимание, что «куча» (область памяти, где вы можете выделять и освобождать память в произвольном порядке) не имеет ничего общего со структурой данных, называемой «куча» (списки приоритетов).

Кстати, да, кроме Stack and Heap, существует третья парадигма использования памяти: статическое хранилище; -)

2 голосов
/ 23 февраля 2010

Javolution (http://javolution.org/) имеет несколько интересных парадигм выделения, реализованных с помощью подсказок кода и интерпретатора с использованием контекстов. Пул памяти, поддержка перезапуска объектов и т. Д. Хотя это Java, а не C ++, он все еще может быть полезным для изучения понятий.

2 голосов
/ 23 февраля 2010

FIFO приходит на ум. Общая память между процессорами. Будет ли передача сообщений парадигмой памяти?

1 голос
/ 23 февраля 2010

Я думаю, что это связано с физической природой памяти. Кучи и стеки - это просто интуитивно понятные способы его представления.

Например, очередь или список концептуально не поддаются произвольному доступу. Дерево не представляет физическую природу памяти (одна ячейка за другой, как массив). Любой тип кортежа с адресом x, y неоправданно сложен по сравнению с простым целочисленным адресом.

1 голос
/ 23 февраля 2010

«Куча» - это вовсе не парадигма, это самая базовая вещь, которую вы можете получить: память принадлежит вам, используйте ее как хотите. («Вы» здесь ссылаетесь на ОС / Ядро).

Даже стек не такой уж особенный, если подумать; вы только начинаете с одного конца кучи и растете / сжимаетесь по мере необходимости.

1 голос
/ 23 февраля 2010

файлы с отображением в памяти?

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