我正在看一篇关于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)它是否不会影响性能,因为基数树用于页面缓存操作,因此任何插入都会导致抢占被禁用?如果我的理解是错误的,请纠正我。
发布于 2013-12-17 00:22:19
(1)为了确保您的请求按要求执行,一个CPU将处理整个插入序列。如果你在结构完全初始化之前将你的进程移到一个不同的CPU上,另一个CPU将从它自己的每CPU拷贝中工作(关于每CPU变量的优点,另见,例如,here),如果一些工作已经在初始CPU上完成,这将是不同的。--
(2)因此,您希望留出足够的内存,禁用抢占,插入/删除,然后重新启用抢占,所有这些都是在最初启动序列的上下文中完成的。这意味着,是的,您可以先执行_preload、_insert,然后再执行_preload_end,以便尽快让您的系统再次从抢占中受益。--
(3)有一个小的性能影响,但为了确保数据完整性,如果您选择每个CPU的变量,这是很难(不可能)避免的。内核开发人员必须判断比缺点更重要的好处,他们通常是正确的。
https://stackoverflow.com/questions/20612565
复制相似问题