用NDK超越max_priority

时间:2017-02-21 21:36:20

标签: android-ndk arm real-time renderscript android-renderscript

我试图在Android设备中复制一点程度的RTOS条件,而不必重新安装整个内核(就像RTDroid一样)。其中一个条件是确保关键线程在每次需要CPU或内存时都优先于普通线程。

据我所知,使用NDK编写的C / C ++代码是在linux内核级别执行的。这意味着它应该具有与DVM进程(Dalvik虚拟机)相同的优先级。因此,我猜测C / C ++代码的执行优先级高于在DVM上运行的任何“MAX_PRIORITY”线程。

我可以使用Renderscript复制相同的行为吗?我的直觉说不,因为Renderscript脚本中的主要执行线程是由java应用程序控制的。

提前感谢您提供给我的任何见解!

1 个答案:

答案 0 :(得分:4)

简而言之,没有。这里还有几个错误的假设/陈述:

  

...使用NDK用C / C ++编写的代码在Linux内核级别执行。

这是不正确的。使用NDK构建的任何C / C ++代码都是从Java代码调用的,并且在同一进程和执行VM的线程(Dalvik或ART)的上下文中运行。优先级没有什么特别之处。您也可以在本机级别创建线程(pthreads)。这些都在相同的用户空间进程的上下文中运行,并由Linux内核为系统供电。

Java级别的Thread对象实际上是VM实现中pthreads的包装(当然在Dalvik的情况下,ART可能会尝试做一些不同的事情 - 但我对此表示怀疑),所以没什么特别的或花哨的那里。

在Renderscript的情况下,它如何实现并行化取决于设备/平台。在某些设备上,这可以仅使用CPU上的pthreads来完成。在其他设备上,它可以利用板载DSP或(通常)GPU。但是,它不是通用的线程环境,也不是您可以指定/管理优先级的东西。它专门用于处理并行,异步(相对于CPU上的Java)方式的数据。