Как предсказать поведение системы на основе предыдущего поведения - PullRequest
0 голосов
/ 20 сентября 2009

Я ищу алгоритм, который, основываясь на предыдущем поведении системы, предсказывает будущее поведение.

Я создаю параллельный распределитель памяти, в котором есть открытый список пустых блоков. Каждый поток, когда это необходимо, может взять блоки из этого списка и выделить из них. Блоки сгруппированы в ячейки, в зависимости от размера выделения (8, 12, 16 байт ... до примерно 4 КБ). Когда блок становится пустым, он возвращается в глобальный список (с накладными расходами синхронизации, конечно). Если в корзине нет пустых блоков, он пытается «украсть» местоположения из блоков в других корзинах, прежде чем получить новый пустой.

Теперь меня волнуют две ситуации:

  1. Возможно, что поток выделяет, скажем, память, которая занимает 5 блоков. Через некоторое время он освобождает всю эту память (и блоки попадают в глобальный список). Сразу после этого он снова выделяет 5 блоков, освобождает их и так далее. В этом случае было бы целесообразно постоянно хранить эти 5 блоков и не возвращать их в глобальный список, поскольку это позволяет избежать накладных расходов на синхронизацию.
  2. Если распределитель «крадет» местоположение, он использует память, которая в противном случае была бы потрачена впустую. Но есть случаи, когда это увеличивает использование памяти.

Я хочу создать систему, которая могла бы наблюдать шаблоны такого типа и сохранять результаты где-нибудь, чтобы в следующий раз распределители знали, что делать разумно, а что нет (сохраняйте по крайней мере N блоков в корзине X, дон 'украсть' из корзины Y).

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

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 20 сентября 2009

Есть немало статей о правильной реализации менеджеров памяти. Большинство из этих статей предоставляют измерения времени того, что и в какое время и почему. Поэтому я бы посоветовал вам взглянуть на то, что уже сделано в этой области. Есть довольно много интересных идей, многие из которых работают хорошо, и имеют мудрые и интересные концепции.

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

Итак, в вашем примере я бы сделал следующее:

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

Основным недостатком этого метода являются накладные расходы памяти. Его также можно уменьшить, если уменьшить размеры кэша (так как это компромисс в вашем случае).

1 голос
/ 20 сентября 2009
0 голосов
/ 20 сентября 2009

Если у вас будут свободные блоки размером 2, 4, 8, 16 и т. Д., То ваши потоки также должны запрашивать память в размерах 2, 4, 8, 16 и т. Д. Просите все, что вам нужно, округлить до ближайшая степень двух.

0 голосов
/ 20 сентября 2009

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

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