我正在为嵌入式Linux系统中运行的实时程序编写代码。由于我们不能在页面故障时不可预测地停顿,因此我想在堆栈中预先执行前驱以确保我们使用的区域被
对于主线程来说,这很简单;只需执行一些大的
但是,对于 pthread 堆栈,它们是否也将使用
因此,执行这个预先提示的最佳方法是什么?如果有一种简单的方法可以找到堆栈的下限(刚好在保护页面之上)那就足够了,在这个点上我可以从那里写到当前的堆栈指针。
请注意,可移植性不是问题;我们很乐意拥有仅适用于 x86-32 和 Linux 的解决方案。
mlockall()
调用所覆盖。对于主线程来说,这很简单;只需执行一些大的
alloca()
并确保每几页都进行一次写操作。这有效是因为在程序启动时,堆栈限制比我们需要的量大得多;最终我们正好分配了我们预先提示的数量。但是,对于 pthread 堆栈,它们是否也将使用
MAP_GROWSDOWN
进行分配? 如果是这样,那么考虑以下事项,最佳的预先提示方式是什么:
- 我们不知道 libc 启动会消耗多少已知的堆栈大小
- 我们不想为堆栈分配比必要的内存更多的内存
pthread_attr_setstack
来传递手动分配的堆栈,但如果可能的话,这会使清理线程变得复杂,因此我倾向于避免这种情况。因此,执行这个预先提示的最佳方法是什么?如果有一种简单的方法可以找到堆栈的下限(刚好在保护页面之上)那就足够了,在这个点上我可以从那里写到当前的堆栈指针。
请注意,可移植性不是问题;我们很乐意拥有仅适用于 x86-32 和 Linux 的解决方案。
pthread_attr_setstacksize
不会使用类似于GROWSDOWN
的东西,即在分配时mlockall()
将立即应用于整个堆栈而无需额外的预取? - bdonlan