如何在任何场景下决定c中线程的堆栈大小?

问题描述 投票:0回答:2

在使用实时应用程序时,我无法决定线程堆栈大小,无法计算深度,因为线程正在触发其代码不可见的 Api。由于它是实时应用,因此也无法进行测试。由于它是实时系统,因此内存非常宝贵。

是否有任何启发式方法来计算线程大小?

c operating-system pthreads real-time
2个回答
2
投票

想要准确了解,就需要测量。

由于您不知道API的堆栈使用情况,我会亲自用已知值填充麻袋,并在您的程序测试后找到最大使用量(即已知值被其他值覆盖的地方)。

这是最精确的方法,嵌入式系统程序员经常使用它(一些 RTOS 甚至具有用于此任务的内置函数),


0
投票

在使用实时应用程序时,我无法决定线程堆栈大小,无法计算深度,因为线程正在触发其代码不可见的 Api。由于它是实时应用,因此也无法进行测试。由于它是实时系统,因此内存非常宝贵。

  1. 设计应用程序时不应考虑堆栈大小。您应该研究多线程库提供的支持,因为堆栈大小通常不会事先确定(大多数操作系统允许堆栈根据需要增长,在需要时分配页面)
  2. 线程触发不可见的api代码是什么意思?对于实时应用程序来说,这不是一个好的设计方法。
  3. 测试在实时应用程序中是必须的,至少对于任何其他应用程序来说都是如此。如果你说测试是不可能的我担心你永远不会有一个有效的应用程序。我不知道(甚至 D. Knuth 在 TeX 中也有 bug ---TeX 的当前版本是 3.141592653;最后一次更新是在 2021 年 --- 这意味着至少有 9 个 bug 被识别和修复,但他仍然没有损失了一大笔钱,只有 512 美元 ---他开始向第一个错误支付一 (1) 美元,并且为发现并通知他的每个连续错误的数量加倍 --- 总共支付)您计划如何测试您的代码,但对于嵌入式或系统编程,不建议在最终平台下进行测试,因为许多事情可以在不进行现场测试的情况下进行测试和验证。
  4. 您没有指定在问题中使用的任何上下文,也没有指定用于多线程的库,也没有指定操作系统是否支持线程,或者您必须自己编程(是的,多线程并不总是神奇地发生,有时您必须在需要但未提供时实施)

作为提示,我会告诉你,如果你的应用程序是真正实时的,你 最好做你自己的上下文切换模块并控制诸如虚拟内存(如果有的话)或分页(因为它涉及由虚拟内存引起的更多不期望的透明延迟)之类的事情。如果你处于这种情况,你必须坚持使用每个线程的堆栈量较小或固定,那么您最好不要使用虚拟分页内存或自动分配的堆栈,为每个堆栈安排固定的数量(这样堆栈就不会动态增长)并将其放置在全局变量段中。

© www.soinside.com 2019 - 2024. All rights reserved.