Solaris utiliza contabilidad de CPU basado en pulsos de reloj, en el que se activa una interrupción del reloj del sistema en un intervalo fijo, y atribuye la utilización de la CPU a los subprocesos y procesos que se ejecutan al mismo tiempo que el pulso. El ejemplo siguiente muestra cómo utilizar el sondeo tick para observar esta atribución:
# dtrace -n sched:::tick'{@[stringof(args[1]->pr_fname)] = count()}' ^C arch 1 sh 1 sed 1 echo 1 ls 1 FvwmAuto 1 pwd 1 awk 2 basename 2 expr 2 resize 2 tput 2 uname 2 fsflush 2 dirname 4 vim 9 fvwm2 10 ksh 19 xterm 21 Xsun 93 MozillaFirebird 260 |
La frecuencia de reloj del sistema varía según el sistema operativo, pero suele estar en el intervalo de los 25 y los 1024 hercios. La frecuencia de reloj del sistema Solaris es ajustable, pero el valor predeterminado es 100 hercios.
El sondeo tick sólo se activa si el reloj del sistema detecta un subproceso que pueda ejecutar. Para utilizar el sondeo tick para observar la frecuencia de reloj del sistema, debe contar con un subproceso que pueda ejecutarse en todo momento. Cree en una ventana una shell en bucle, tal y como se muestra en el ejemplo siguiente:
$ while true ; do let i=0 ; done |
Ejecute en otra ventana la siguiente secuencia de comandos:
uint64_t last[int]; sched:::tick /last[cpu]/ { @[cpu] = min(timestamp - last[cpu]); } sched:::tick { last[cpu] = timestamp; }
# dtrace -s ./ticktime.d dtrace: script './ticktime.d' matched 2 probes ^C 0 9883789 |
El intervalo mínimo es 9,8 milisegundos, que indica que la frecuencia de pulso de reloj predeterminada es 10 milisegundos (100 hercios). El mínimo observado suele ser algo inferior a los 10 milisegundos, debido al movimiento.
Uno de los defectos del registro basado en pulsos de reloj es que el reloj del sistema que realiza el registro suele ser también responsable de distribuir las actividades de planificación relacionadas con el tiempo. Como resultado, si un subproceso va a realizar determinada cantidad de trabajo cada pulso de reloj (es decir, cada 10 milisegundos), el sistema realizará un registro superior o inferior al subproceso, en función de si el registro se realiza antes o después de la actividad de planificación de distribución relacionada con el tiempo. En Solaris, el registro se realiza antes de la distribución relacionada con el tiempo. Como resultado, el sistema realizará un registro inferior de los subprocesos que están en ejecución en un intervalo regular. Si dichos subprocesos se encuentran en ejecución durante un tiempo inferior al intervalo de pulso de reloj, pueden "ocultarse" tras el pulso del reloj. El ejemplo siguiente muestra el punto hasta el que el sistema tiene tales subprocesos:
sched:::tick, sched:::enqueue { @[probename] = lquantize((timestamp / 1000000) % 10, 0, 10); }
La salida de la secuencia de comandos de ejemplo es dos distribuciones del desplazamiento en milisegundos dentro de un intervalo de diez milisegundos, uno para el sondeo tick y otro para el sondeo enqueue:
# dtrace -s ./tick.d dtrace: script './tick.d' matched 4 probes ^C tick value -------------- Distribution ------------ count 6 | 0 7 |@ 3 8 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 79 9 | 0 enqueue value -------------- Distribution ------------ count < 0 | 0 0 |@@ 267 1 |@@ 300 2 |@@ 259 3 |@@ 291 4 |@@@ 360 5 |@@ 305 6 |@@ 295 7 |@@@@ 522 8 |@@@@@@@@@@@@ 1315 9 |@@@ 337 |
El histograma de salida denominado tick muestra que el pulso de reloj se está activando con un desplazamiento de 8 milisegundos. Si la planificación no estuviera relacionada de ningún modo con el pulso de reloj, la salida de enqueue estaría distribuida de forma uniforme a lo largo del intervalo de diez milisegundos. Sin embargo, la salida muestra un pico en el mismo desplazamiento de 8 milisegundos, que indica que al menos algunos subprocesos del sistema están planificándose en base al tiempo.