Memory management 是否有办法预填充操作系统';s页面表格中是否有大型锈蚀分配?

Memory management 是否有办法预填充操作系统';s页面表格中是否有大型锈蚀分配?,memory-management,rust,page-tables,Memory Management,Rust,Page Tables,如果您尝试使用Rust的任何内存分配机制(包括夜间alloc_api)分配大块内存,则无法预填充页表,即无法重新创建mmap的映射填充选项。相反,当我需要分配大面积内存时,我只使用libc::mmap 除了通过Vec或Vec循环并触发页面错误外,是否还有其他方法在Rust中预填充页面表 如前所述,有一些特定于平台的方法可以做到这一点。我将扫描Rust RFC,看看新的分配器API是否包含任何预填充选项。如果您可以预填充所有内容,则可以调用mlockall。这应该适用于GNU/Linux和实现PO

如果您尝试使用Rust的任何内存分配机制(包括夜间
alloc_api
)分配大块内存,则无法预填充页表,即无法重新创建mmap的映射填充选项。相反,当我需要分配大面积内存时,我只使用
libc::mmap

除了通过
Vec
Vec
循环并触发页面错误外,是否还有其他方法在Rust中预填充页面表


如前所述,有一些特定于平台的方法可以做到这一点。我将扫描Rust RFC,看看新的分配器API是否包含任何预填充选项。

如果您可以预填充所有内容,则可以调用
mlockall
。这应该适用于GNU/Linux和实现POSIX实时(进程内存锁定)扩展的系统


这是否可以接受实际上取决于您的应用程序。

出于好奇,您认为这样的预填充会带来怎样的加速?@Shepmaster:作为HFT的工作人员,我的典型答案是,与其说是吞吐量,不如说是延迟的可预测性。单页错误将导致延迟中的长尾分布(在多次执行中),这真的令人讨厌,比如在中位数上高达100x/1000x的因子。说它更多的是控制启动过程中的延迟。在程序的整个生命周期中,这并没有什么区别(假设您最终已经填充了页面表)。但是,当每秒处理数百万个数据包时,任何涉及中断/系统调用的阻塞行为都是非常昂贵的,并且可能导致数据包被丢弃,直到页面表被填充。您可以使用
mlockall
?谢谢@FlorianWeimer,我现在就使用它。