4

我正在浏览一篇关于linux内核基数树实现的文章,文章链接如下:

http://lwn.net/Articles/175432/

在这篇文章中提到 radix_tree_preload 分配了足够的内存,以便后续插入树不会失败。尽管它基于每个 CPU 分配结构,因此该函数在禁用抢占的情况下返回。调用 radix_tree_preload_end 以启用抢占是调用者的责任。

我的问题是:

1) 为什么 radix_tree_preload 在每个 CPU 基础上分配结构?

2) 用户应该何时调用 radix_tree_preload_end?是在 radix_tree_insert 之后吗?

3)它不会影响性能,因为基数树用于页面缓存操作,因此任何插入都会导致抢占被禁用?如果我的理解有误,请纠正我。

4

1 回答 1

2

(1) 为确保您的请求按要求执行,一个 CPU 将处理整个插入序列。如果您在结构完全初始化之前将进程移动到不同的 CPU,则另一个 CPU 将从其自己的每个 CPU 副本中工作(有关每个 CPU 变量的优势,另请参见,例如,此处),如果某些大部分工作已经在初始 CPU 上完成。   

(2) 所以你想留出足够的内存,禁用抢占,插入/删除,然后重新启用抢占,所有这些都在最初启动序列的上下文中。这意味着,是的,您 _preload,_insert,然后 _preload_end 之后立即让您的系统再次从抢占中受益。   

(3) 对性能的影响很小,但为了确保数据完整性,如果您选择 per-CPU 变量,这很难(不可能)避免。内核开发人员必须判断利大于弊,而且他们通常是正确的。 

于 2013-12-16T16:22:18.837 回答