Función del Service Control Manager (SCM) durante el apagado

La secuencia de apagado:
  1. El proceso WinLogon avisa al proceso del subsistema Win32, Csrss.exe (Client Server Runtime Subsystem) para que inicie la rutina de apagado.
  2. Csrss.exe mediante un bucle con los procesos activos, va notificándoles de que el sistema se está apagando. Para cada uno de ellos, a excepción de Services.exe, Csrss.exe esperará un tiempo -especificado en la clave HKEY_USERS.DEFAULTControl PanelDesktopToKillAppTimeout que de forma predeterminada es de 20 segundos- antes de pasar al siguiente proceso.
  3. Cuando Csrss.exe llega al proceso Services.exe le notifica que el sistema se está apagando, pero el tiempo de espera es específico de SCM.
  4. Csrss.exe reconoce a SCM mediante el identificador de proceso (PID) que guardó cuando SCM se registró con Csrss.exe durante el inicio del sistema.
    Este tiempo de espera difiere del de los demás procesos ya que Csrss.exe espera mientras SCM se comunica con los servicios que necesitan llevar a cabo una limpieza cuando se están apagando; por lo tanto, un administrador puede necesitar ajustar sólo el tiempo de espera de SCM. Este valor se encuentra en la clave HKLMSYSTEMCurrentControlSetControlToKillServiceTimeout, que de forma predeterminada es de 20 segundos.
  5. El manejador de apagado de SCM es responsable, solamente, del envío de las notificaciones asíncronas a aquéllos servicios que solicitan una notificación de apagado cuando han sido iniciados con el SCM. El código de control de apagado es SERVICE_CONTROL_SHUTDOWN.
  6. SCM entra en un bucle de su base de datos, buscando servicios que necesitan la notificación de apagado y les envía a cada uno un comando de apagado.
  7. Para cada servicio que ha de ser apagado, SCM envía un comando de apagado y guarda el valor de indicador de espera -un valor que el mismo servició le comunicó cuando se registró con SCM.
    El valor del indicador de espera de un servicio es la cantidad de tiempo que SCM permanecerá en un bucle esperando a que el servicio se inicie o se apague. Este indicador debe señalar cuantos milisegundos esperará el programa que está enviando el código de control antes de interrogar sobre su estado al servicio otra vez. SCM mantiene el seguimiento durante todo el tiempo del indicador recibido.
  8. Después del envío de los mensajes de apagado, SCM espera hasta que todos los servicios notificados del apagado han terminado, hasta que el tiempo del indicador ha finalizado, o hasta que el valor de WaiToKillServiceTimeout se ha excedido. Services.exe en sí es detenido por Csrss.exe.

    SCM no espera por inteligente, sino simplemente porque entra en un bucle examinando el estado de todos los servicios que han solicitado una notificación de apagado. Asimismo, para disminuir el tiempo de apagado, SCM no sigue un orden de dependencias durante el apagado de los servicios.

    • Si el tiempo del indicador finaliza sin un servicio terminando, SCM determina si uno o más de los servicios que están esperando para terminar ha enviado un mensaje diciéndole que está progresando en su apagado.
    • Si al menos un servicio ha hecho progresos, SCM esperará otra vez el tiempo del indicador. SCM continua ejecutando su bucle de espera hasta que todos los servicios hayan finalizado o que ninguno de ellos sobre el cual está esperando ha notificado progreso dentro del tiempo del periodo de espera del indicador.

    Mientras SCM está ocupado comunicando a los servicios que se apaguen y espera que lo hagan, Csrss.exe espera a que SCM finalice.

    • Si todos los servicios acaban con el estado SERVICE_STOPPED, SCM finaliza su propio proceso.
    • Si todos los servicios no han acabado con el estado SERVICE_STOPPED, SCM realiza un bucle de 30 segundos. Los servicios que no han finalizado con dicho estado son finalmente detenidos, un poco más adelante Services.exe con Csrss.exe y el sistema se apaga.

      SCM, en realidad, nunca detiene los servicios en el apagado. Esto solamente ocurriría cuando el apagado de los servicios del equipo no lo hacen por sí mismos.

    • Si la espera mediante Csrss.exe acaba sin que SCM haya finalizado (es decir, el tiempo de espera de WaitToKillServiceTimeout ha expirado), Csrss.exe sigue el proceso de apagado resultando finalmente con la detención de Services.exe.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *