Обгонять max_priority с помощью NDK
Я пытаюсь воспроизвести небольшое количество условий RTOS на устройствах Android, без необходимости переустанавливать все ядро (как это происходит с RTDroid). Одним из таких условий является обеспечение того, чтобы критические потоки имели преимущество перед обычными потоками каждый раз, когда им требуется процессор или память.
Я понимаю, что код, написанный на C/C++ с использованием NDK, выполняется на уровне ядра Linux. Это означает, что он должен иметь тот же приоритет, что и процесс DVM (виртуальная машина Dalvik). Поэтому я сделал вывод, что код C/C++ выполняется с более высоким приоритетом, чем любой поток "MAX_PRIORITY", работающий на DVM.
Могу ли я повторить то же поведение, используя Renderscript? Моя интуиция говорит "нет", поскольку основной поток выполнения в сценариях Renderscript контролируется Java-приложением.
Заранее спасибо за любые идеи, которые вы могли бы предоставить мне!
1 ответ
Короче нет. Здесь также есть несколько ошибочных предположений / утверждений:
... код, написанный на C / C++ с использованием NDK, выполняется на уровне ядра Linux.
Это неверно Любой код C/C++, который вы создаете с использованием NDK, вызывается из вашего кода Java и выполняется в контексте того же процесса и потока, выполняющего виртуальную машину (Dalvik или ART). В этом нет ничего особенного в отношении приоритета. Вы можете создавать потоки (pthreads) на родном уровне. Все они работают в контексте одного и того же пользовательского процесса и планируются ядром Linux, обеспечивающим работу системы.
Thread
объекты на уровне Java, по сути, являются обертками вокруг pthreads в реализации VM (конечно, в случае Dalvik, ART может попытаться сделать что-то другое - но я сомневаюсь в этом), так что ничего особенного или причудливого там нет.
В случае с Renderscript способ параллелизации зависит от устройства / платформы. На некоторых устройствах это может быть сделано с использованием ничего, кроме pthreads на процессоре. На других устройствах он может использовать встроенный DSP или (как правило) графический процессор. Но это не среда потоков общего назначения или что-то, где вы можете диктовать / управлять приоритетами. Он специально предназначен для обработки данных в параллельной, асинхронной (по отношению к Java на процессоре) манере.