我正在开发一个并行应用程序(C,pthread).我跟踪系统调用,因为在某些时候我的并行性能很差.我的跟踪显示我的程序多次调用mprotect()……足以显着减慢我的程序. 我确实分配了大量的内存
我确实分配了大量的内存(使用malloc())但是只有合理数量的调用brk()才能增加堆大小.那么为什么这么多人调用mprotect()?
你在创建和销毁大量线程吗?大多数pthread实现将在分配线程堆栈时添加“保护页面”.它是一个访问受保护的内存页面,用于检测堆栈溢出.每次创建或终止线程时,我都希望至少有一次调用mprotect来(保护)保护页面.如果是这种情况,有几个明显的策略:
>在创建线程之前,使用pthread_attr_setguardsize()将防护页面大小设置为零.
>使用线程池(与处理器一样多的线程).一旦线程完成任务,将其返回到池以获取新任务而不是终止并创建新线程.
另一种解释可能是你在一个平台上,如果检测到溢出,就会增加线程的堆栈.我不认为这是在具有GCC / Glibc的Linux上实现的,但最近有这些方面提出了一些建议.如果在处理时使用大量堆栈空间,则可以使用pthread_attr_setstacksize显式增加初始/最小堆栈大小.
或者它可能完全是另一回事!