linux - kid3 - mp3tag ubuntu
Temporización de proceso precisa de microsegundos(o mejor) en Linux (8)
Creo que CFC ( Completely Fair Scheduler ) es lo que estás buscando.
Necesito una forma muy precisa de programar partes de mi programa. Podría usar el reloj regular de alta resolución para esto, pero eso devolverá el tiempo de reloj de pared, que no es lo que necesito: necesito el tiempo dedicado a ejecutar solo mi proceso.
Recuerdo claramente haber visto un parche de kernel de Linux que me permitía ajustar mis procesos a una precisión de nanosegundos, excepto que olvidé marcarlos como favoritos y también olvidé el nombre del parche :(.
Recuerdo cómo funciona:
En cada cambio de contexto, leerá el valor de un reloj de alta resolución y agregará el delta de los dos últimos valores al tiempo de proceso del proceso en ejecución. Esto produce una vista precisa de alta resolución del tiempo de proceso real del proceso.
El tiempo de proceso regular se mantiene usando el reloj regular, que creo que es milisegundo preciso (1000Hz), que es demasiado grande para mis propósitos.
¿Alguien sabe de qué parche de kernel estoy hablando? También recuerdo que era como una palabra con una letra antes o después, algo así como ''rtimer'' o algo así, pero no recuerdo exactamente.
(Otras sugerencias son bienvenidas también)
El planificador completamente justo sugerido sugerido por Marko no es lo que estaba buscando, pero parece prometedor. El problema que tengo es que las llamadas que puedo usar para obtener el tiempo de proceso todavía no devuelven los valores que son lo suficientemente detallados.
- times () devuelve los valores 21, 22, en milisegundos.
- clock () devuelve los valores 21000, 22000, la misma granularidad.
- getrusage () está devolviendo valores como 210002, 22001 (y somesuch), parece que tienen una precisión un poco mejor, pero los valores se ven llamativamente iguales.
Así que ahora el problema que probablemente tenga es que el kernel tiene la información que necesito, simplemente no sé la llamada al sistema que la devolverá.
Puede usar el Temporizador de eventos de alta precisión ( HPET ) si tiene un kernel 2.6 bastante reciente. Consulte Documentation / hpet.txt sobre cómo usarlo. Sin embargo, esta solución depende de la plataforma y creo que solo está disponible en los sistemas x86 más nuevos. HPET tiene un temporizador de al menos 10MHz, por lo que debe ajustarse a sus requisitos fácilmente.
Creo que varias implementaciones de PowerPC de Freescale también admiten un contador de instrucciones exactas de ciclo. Lo usé hace varios años para crear un perfil de código altamente optimizado, pero no recuerdo cómo se llama. Creo que Freescale tiene un parche de núcleo que debe aplicar para acceder desde el espacio de usuario.
Si necesita unidades de tiempo muy pequeñas para (supongo) probar la velocidad de su software, recomendaría simplemente ejecutar las partes que desea sincronizar millones de veces, tomar el tiempo antes y después del ciclo y calcular el promedio . Un buen efecto secundario de hacer esto (aparte de no tener que averiguar cómo usar nanosegundos) es que obtendría resultados más uniformes porque se promediaría la sobrecarga aleatoria causada por el administrador del sistema operativo.
Por supuesto, a menos que su programa no necesite correr millones de veces en un segundo, probablemente sea lo suficientemente rápido si no puede medir un tiempo de ejecución de milisegundos.
http://allmybrain.com/2008/06/10/timing-cc-code-on-linux/
podría ser de ayuda para usted (directamente si lo hace en C / C ++, pero espero que le proporcione indicaciones, incluso si no lo está) ... Asegura proporcionar una precisión de microsegundos, que solo cumple su criterio. :)
Creo que encontré el parche de kernel que estaba buscando. Publicarlo aquí para que no olvide el enlace:
http://user.it.uu.se/~mikpe/linux/perfctr/ http://sourceforge.net/projects/perfctr/
Editar: Funciona para mis propósitos, aunque no es muy fácil de usar.
Si está buscando este nivel de resolución de tiempo, probablemente esté tratando de hacer una micro-optimización. Si ese es el caso, deberías mirar PAPI . No solo proporciona información de sincronización de reloj de pared y virtual (solo proceso), también proporciona acceso a contadores de eventos de CPU, que pueden ser indispensables cuando se trata de mejorar el rendimiento.
prueba el contador de la marca de tiempo de la CPU? Wikipedia parece sugerir utilizar clock_gettime ().
Vea esta pregunta para más información.
Algo que he usado para tales cosas es gettimeofday (). Proporciona una estructura con segundos y microsegundos. Llámalo antes del código y de nuevo después. Luego resta las dos estructuras usando timersub, y puedes obtener el tiempo que tomó en segundos desde el campo tv_usec.