Todos los ordenadores tienen una pieza especial de hardware llamada el reloj (más totalmente, el reloj en tiempo real o RTC). El reloj está conectado a la CPU, pero funciona incluso cuando el ordenador está completamente apagado. En un ordenador de escritorio, una batería en la placa base mantiene funcionando el reloj incluso cuando está desenchufado de la corriente. Los dispositivos móviles tienden a tener un gran condensador (que es un poco como una batería recargable), por lo que incluso si sacas la batería principal, el reloj puede seguir manteniendo la hora durante algunas horas.
A intervalos regulares, el reloj envía una señal a la CPU llamada una interrupción. Le dice a la CPU que interrumpa lo que está haciendo para procesar esta señal. Este es el mismo mecanismo utilizado por otras partes del ordenador (como la pantalla táctil) para enviar información a la CPU. La frecuencia de las señales puede ser controlada por el kernel: podría ser tan lenta como una vez por segundo, o tan rápida como mil veces por segundo. Esto parece ser muchas señales, pero no olvides que los ordenadores de hoy en día tardan una fracción de nanosegundo en realizar una sola operación, por lo que incluso un reloj de 1 kHz interrumpe solo cada pocas millones de operaciones.
No confundas el reloj en tiempo real con el reloj de la CPU y la velocidad de reloj de la CPU, que suelen ser de unos pocos GHz. El reloj de la CPU no es un dispositivo de medición de tiempo: establece el número de operaciones por segundo que la CPU puede realizar, y es un factor importante en cuánta energía consume la CPU.
En la mayoría de las CPUs, el kernel puede disminuir la velocidad del reloj de la CPU, apagar algunos núcleos de la CPU, y quizás incluso desconectar algunas cachés, todo para reducir el consumo de energía. Esto es lo que sucede cuando tu dispositivo Android entra en modo de suspensión, pero los cambios exactos son diferentes de un teléfono a otro. La CPU sigue funcionando, solo que más lentamente, y consume menos energía. Como señala Izzy, si el teléfono utiliza el sistema big.LITTLE de ARM, incluso podría ser un núcleo de CPU completamente diferente el que funciona en modo de suspensión: uno más lento diseñado para un menor consumo de energía.
Considera entonces que el RTC sigue funcionando en modo de suspensión, y la CPU sigue recibiendo y procesando interrupciones del reloj. Esto sigue siendo necesario para que la CPU pueda realizar un seguimiento de los diferentes procesos y asignar tiempo entre ellos de manera justa. Uno de los procesos es el administrador de alarmas del sistema. Este tiene una lista ordenada de todas las aplicaciones en el sistema que han registrado una alarma. El administrador de alarmas no se ejecuta continuamente: más bien, le indica al kernel cuándo es la primera alarma, y el manejador de interrupciones para las interrupciones del reloj es responsable de verificar la hora y despertar al administrador de alarmas cuando sea apropiado.
De esta manera, la CPU solo necesita algunas instrucciones por reloj para comparar la hora actual con la hora de la próxima activación.
Además, el administrador de alarmas tiene sus propias optimizaciones para mantener el dispositivo dormido el mayor tiempo posible. Cuando varias aplicaciones quieren ejecutarse a intervalos (por ejemplo, para revisar el correo electrónico cada 15 minutos), el administrador de alarmas no las ejecutará individualmente en los momentos exactos que pidieron, despertando el dispositivo varias veces durante esa ventana de 15 minutos. En cambio, las ejecutará todas al mismo tiempo, para que el dispositivo solo tenga que despertarse una vez.
Además, muchas alarmas no se ejecutarán si el dispositivo está dormido. Por ejemplo, si una aplicación quiere ejecutarse cada hora para cambiar el fondo de pantalla de inicio, no tiene sentido hacerlo mientras el dispositivo está dormido, porque no puedes verlo. Le dirá al administrador de alarmas que no necesita despertar al dispositivo para ejecutarse, por lo que el administrador de alarmas ignorará esa alarma al indicarle al kernel cuándo debe ejecutarse. De esta manera, si el dispositivo está dormido cuando llegue la hora, la alarma solo sonará cuando el dispositivo se despierte la próxima vez.