gpt4 book ai didi

c - 对 mprotect 的调用太多

转载 作者:太空狗 更新时间:2023-10-29 16:05:01 25 4
gpt4 key购买 nike

我正在开发一个并行应用程序(C,pthread)。我跟踪了系统调用,因为在某些时候我的并行性能很差。我的跟踪显示我的程序多次调用 mprotect() ... 足以显着降低我的程序速度。

我确实分配了大量内存(使用 malloc()),但只有合理数量的 brk() 调用来增加堆大小。那么为什么要对 mprotect() 进行如此多的调用?!

最佳答案

您是否正在创建和销毁大量线程?

大多数 pthread 实现都会在分配线程堆栈时添加一个“保护页”。它是一个访问 protected 内存页面,用于检测堆栈溢出。我希望每次创建或终止线程时至少调用一次 mprotect 以(解除)保护保护页。如果是这种情况,有几个明显的策略:

  1. 在创建线程之前使用 pthread_attr_setguardsize() 将保护页面大小设置为零。
  2. 使用线程池(线程数与处理器所说的一样多)。线程完成任务后,将其返回到池中以获取新任务,而不是终止并创建新线程。

另一种解释可能是,如果检测到溢出,您所处的平台将增加线程堆栈。我认为这还没有在使用 GCC/Glibc 的 Linux 上实现,但最近有一些类似的提议。如果您在处理时使用大量堆栈空间,您可以使用 pthread_attr_setstacksize 显式增加初始/最小堆栈大小。

或者它可能完全是另外一回事!

关于c - 对 mprotect 的调用太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/847444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com