Дескриптор объекта
У каждого объекта есть короткий дескриптор типа kmem bufcti t. Дескрипторы объектов хранятся в массиве, расположенном непосредственно после соответствующего дескриптора участка памяти. Получается, что, подобно дескрипторам участков, дескрипторы объектов участка могут храниться двумя разными способами
- внешние дескрипторы объектов — хранятся вне участка памяти, в общем кэше, на который указывает поле siabp cache дескриптора кэша. Размер области памяти и, следовательно, конкретного общего кэша, используемого для хранения дескрипторов объектов, зависит от количества объектов в участке памяти (поле пит дескриптора кэша);
- внутренние дескрипторы объектов — хранятся внутри участка, непосредственно перед объектами, которые они описывают.
Первый дескриптор объекта в массиве описывает первый объект в участке памяти и т. д. Дескриптор объекта представляет собой короткое целое без знака, имеющее смысл, только когда объект свободен. Дескриптор хранит индекс следующего свободного объекта в участке, реализуя таким способом простой список свободных объектов внутри участка памяти. Дескриптор объекта для последнего элемента в списке свободных объектов помечен условным значением bufctl_end (oxffff).
Выравнивание объектов в памяти
Объекты, с которыми имеет дело slab-аллокатор, выровнены в памяти, т. е. хранятся в ячейках, начальные физические адреса которых кратны заданной константе, обычно являющейся степенью двойки. Эта константа называется фактором выравнивания.
Максимальный фактор выравнивания, разрешенный slab-аллокатором, равен 4096, т. е. размеру страничного кадра. Это означает, что объекты могут быть выровнены относительно либо их физических, либо линейных адресов. В обоих случаях выравнивание может повлиять только на 12 младших битов адреса.
Обычно в компьютерах скорость обращения к ячейкам памяти выше, когда физические адреса ячеек выровнены по границе слова (то есть внутренней ШИНЫ памяти компьютера). В силу ЭТОГО функция kmem_cache_create ПО умолчанию выравнивает объекты по границе слова, задаваемой макросом bytes per word. Для процессоров 80x86 этот макрос возвращает 4, потому что слово имеет длину 32 бита.
При создании нового кэша участков есть возможность указать, что объекты, заносимые в него, должны быть выровнены в аппаратном кэше первого уровня. Для этого ядро устанавливает флаг дескриптора кэша slab hwcache align. Функция kmem cache create обрабатывает запрос следующим образом:
- если размер объекта превышает половину строчки кэша, он выравнивается в оперативной памяти по границе, кратной li cache bytes, т. е. по началу строчки;
- в противном случае размер объекта округляется до делителя величины li cache bytes для гарантии того, что маленький объект никогда не пересечет границу между двумя строчками кэша.
Очевидно, что здесь slab-аллокатор жертвует памятью ради скорости доступа; он добивается более высокой производительности кэша, искусственно увеличивая размер объекта и, тем самым, создавая дополнительную внутреннюю фрагментацию.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница