¿Cómo funciona la preference en Linux cuando un progtwig tiene un timer de less de 4 ms?

Los Jiffies en la mayoría de los sistemas Linux tienen un valor pnetworkingeterminado de 250 (4 ms). La pregunta es: ¿qué sucede cuando un progtwig tiene un sueño de less de 4ms? Por supuesto, funciona igual que cuando está progtwigdo. ¿Pero qué sucede cuando el progtwigdor de Linux saca este progtwig para esperar, porque otro progtwig tiene que operar? ¿Cómo funciona el adelanto en este caso?

¿Debo evitar los progtwigs personalizados con una espera tan pequeña? No podrían ser precisos, ¿verdad?

    Vea el time (7) y las páginas de manual a las que hace reference. Un experto:

    High-Resolution Timers Before Linux 2.6.21, the accuracy of timer and sleep system calls (see below) was also limited by the size of the jiffy. Since Linux 2.6.21, Linux supports high-resolution timers (HRTs), optionally configurable via CONFIG_HIGH_RES_TIMERS. On a system that supports HRTs, the accuracy of sleep and timer system calls is no longer constrained by the jiffy, but instead can be as accurate as the hardware allows (microsecond accuracy is typical of modern hardware). You can determine whether high-resolution timers are supported by checking the resolution returned by a call to clock_getres(2) or look‐ ing at the "resolution" entries in /proc/timer_list. HRTs are not supported on all hardware architectures. (Support is pro‐ vided on x86, arm, and powerpc, among others.) 

    Un comentario sugiere que no puedes dormir less de un momento. Eso es incorrecto; con HRTs, puedes. Prueba este progtwig:

     /* test_hrt.c */ #include <time.h> main() { struct timespec ts; int i; ts.tv_sec = 0; ts.tv_nsec = 500000; /* 0.5 milliseconds */ for (i = 0; i < 1000; i++) { clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL); } } 

    Comstackrlo:

     $ gcc -o test_hrt test_hrt.c -lrt 

    Ejecutarlo:

     $ time ./test_hrt real 0m0.598s user 0m0.008s sys 0m0.016s 

    Como puede ver, 1000 iteraciones de una demora de 0.5 milisegundos tomaron poco más de 0.5 segundos, como se esperaba. Si clock_nanosleep realmente estuviera esperando hasta el siguiente jiffy antes de regresar, habría tomado al less 4 segundos.


    Ahora la pregunta original era, ¿qué sucede si su progtwig fue progtwigdo durante ese time? Y la respuesta es que depende de la prioridad. Incluso si se progtwig otro progtwig mientras se está ejecutando su progtwig, si su progtwig tiene una prioridad más alta o si el planificador decide que es la hora de su progtwig para ejecutarse, comenzará a ejecutarse de nuevo después de que clock_nanosleep time de espera clock_nanosleep . No necesita esperar hasta el próximo jiffy para que eso suceda. Puede intentar ejecutar el progtwig de testing anterior mientras ejecuta otro software que toma la CPU, y verá que todavía se ejecuta en la misma cantidad de time, especialmente si aumenta la prioridad con, por ejemplo,

     $ time sudo schedtool -R -p 99 -e ./test_hrt 

    A less que esté ejecutando un kernel en time real, no usaría times de espera <10ms de todos modos tbh. Incluso si el planificador está dispuesto a adelantarse a otro process para su time de espera, la trepidación probablemente domine sus times reales de inactividad.

    Resumen: evite intervalos tan pequeños a less que tenga un kernel en time real. Si no puede cambiar kernel, su mejor opción puede ser fijar su process en una CPU dedicada con SCHED_FIFO y ocupado-esperar (o hacer otro trabajo útil) por less de dos jiffies.

    De alguna manera, el resumen terminó más time que el original … oh bien.