加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

调用mprotect的次数过多

发布时间:2020-12-16 09:23:52 所属栏目:百科 来源:网络整理
导读:我正在开发一个并行应用程序(C,pthread).我跟踪系统调用,因为在某些时候我的并行性能很差.我的跟踪显示我的程序多次调用mprotect()……足以显着减慢我的程序. 我确实分配了大量的内存(使用malloc())但是只有合理数量的调用brk()才能增加堆大小.那么为什么这
我正在开发一个并行应用程序(C,pthread).我跟踪系统调用,因为在某些时候我的并行性能很差.我的跟踪显示我的程序多次调用mprotect()……足以显着减慢我的程序.

我确实分配了大量的内存(使用malloc())但是只有合理数量的调用brk()才能增加堆大小.那么为什么这么多人调用mprotect()?

解决方法

你在创建和销毁大量线程吗?

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

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

另一种解释可能是你在一个平台上,如果检测到溢出,就会增加线程的堆栈.我不认为这是在具有GCC / Glibc的Linux上实现的,但最近有这些方面提出了一些建议.如果在处理时使用大量堆栈空间,则可以使用pthread_attr_setstacksize显式增加初始/最小堆栈大小.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读