다음을 통해 공유


개체의 수명 관리

경고

UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한됩니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다.

보관된 UMDF 1 샘플은 Windows 11 버전 22H2 - 2022년 5월 드라이버 샘플 업데이트에서 찾을 수 있습니다.

자세한 내용은 UMDF를 사용하여 시작 참조하세요.

UMDF는 참조 계산 체계를 사용하여 콜백 개체프레임워크 개체의 수명을 관리합니다.

Driver-Supplied 콜백 개체에 대한 참조 관리

대부분의 경우 드라이버는 콜백 개체에 대한 참조를 유지할 필요가 없습니다. 콜백 개체 인터페이스의 메서드가 프레임워크 및 콜백 개체와 콜백 개체의 쌍을 이루는 프레임워크 개체에 따라 수명이 종속된 개체에서만 호출되는 경우 드라이버는 참조를 유지할 필요가 없습니다. 즉, 드라이버 또는 프레임워크는 개체 계층 구조에서 더 높은 개체 인터페이스의 메서드를 안전하게 호출할 수 있습니다.

프레임워크 개체에 대한 참조 관리

UMDF에서 일반적인 COM 수명 원칙 및 WDF 관련 수명 모델은 프레임워크 개체의 수명을 결정합니다. 프레임워크 개체가 적절한 시간에 메모리에서 해제되도록 드라이버는 두 모델에 대한 조건을 충족해야 합니다.

COM 수명 관리

COM에서 호출자는 일반적으로 개체가 사용 중인 동안 개체에 대한 참조를 유지한 다음 호출자가 더 이상 개체가 필요하지 않을 때 참조를 해제합니다. 그러나 UMDF 드라이버는 프레임워크 개체에 대한 참조를 유지할 필요가 없습니다. 실제로 드라이버는 프레임워크 개체를 만든 직후 프레임워크 개체 참조를 해제할 수 있습니다.

예를 들어 UMDF 샘플은 IWDFDriver::CreateDevice를 호출한 후 디바이스 개체를 해제합니다. 참조가 일찍 릴리스되었지만 WDF 개체 트리가 참조를 유지하므로 디바이스가 제거될 때까지 디바이스 개체가 계속 존재합니다.

UMDF는 개체 트리의 모든 프레임워크 개체를 추적하므로 드라이버는 프레임워크 개체에 대한 참조를 유지할 필요가 없습니다.

그러나 드라이버가 프레임워크 개체에 대한 참조를 유지하는 경우 드라이버는 더 이상 개체가 필요하지 않을 때 참조를 해제해야 합니다. 드라이버가 참조를 해제할 때까지 순환 참조가 그대로 유지됩니다. 순환 참조를 방지하기 위해 드라이버는 일반적으로 프레임워크 개체에 대한 명시적 참조를 유지해서는 안 됩니다.

드라이버가 프레임워크 개체에 대한 참조를 유지해야 하는 경우 드라이버의 콜백 개체도 IObjectCleanup 인터페이스를 구현해야 합니다. 드라이버가 프레임워크 개체에서 IWDFObject::D eleteWdfObject 를 호출하면 프레임워크 개체는 해당 콜백 개체의 IObjectCleanup::OnCleanup 메서드를 호출합니다. IObjectCleanup::OnCleanup 구현은 프레임워크 개체의 분해를 완료할 수 있도록 프레임워크 개체에 대한 참조를 해제해야 합니다.

WDF 수명 관리

기본 부모를 재정의할 수 있는 형식의 개체를 만드는 경우 개체의 수명과 일치하는 수명을 가진 부모를 선택해야 합니다. 기본 부모 개체에 대한 자세한 내용과 드라이버가 기본 부모를 재정의할 수 있는 경우 Framework 개체의 표를 참조하세요.

개체 수명을 일치시킬 경우 부모 개체가 삭제되면 프레임워크에서 개체를 삭제합니다. 개체 수명과 일치하지 않고 기본 부모가 삭제되기 전에 개체를 삭제하려는 경우 개체가 더 이상 필요하지 않을 때 DeleteWdfObject 를 호출하여 개체를 명시적으로 삭제할 수 있습니다.

예를 들어 새 요청 개체를 만든 다음 IWDFDriver::CreateWdfMemory 를 호출하여 이 요청에 대한 메모리 개체를 만드는 경우 요청 개체를 새 메모리 개체의 부모로 지정할 수 있습니다. WDF는 부모 개체를 삭제할 때 자식 개체를 삭제하므로 드라이버는 DeleteWdfObject 를 호출하여 메모리 개체를 삭제할 필요가 없습니다.

그러나 수명이 개체의 수명과 거의 일치하는 부모가 없고 기본 부모가 삭제되기 전에 개체를 삭제하려면 명시적 삭제를 사용해야 합니다. 예를 들어 드라이버는 짧은 기간 동안 사용되는 여러 요청 개체를 만들 수 있습니다. 이 경우 드라이버는 더 이상 필요하지 않은 경우 요청을 명시적으로 삭제하여 메모리를 절약할 수 있습니다.

마찬가지로 기본 부모를 재정의할 수 없는 개체를 만드는 경우 및 기본 부모가 삭제되기 전에 개체를 삭제하려면 드라이버가 개체를 명시적으로 삭제해야 합니다.