Разница между «кешем памяти» и «пулом памяти» - PullRequest
4 голосов
/ 23 сентября 2011

Прочитав «Понимание внутренних сетей Linux» и «Понимание ядра Linux» в двух книгах, а также другие ссылки, я очень запутался и нуждаюсь в некоторых пояснениях по поводу «кеша памяти» и «пула памяти» техники.

1) Это одинаковые или разные техники?

2) Если не одно и то же, что имеет значение, или разные цели?

3) Кроме того, как входит Slab Allocator ?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Относительно распределителя слябов:

Итак, представьте себе, что память плоская, то есть у вас есть блок непрерывной памяти на 4 гигабайта. Затем одна из ваших программ запрашивает 256 байтов памяти, поэтому распределитель памяти должен выбрать подходящий блок из 256 байтов из этих 4 гигов. Так что теперь ваша память выглядит примерно так

<============ 256 байт ======================>

(каждый = непрерывный блок памяти). Проходит некоторое время, и многим программам, работающим с памятью, требуется больше 256 блоков или больше, поэтому в итоге ваша память может выглядеть следующим образом:

<== 256 == 256 = 256 = 86 = 68 = 121 ===>

так что он фрагментируется, и тогда нет никакого следа вашего прекрасного блока памяти в 4 гигабайта - это фрагментация. Теперь распределитель slab будет отслеживать отслеживаемые объекты, и если они больше не используются, он скажет, что память свободна, хотя на самом деле она будет сохранена в каком-то списке List (возможно, вы захотите прочитать о FREELISTS ).

Итак, теперь представьте, что первая программа отказалась от выделенных 256 байтов, а затем новая хотела бы иметь 256 байтов, поэтому вместо выделения нового фрагмента основной памяти она может повторно использовать последние освобожденные 256 байтов без необходимости идти через бремя поиска физической памяти для соответствующего непрерывного блока пространства. Так вы реализуете кеш памяти. Это сделано для того, чтобы фрагментация памяти в целом уменьшилась, потому что вы можете оказаться в ситуации, когда память настолько фрагментирована, что ее невозможно использовать, и диспетчер памяти должен сделать что-то волшебное, чтобы получить блок соответствующего размера. Где, поскольку использование распределителя плит активно борется (но не устраняет) проблему.

0 голосов
/ 28 марта 2016

Распределитель памяти Linux. Распределитель дисков AKA поддерживает часто используемый список / пул объектов памяти схожего или приблизительного размера.slab дает программисту дополнительную гибкость в создании собственного пула часто используемых объектов памяти одинакового размера и маркирует его так, как программист хочет, выделяет, освобождает и, наконец, уничтожает его. Этот кеш известен вашему драйверу и является частным для него. Но естьпроблема в том, что во время нехватки памяти высоки шансы ошибок выделения памяти, которые могут быть неприемлемы в некоторых драйверах, тогда что делать лучше, всегда резервировать некоторую память под рукой, чтобы мы никогда не чувствовали перегрузку памяти, так как кеш kmem является более общим механизмом пула, который мынужен кто-то, кто всегда может поддерживать минимально необходимую память, и это наш пул памяти друзей.

...