0

Ich versuche, ein wenig RTOS-Bedingungen in Android-Geräten zu replizieren, ohne den gesamten Kernel neu installieren zu müssen (wie bei RTDroid). Eine dieser Bedingungen besteht darin sicherzustellen, dass die kritischen Threads Präferenz gegenüber normalen Threads haben, immer wenn sie die CPU oder den Arbeitsspeicher benötigen.Überholen max_priority mit NDK

Ich verstehe, dass der in C/C++ mit NDK geschriebene Code auf der Linux-Kernel-Ebene ausgeführt wird. Das bedeutet, dass es dieselbe Priorität haben sollte wie der DVM-Prozess (Dalvik Virtual Machine). Daher habe ich festgestellt, dass der C/C++ - Code mit einer höheren Priorität als jeder Thread "MAX_PRIORITY" ausgeführt wird, der am DVM ausgeführt wird.

Kann ich das gleiche Verhalten mit Renderscript replizieren? Meine Intuition sagt nein, da der Hauptthread der Ausführung in Renderscript-Skripten von einer Java-Anwendung gesteuert wird.

Vielen Dank im Voraus für alle Einblicke, die Sie mir geben könnten!

Antwort

3

Kurz gesagt, nein. Es gibt auch hier einige fehlerhafte Annahmen/Aussagen:

... Code geschrieben in C/C++, mit NDK, wird auf der Linux-Kernel-Ebene ausgeführt.

Dies ist falsch. Jeder C/C++ - Code, den Sie mit dem NDK erstellen, wird aus Ihrem Java-Code aufgerufen und läuft im Kontext des gleichen Prozesses und Threads, der die VM ausführt (Dalvik oder ART). Sie können auch Threads (Pthreads) auf der nativen Ebene erstellen. Diese laufen alle im Kontext desselben Benutzerraumprozesses und werden vom Linux-Kernel geplant, der das System mit Strom versorgt.

Die Thread Objekte auf der Java-Ebene sind im Wesentlichen Wrapper um Pthreads in der VM-Implementierung (sicherlich im Fall von Dalvik, ART kann versuchen, etwas anderes zu tun - aber ich bezweifle es), also nichts besonderes oder Phantasie dort.

Im Fall von Renderscript hängt die Art der Parallelisierung sehr vom Gerät/der Plattform ab. Bei einigen Geräten kann dies nur mit Pthreads auf der CPU geschehen. Auf anderen Geräten kann es auf Onboard-DSP oder (typischerweise) eine GPU nutzen. Es ist jedoch keine allgemeine Threading-Umgebung oder etwas, wo Sie Prioritäten vorgeben/verwalten können. Es ist speziell auf die Verarbeitung von Daten in einer parallelen, asynchronen (im Vergleich zu Java auf der CPU) Weise ausgerichtet.

+0

Vielen Dank! Ich habe mich sehr geirrt. Scheint, dass [Vordergrundprozesse] (https://medium.com/google-developers/whole-lives-and-who-dies-process-priorities-on-android-cb151f39044f#.gu81uajep) erstellt und Renderscript für intensive Operationen verwendet wird , ist die beste Option für mich. – juanma2268