Почему в ядре Linux radix_tree_preload возвращается с отключенным выгрузкой
Я просматривал статью о реализации ядра ядра Linux, ссылка на статью упомянута ниже:
http://lwn.net/Articles/175432/
В этой статье упоминается, что radix_tree_preload выделяет достаточно памяти, чтобы последующая вставка в дерево не завершилась неудачей. Хотя он распределяет структуры на основе ЦП и, следовательно, функция возвращается с отключенным вытеснением. Ответственный за вызов - вызывать radix_tree_preload_end, чтобы включить приоритет.
Мой вопрос:
1) Почему radix_tree_preload выделяет структуру для каждого процессора?
2) Когда пользователь должен вызывать radix_tree_preload_end? Это сразу после radix_tree_insert?
3) Не влияет ли это на производительность, поскольку радикальные деревья используются для операций кэширования страниц, и, следовательно, любая вставка приведет к отключению вытеснения? Поправь меня, если мое понимание неверно.
1 ответ
(1) Чтобы гарантировать, что ваш запрос выполняется как требуется, один ЦП будет обрабатывать всю последовательность вставки. Если вы перенесете процесс на другой ЦП до полной инициализации структуры, другой ЦП будет работать из своей собственной копии для каждого ЦП (преимущества переменных для ЦП см. Также, например, здесь), которая будет отличаться, если некоторые работы были сделаны на начальном процессоре уже.
(2) Таким образом, вы хотите выделить достаточно памяти, отключить выгрузку, вставить / удалить, а затем снова включить выгрузку, все в контексте, который первоначально запустил последовательность. Это означает, что да, вы _preload, _insert, затем _preload_end сразу после этого, чтобы ваша система снова получила выгоду от вытеснения как можно скорее.
(3) Небольшое снижение производительности, но для обеспечения целостности данных, если вы выбираете переменные для каждого процессора, этого трудно (невозможно) избежать. Разработчики ядра должны судить о преимуществах более важных, чем о недостатках, и они в целом правы.