Prioridad de hilo: 'prueba de unidad'

Una pregunta muy concisa: ¿Cómo puedo demostrar con una simple prueba, que la configuración:

android.os.Process.setThreadPriority(int); 

Realmente funciona

La razón por la que publico esta pregunta es principalmente genérica, ya que no puedo encontrar una prueba sencilla que pueda replicar.

Otras lecturas:

Es importante para mí y mi aplicación específicamente, ya que captura audio, que debe ser la prioridad. Los datos de audio también se escriben en un archivo y se analizan sus propiedades, lo cual es de menor importancia. Por lo tanto, no necesito que estas tareas sean "verdaderamente simultáneas".

En mi hilo de audio, establecí:

 Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); 

Puedo simplemente probar lo anterior ha "aplicado" comprobando antes y después:

 Process.getThreadPriority(Process.myTid()); 

Sin embargo, mi necesidad de una prueba se debe a la documentación, que dice :

Prioridad estándar de los hilos de audio más importantes. Las aplicaciones normalmente no pueden cambiar a esta prioridad.

A pesar de que la salida del registro mostró que la prioridad cambió a -19, mi preocupación, planteada por la redacción en la documentación, es que el Sistema no puede permitir un valor de -19 para una aplicación normal en el momento de la ejecución y es posiblemente reservado para ¿Aplicaciones del sistema solamente?

Si lo anterior es cierto, me pregunto cómo podría simplemente probar lo que sucede a este valor de prioridad – ¿Es incumplido al máximo permitido, o podría ser ignorado por completo?

En cuanto a la prueba real en sí, he experimentado con bucles y pausas, pero sin éxito y no confío en los resultados de los intentos que he hecho. También soy consciente de que el comportamiento es dependiente del sistema operativo, por lo que tal vez no puedo replicar una prueba independiente de Java de la que no he podido encontrar ningún ejemplo de upvoted ?

Espero que alguien pueda ayudar. Gracias por adelantado.

EDIT – Más allá de las respuestas iniciales, aprecio que el comportamiento no sea lo que yo quiero o espero. Me gustaría la prueba física real de esto por favor, en lugar de una explicación de las posibilidades.

La prueba consistiría en varios hilos que corren con diferentes prioridades y el orden en que se completen impresos en el registro, nada más complejo que eso. Mis intentos eran aparentemente demasiado complejos, por lo tanto estoy pidiendo ayuda aquí.

Respuesta: No puedes. Si la prueba que estás buscando funciona, no es simple. Si la prueba que desea es simple, no puede funcionar.

Android no es considerado un sistema operativo "en tiempo real", donde las garantías sobre la prioridad son duras ( es decir, garantizadas y confiables) en lugar de suaves ( es decir, asesoramiento y sólo en gran medida honrado). En un RT O / S, podría escribir una prueba simple que evaluó una condición de carrera con un hilo de alta prioridad y un hilo de baja prioridad, y esta prueba evaluaría de forma determinista. En un sistema operativo no en tiempo real, sólo obtendrá una garantía estadística. Y eso significa que usted necesita una prueba estadística, que no pasa el criterio de simple. Sin embargo, una prueba estadística puede ser genérica. Escribe un arnés de prueba que ejecuta una prueba N veces y pasa la prueba sobre la base de algún valor umbral menor que N.

Pero incluso la creación de una prueba de base no es simple. Por regla general, la prioridad de programación sólo es importante cuando la máquina se está ejecutando a carga, es decir, cuando no hay suficiente CPU para dar la vuelta. Así que para configurar su prueba, necesita ejecutar algo que inundará la CPU; Usted puede también mina bitcoin para cerciorarse de su proceso está funcionando. En caso de que esto no sea obvio, contar los intentos de minería en lugar de los éxitos. Tenga cuidado de rendirse voluntariamente al sistema operativo con demasiada facilidad (llamadas de espera) y las operaciones que pueden optimizar por el compilador (loops simples).

Una vez que haya configurado su carga base, puede configurar el hilo de alta prioridad. También tiene que hacer algo para verificar que se está ejecutando en alta prioridad, por lo que también podría mina bitcoin en este hilo también. Si este hilo se está ejecutando con una prioridad más alta, debería obtener un recuento más alto para una duración determinada en el hilo de prioridad más alta que el inferior.

Pero es posible que no. Puesto que usted no está en un sistema operativo RT, sólo obtendrá mayores cuentas (presumiblemente) la mayor parte del tiempo. Si la duración es demasiado pequeña, estará sujeto a la duración típica del programador. Por lo que es probable que tenga que hacer una cierta experimentación para determinar qué duración mínima produce algo de respuestas coherentes.

