다음을 통해 공유


Multiprocessor-Safe

Microsoft Windows NT 기반 운영 체제는 유니프로세서 및 SMP(대칭 다중 프로세서) 플랫폼에서 균일하게 실행되도록 설계되었으며 커널 모드 드라이버도 마찬가지로 작동하도록 설계되어야 합니다.

모든 Windows 다중 프로세서 플랫폼에는 다음과 같은 조건이 있습니다.

  • 모든 CPU는 동일하며 프로세서의 전체 또는 없음에는 동일한 공동 프로세서가 있어야 합니다.

  • 모든 CPU는 메모리를 공유하고 메모리에 균일하게 액세스할 수 있습니다.

  • 대칭 플랫폼에서 모든 CPU는 메모리에 액세스하고, 인터럽트를 수행하고, I/O 컨트롤 레지스터에 액세스할 수 있습니다. 반면, 비대칭 다중 프로세서 컴퓨터에서는 하나의 CPU가 종속 CPU 집합에 대해 모든 인터럽트를 사용합니다.

SMP 플랫폼에서 안전하게 실행하려면 운영 체제에서 한 프로세서에서 실행되는 코드가 다른 프로세서가 액세스하고 수정하는 데이터에 동시에 액세스하고 수정하지 않도록 보장해야 합니다. 예를 들어, 최하위 수준의 드라이버 ISR이 한 프로세서에서 디바이스 인터럽트 처리를 하는 경우 디바이스가 다른 프로세서에서 동시에 중단되는 경우 디바이스 레지스터 또는 중요한 드라이버 정의 데이터에 대한 단독 액세스 권한이 있어야 합니다.

또한 유니프로세서 컴퓨터에서 직렬화된 드라이버의 I/O 작업은 SMP 컴퓨터에서 겹칠 수 있습니다. 즉, 들어오는 I/O 요청을 처리하는 드라이버 루틴은 한 프로세서에서 실행될 수 있고 디바이스와 통신하는 다른 루틴은 다른 프로세서에서 동시에 실행됩니다. 커널 모드 드라이버가 유니프로세서 또는 대칭 다중 프로세서 컴퓨터에서 실행되는지 여부에 관계없이 드라이버 루틴 간에 공유되는 드라이버 정의 데이터 또는 시스템 제공 리소스에 대한 액세스를 동기화하고 물리적 디바이스에 대한 액세스를 동기화해야 합니다(있는 경우).

Windows NT 커널 구성 요소는 드라이버가 대칭 다중 프로세서 플랫폼에서 동시에 실행되는 하나 이상의 루틴에 의해 동시 액세스로부터 공유 데이터(또는 디바이스 레지스터)를 보호하는 데 사용할 수 있는 스핀 잠금이라는 동기화 메커니즘을 내보냅니다. 커널은 스핀 잠금 사용에 관한 두 가지 정책을 적용합니다.

  • 특정 순간에는 하나의 루틴만 특정 스핀 잠금을 유지할 수 있습니다. 공유 데이터에 액세스하기 전에 데이터를 참조해야 하는 각 루틴은 먼저 데이터의 스핀 잠금을 획득하려고 시도해야 합니다. 동일한 데이터에 액세스하려면 다른 루틴이 스핀 잠금을 획득해야 하지만 현재 홀더가 스핀 잠금을 해제할 때까지 스핀 잠금을 획득할 수 없습니다.

  • 커널은 시스템의 각 스핀 잠금에 IRQL 값을 할당합니다. 커널 모드 루틴은 스핀 잠금의 할당된 IRQL에서 루틴이 실행되는 경우에만 특정 스핀 잠금을 획득할 수 있습니다.

이러한 정책은 일반적으로 낮은 IRQL에서 실행되지만 현재 동일한 스핀 잠금을 획득하려는 우선 순위가 높은 드라이버 루틴에 의해 스핀 잠금이 선점되지 않도록 하는 드라이버 루틴을 방지합니다. 따라서 교착 상태는 방지됩니다.

스핀 잠금에 할당된 IRQL은 일반적으로 스핀 잠금을 획득할 수 있는 가장 높은 IRQL 루틴의 IRQL입니다.

예를 들어 가장 낮은 수준의 드라이버 ISR은 드라이버의 DPC 루틴과 상태 영역을 자주 공유합니다. DPC 루틴은 드라이버 제공 중요 섹션 루틴을 호출하여 공유 영역에 액세스합니다. 공유 영역을 보호하는 스핀 잠금에는 디바이스가 중단되는 DIRQL과 동일한 IRQL이 있습니다. critical-section 루틴이 스핀 잠금을 유지하고 DIRQL의 공유 영역에 액세스하는 한, ISR은 유니프로세서 또는 SMP 컴퓨터에서 실행할 수 없습니다.

  • 디바이스 인터럽트는 Always Preemptible 및 Always Interruptible에 설명된 대로 마스킹되므로 유니프로세서 컴퓨터에서 ISR을 실행할 수 없습니다.

  • SMP 컴퓨터에서 ISR은 공유 데이터를 보호하는 스핀 잠금을 획득할 수 없으며 중요한 섹션 루틴은 스핀 잠금을 유지하고 DIRQL에서 공유 데이터에 액세스합니다.

커널 모드 스레드 집합은 커널의 디스패처 개체(이벤트, 뮤텍스, 세마포, 타이머 또는 다른 스레드) 중 하나를 대기하여 공유 데이터 또는 리소스에 대한 액세스를 동기화할 수 있습니다. 그러나 대부분의 드라이버는 스레드 컨텍스트 스위치를 피할 때 성능이 향상되므로 자체 스레드를 설정하지 않습니다. 시간이 중요한 커널 모드는 루틴을 지원하고 드라이버는 IRQL = DISPATCH_LEVEL 또는 DIRQL에서 실행될 때마다 커널의 스핀 잠금을 사용하여 공유 데이터 또는 리소스에 대한 액세스를 동기화해야 합니다.

자세한 내용은 스핀 잠금, 하드웨어 우선 순위 관리커널 디스패처 개체를 참조하세요.