Разница между "кешем памяти" и "пулом памяти"
Прочитав "Понимание внутренних сетей Linux" и "Понимание ядра Linux" в двух книгах, а также другие ссылки, я очень запутался и нуждаюсь в некоторых пояснениях о методах "кеш-памяти" и "пула памяти".
1) Это одни и те же или разные методы?
2) Если не одно и то же, что имеет значение, или разные цели?
3) Кроме того, как входит Slab Allocator?
3 ответа
Относительно распределителя плит:
Так что представьте себе, что память плоская, то есть у вас есть блок непрерывной памяти на 4 гигабайта. Затем одна из ваших программ запрашивает 256 байтов памяти, поэтому распределитель памяти должен выбрать подходящий блок из 256 байтов из этих 4 гигов. Так что теперь ваша память выглядит примерно так
<============ 256bytes =======================>
(каждый = является непрерывным блоком памяти). Проходит некоторое время, и многим программам, работающим с памятью, требуется больше 256 блоков или больше, поэтому в итоге ваша память может выглядеть так:
<== 256 == 256 = 256 = 86 = 68 = 121 ===>
так что он фрагментируется, и тогда нет никакого следа вашего прекрасного блока памяти в 4 гигабайта - это фрагментация. Теперь распределитель slab будет отслеживать отслеживаемые объекты, и как только они больше не будут использоваться, он скажет, что память свободна, хотя на самом деле она будет сохранена в каком-то списке List (возможно, вы захотите прочитать о FreeLists).
Итак, теперь представьте, что первая программа отказалась от выделенных 256 байтов, а затем новая хотела бы иметь 256 байтов, поэтому вместо выделения нового фрагмента основной памяти она могла бы повторно использовать последние освобожденные 256 байтов без необходимости выполнять нагрузку. поиска физической памяти для соответствующего непрерывного блока пространства. Вот как вы реализуете кеш памяти. Это сделано для того, чтобы фрагментация памяти в целом уменьшилась, потому что вы можете оказаться в ситуации, когда память настолько фрагментирована, что ее невозможно использовать, и диспетчер памяти должен предпринять некоторые действия, чтобы получить блок соответствующего размера. Где использование распределителя плит активно борется (но не устраняет) проблему.
Распределитель памяти Linux AKA slab allocator поддерживает часто используемый список / пул объектов памяти схожего или приблизительного размера. slab дает программисту дополнительную гибкость в создании собственного пула часто используемых объектов памяти одинакового размера и маркирует его так, как программист хочет, выделяет, освобождает и, наконец, уничтожает его. Этот кеш известен вашему драйверу и является частным для него. Но есть проблема в том, что во время нехватки памяти высоки шансы ошибок выделения памяти, которые могут быть неприемлемы в некоторых драйверах, тогда что делать лучше всегда резервировать некоторую память под рукой, чтобы мы никогда не чувствовали перегрузку памяти, так как кеш kmem является более универсальным механизмом пула, который мы нужен кто-то, кто всегда может поддерживать минимально необходимую память, и это наш пул памяти друзей.
Lookaside Caches — Менеджер кэша в ядре Linux иногда называют распределителем slab. Вы можете в конечном итоге выделить много объектов одного и того же размера снова и снова, поэтому с помощью этого механизма вы просто можете выделить много объектов одного размера, а затем использовать их позже, без необходимости выделения многих объектов снова и снова.
Пул памяти — это просто форма резервного кэша, который пытается всегда поддерживать список памяти для использования в чрезвычайных ситуациях, поэтому, когда создается пул памяти, функции распределения ( распределители плит) создают пул предварительно выделенных объектов, чтобы вы могли их получить. когда ты нуждаешься.