线程优先级 – “unit testing”

一个非常简洁的问题: 我如何用一个简单的testing来certificate这个设置:

android.os.Process.setThreadPriority(int); 

其实是有用的

我发表这个问题的原因主要是通用的,因为我找不到可以复制的简单testing。

进一步阅读:

这对于我和我的应用程序是非常重要的,因为它捕获的audio必须是优先考虑的。 audio数据也被写入到文件中,并被分析其属性,这是不重要的 – 因此,我不需要这些任务是“真正的同时”。

在我的audio线程中,我设置了:

 Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); 

我可以通过检查前后简单地testing以上“应用”:

 Process.getThreadPriority(Process.myTid()); 

但是,我的testing需要是由于文档, 其中说 :

最重要的audio线程的标准优先级。 应用程序通常不能更改为此优先级。

尽pipe日志输出显示优先级已更改为-19,但由于文档中的措辞而引起的担忧是系统在执行时可能不允许正常应用程序使用-19的值,并且可能保留系统应用程序只?

如果以上是真的,我不知道我怎么能简单地certificate这个优先级值发生了什么 – 它是默认的最大允许的,还是可以完全忽略?

关于实际的testing本身,我已经尝试过循环和暂停,但没有成功,我不相信我所做的尝试的结果。 我也意识到这个行为是依赖于操作系统的,所以也许我不能复制一个独立的Javatesting,但是我没有find任何upvoted的例子呢?

希望有人能帮忙。 提前致谢。

编辑 – 进一步的最初的答案,我很明白,行为可能不是我想要的或期望的。 我想请这个实际的身体testing ,而不是一个可能性的解释。

testing将包含多个运行不同优先级的线程,并将它们完成的顺序打印到日志中,没有比这更复杂的了。 我的尝试似乎过于复杂,因此我在这里寻求帮助。

Solutions Collecting From Web of "线程优先级 – “unit testing”"

答:你不能。 如果你正在寻找的testing工作,这并不简单。 如果你想要的testing很简单,它不能工作。

Android并不被认为是一个“实时”的操作系统,在这种系统中,优先级的保证是困难的( 保证和可靠的)而不是软的( 咨询和大部分的荣誉)。 在一个RT O / S中,可以编写一个简单的testing,用一个高优先级的线程和一个低优先级的线程来评估一个竞争条件,并且这个testing将以确定的方式进行评估。 在非实时操作系统上,您只能得到一个统计保证。 这意味着你需要一个统计testing,这不会通过简单的标准。 统计testing,但是,可以是通用的。 编写一个运行testingN次的testing工具,并根据小于N的阈值通过testing。

但是即使build立基础testing也不是那么简单。 通常情况下,调度优先级只在机器在负载下运行,即CPU没有足够的时间运行。 所以要设置你的testing,你需要运行的东西,会淹没CPU; 你可能还有我的比特币,以确保你的过程正在运行。 如果这种情况不明显,那么数一下挖矿尝试而不是成功。 要小心自动屈服于操作系统(等待调用)和编译器可以优化的操作(简单的循环)。

一旦你设置了你的基本负载,你可以设置你的高优先级的线程。 它也需要真正做一些事情来validation它是否在高优先级运行,所以你也可以在这个线程中使用比特币。 如果这个线程以更高的优先级运行,那么在较高优先级的线程中,在给定的持续时间内,应该得到更高的计数。

但是你可能不会。 既然你不在RT操作系统上,大部分时间你只能得到更高的计数(可能)。 如果持续时间太短,您将受到调度程序的典型持续时间的限制。 所以你可能需要做一些实验来确定什么样的最小持续时间产生一些一致的答案。

这种实验并不简单。 你不是在RT操作系统上,所以优先级的意思是非常模糊的。 它(几乎肯定)没有logging,所以优先级数字的含义是任意的。 调度程序如何使用这些优先级数字是他们想要的。 例如,可能有魔术门槛。 如果有一个优先级意味着“永不中断,只等待一个产量”,并且运行一个没有产出的进程,就会挂起机器。 由于这些优先级数字可能意味着任何事情,因此您需要在实践中找出它们的含义,以使您的testing具有意义。

所有这些都应该暗示为什么embedded式实时操作系统有市场。 有时你需要时间保证,当你这样做的时候,你不应该使用非实时的操作系统,即使它是诱人的。

什么是testing

您正在运行的CPU具有多个可以并行运行的计算单元(核心)。

操作系统有调度点(quanta),在那里它将切换任务,select(通过一些神秘的逻辑接下来要执行的最好的线程)。

操作系统具有asynchronous资源访问权限。 当试图从外部设备读取它可能:

  1. 发出请求
  2. 安排一个不同的线程
  3. 在数据可用之后重新启动线程(可能立即,也许在量子到期之后)。

Java语言环境可能会有更多的抽象。

我如何certificate一个简单的testing,设置: android.os.Process.setThreadPriority(int); 其实是有用的

为了确定在更高优先级的线程上发生更多的处理,您需要:

  1. 确保机器的所有CPU资源都捆绑在一起。
  2. 确保您正在testing的东西不需要外部asynchronous设备。
  3. 确保testing持续多个量子。

确保CPU被捆绑

如果有空闲的CPU,那么想要运行的代码就可以了。 所以testing结果会显示线程优先级之间的边际差异,因为这并不重要。

确保testing不需要asynchronousIO

如果您需要写入设备,这段时间的差距会导致您被IO设备的速度所驱动,而不是线程的优先级。

确保testing有多个量子

线程优先级影响下一个要调度的线程的决定。 假定一个线程一旦执行完成了整个量子,然后再做一个时间表决策,那么testing需要testing多个这些决策。

线程优先级可以改变吗?

由于Android没有声称是实时操作系统,所以不能保证一个线程的最大等待时间是X(实时操作系统提供的保证)。 但是,如果线程准备好执行(不等待设备或其他asynchronous事件),则可能是高优先级的线程将在下一个量程中开始执行。

继续James Large离开的地方,Android中的线程优先级对于OS任务调度器来说更具暗示性,而且完全依赖于底层的Android操作系统。 IE可能会尝试向更高优先级的线程提供更多的资源,但不能保证它。

当您更改优先级时,您是否正在testing真实设备? 如果日志输出显示优先级发生了变化,我再也不能保证所设置的任何优先级在资源分配方面都会受到尊重,但我不知道你应该有任何理由不相信它。