Este tipo de experimentación no es simple. No estás en un sistema operativo RT, así que lo que significa prioridad es muy difuso. Es (casi seguro) no documentado, y por lo tanto el significado de los números de prioridad es arbitraria. Cómo el planificador utiliza estos números de prioridad es lo que quieren. Puede haber umbrales mágicos, por ejemplo. Si hay una prioridad que significa "nunca interrumpa, sólo espere un rendimiento" y ejecuta un proceso que no cede, colgará la máquina. Puesto que estos números de prioridad pueden significar cualquier cosa, necesitarás descubrir algo de lo que significan en la práctica para hacer tus pruebas significativas.

Todo esto debería ser una pista sobre por qué existe un mercado para los sistemas operativos en tiempo real incrustados. A veces necesita garantías de tiempo, y cuando lo hace, no debe usar un sistema operativo en tiempo real, aunque sea tentador.

Qué está siendo probado

La CPU en la que se está ejecutando, tiene múltiples unidades de computación (núcleos), que pueden ejecutarse en paralelo.

El sistema operativo tiene puntos de programación (quanta), donde cambiará las tareas, eligiendo (a través de alguna lógica arcana los mejores hilos para ejecutar a continuación.

El sistema operativo tiene acceso a recursos asíncronos. Al intentar leer desde un dispositivo externo, puede:

  1. Emitir una solicitud
  2. Programe un hilo diferente
  3. Reinicie el hilo después de que los datos estén disponibles (posiblemente inmediatamente, tal vez después de que un quantum expire).

Java, el entorno del lenguaje puede tener más abstracciones.

¿Cómo probar con una prueba simple, que la configuración: android.os.Process.setThreadPriority(int); Realmente funciona

Con el fin de identificar que se produce más procesamiento en el hilo de mayor prioridad, es necesario:

  1. Asegúrese de que la máquina tiene todos sus recursos de CPU amarrados.
  2. Asegúrese de que la cosa que está probando no requiere dispositivos asíncronos externos.
  3. Asegúrese de que la prueba dura varios cuantos.

Asegúrese de que la CPU esté conectada

Si hay CPU de repuesto, entonces el código que quiere correr, puede y lo hará. Así que el resultado de las pruebas mostraría una diferencia marginal entre la prioridad del hilo, ya que no importaba.

Asegúrese de que la prueba no requiere E / S asíncronas

Si necesita escribir en un dispositivo, la brecha para este tiempo haría que sea impulsado por la velocidad del dispositivo de E / S en lugar de la prioridad de hilo.

Asegúrese de que las pruebas tengan varios cuantos

La prioridad del hilo determina la decisión sobre qué hilo se debe programar a continuación. Dado que un hilo una vez ejecutado se ejecuta para todos los cuantos, y luego se toma otra decisión de programación, entonces la prueba necesita probar múltiples de estas decisiones.

¿Puede la prioridad del hilo marcar la diferencia?

Como Android no hace ninguna afirmación de ser un sistema operativo en tiempo real, entonces no hay garantía, que un hilo tendrá un tiempo de espera máximo de X. (La garantía ofrecida por un sistema operativo en tiempo real). Sin embargo, si un hilo está listo para ejecutarse (no esperando dispositivos, u otros eventos asíncronos), entonces la probabilidad es que un hilo de alta prioridad comenzará a ejecutarse en el siguiente quantum.

Continuando en donde dejó James Large, prioridad de hilo en Android es más de una sugerente sugerencia para el programador de tareas del sistema operativo, y es completamente dependiente en el OS Android subyacente. IE puede tratar de proporcionar más recursos a los hilos de mayor prioridad, pero no lo garantiza.

¿Está probando en un dispositivo real cuando cambia su nivel de prioridad? Mientras que otra vez usted no puede garantizar que cualquier nivel de prioridad que usted fije será respetado en términos de la asignación de recursos, si la salida del registro muestra un cambio en nivel de prioridad, no sé que usted debe tener cualquier razón de no creerlo.

  • ¿Cómo configurar gradle para usar logback-classic SOLAMENTE para las pruebas de unidad en Android?
  • Separar las pruebas de integración de las pruebas unitarias en Android Studio
  • ¿Cómo forzar un cambio de configuración en una prueba Android Robolectric?
  • Robolectric filenotFound en archivos de activos
  • Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
  • Enviar Tecla Intro usando robotium para pruebas de Android?
  • Servicios Roboeléctricos y de Intención
  • ¿Cómo probar mejor el código Looper y Handler de la unidad en Android?
  • ¿Cuál es la forma más rápida de ejecutar pruebas de unidad en Android
  • Prueba de unidades de Android en Eclipse: "Error al iniciar la prueba"
  • Unidad de pruebas de creación de una base de datos SQLite utilizando Spock y Robospock
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.