Относительно распределителя слябов:
Итак, представьте себе, что память плоская, то есть у вас есть блок непрерывной памяти на 4 гигабайта. Затем одна из ваших программ запрашивает 256 байтов памяти, поэтому распределитель памяти должен выбрать подходящий блок из 256 байтов из этих 4 гигов. Так что теперь ваша память выглядит примерно так
<============ 256 байт ======================>
(каждый = непрерывный блок памяти). Проходит некоторое время, и многим программам, работающим с памятью, требуется больше 256 блоков или больше, поэтому в итоге ваша память может выглядеть следующим образом:
<== 256 == 256 = 256 = 86 = 68 = 121 ===>
так что он фрагментируется, и тогда нет никакого следа вашего прекрасного блока памяти в 4 гигабайта - это фрагментация. Теперь распределитель slab будет отслеживать отслеживаемые объекты, и если они больше не используются, он скажет, что память свободна, хотя на самом деле она будет сохранена в каком-то списке List (возможно, вы захотите прочитать о FREELISTS ).
Итак, теперь представьте, что первая программа отказалась от выделенных 256 байтов, а затем новая хотела бы иметь 256 байтов, поэтому вместо выделения нового фрагмента основной памяти она может повторно использовать последние освобожденные 256 байтов без необходимости идти через бремя поиска физической памяти для соответствующего непрерывного блока пространства. Так вы реализуете кеш памяти. Это сделано для того, чтобы фрагментация памяти в целом уменьшилась, потому что вы можете оказаться в ситуации, когда память настолько фрагментирована, что ее невозможно использовать, и диспетчер памяти должен сделать что-то волшебное, чтобы получить блок соответствующего размера. Где, поскольку использование распределителя плит активно борется (но не устраняет) проблему.