Windows 시스템을 시작하면 많은 서비스가 백그라운드에서 자동으로 실행됩니다. 이는 운영 체제의 안정성에 중요한 초석이 됩니다. 이러한 서비스의 시작과 관리를 주로 담당하는 사람은 서비스 제어 관리자(SCM)입니다. SCM은 Windows NT 시리즈 운영 체제에 속하는 특수한 시스템 프로세스로, Windows 서비스 프로세스를 시작, 중지하고 상호 작용하는 역할을 합니다.
SCM의 주요 기능은 자동으로 시작되도록 구성된 모든 서비스를 시작하는 주요 함수인 SvcCtrlMain()부터 시작됩니다.
SCM 실행 파일 services.exe는 %SystemRoot%\System32\에 위치하고 있으며 시스템 시작 초기에 Wininit 프로세스에 의해 시작됩니다. SCM이 작동을 시작하면 먼저 설치된 서비스의 내부 데이터베이스를 초기화하는데, 여기에는 특정 레지스트리 키를 읽는 작업이 포함됩니다.
특히, 다음 두 개의 레지스트리 키를 읽어 내부 데이터베이스를 초기화합니다.
<저>SCM은 그룹 값과 각 서비스의 종속성을 기반으로 서비스의 로딩 순서를 결정합니다. 이 과정에서 순환 종속성이 발견되면 SCM은 오류를 기록하고 늦게 로드된 그룹에 종속된 서비스를 건너뜁니다.
SCM의 다음 단계는 시스템 시작 중에 시작되어야 하는 장치 드라이버가 성공적으로 로드되었는지 확인하고 실패한 드라이버를 ScFailedDrivers라는 목록에 저장하는 것입니다.
그러면 SCM이 ScAutoStartServices() 함수를 호출합니다. 이 함수는 자동 시작으로 표시된 모든 서비스를 반복하여 해당 서비스를 시작합니다. SCM은 각 서비스에 대해 ScStartService() 함수를 호출하여 서비스 프로세스가 올바른 계정에서 실행되는지 확인합니다. 서비스가 시스템 계정으로 실행되지 않는 경우 SCM은 LSASS 함수 LogonUserEx()를 호출하여 서비스가 처음 구성되었을 때 안전하게 저장된 "비밀" 비밀번호를 가져옵니다.
그뿐만 아니라, 지연된 자동 시작 서비스라는 특별한 유형의 서비스도 있습니다. 이러한 유형의 서비스는 시스템 시작이 느린 문제를 해결하기 위해 Windows Vista에 도입되었습니다. SCM은 모든 비지연 자동 시작 서비스가 처리될 때까지 지연 자동 시작 서비스를 초기화하지 않습니다.
이러한 서비스의 시작에는 지연이 있지만 시작 순서 외에는 다른 서비스와 크게 다르지 않습니다.
SCM이 장치 드라이버 서비스를 특별히 처리한다는 점도 주목할 만합니다. 이러한 서비스의 유형 등록 값은 SERVICE_KERNEL_DRIVER 또는 SERVICE_FILE_SYSTEM_DRIVER입니다. SCM이 ScStartService()를 호출하면, ScLoadDeviceDriver() 함수를 호출하여 해당 드라이버를 로드합니다.
NtLoadDriver 시스템 호출을 통해 SCM은 드라이버가 올바르게 로드되었는지 확인합니다. 초기 시작 프로세스 동안 SCM은 네트워크 드라이브의 연결 상태가 변경되면 Windows 메시지 WM_DEVICECHANGE를 브로드캐스트하여 Windows 탐색기와 같은 다른 애플리케이션에 알리는 역할도 합니다.
이러한 디자인을 통해 사용자는 시스템 리소스와 서비스를 보다 효과적으로 관리할 수 있어 운영 체제가 원활하게 작동합니다.
그러나 SCM이 시스템을 시작하는 데 있어서 중요한 역할을 함에도 불구하고 많은 사용자는 실제로 SCM이 어떻게 작동하는지 이해하지 못합니다. SCM의 모든 운영 뒤에는 복잡하고 효율적인 기술이 있습니다. 사실, 이 기술은 사용자가 아무런 장애물 없이 평범해 보이는 애플리케이션과 서비스를 사용할 수 있게 해줍니다.
향후 Windows 버전에서는 점점 다양해지는 사용자 요구를 충족하기 위해 SCM이 어떻게 발전할까요?