Share via


참조 계산을 통해 개체 수명 관리

기존 개체 시스템에서 개체의 수명 주기, 즉 개체 생성 및 삭제와 관련된 문제는 언어(또는 언어 런타임)를 통해 암시적으로 처리되거나 애플리케이션 프로그래머가 명시적으로 처리합니다.

재사용된 구성 요소로 구성된 진화하고 분산형으로 구성된 시스템에서는 더 이상 어떤 클라이언트나 프로그래머도 구성 요소의 수명을 처리하는 방법을 항상 "알고 있다"는 것은 사실이 아닙니다. 올바른 보안 권한이 있는 클라이언트의 경우 간단한 요청을 통해 개체를 만드는 것은 비교적 쉽지만 개체 삭제는 완전히 다른 문제입니다. 개체가 더 이상 필요하지 않고 삭제해야 하는 경우 반드시 명확하지는 않습니다. (Java와 같은 가비지 수집 프로그래밍 환경에 익숙한 독자는 동의하지 않을 수 있습니다. 그러나 Java 개체는 컴퓨터 또는 프로세스 경계에 걸쳐 있지 않으므로 가비지 수집은 단일 프로세스 공간 내에 있는 개체로 제한됩니다. 또한 Java는 단일 프로그래밍 언어를 강제로 사용합니다.) 원래 클라이언트가 개체를 사용하여 수행되는 경우에도 일부 다른 클라이언트 또는 클라이언트에 여전히 참조가 있을 수 있으므로 개체를 종료할 수 없습니다.

개체가 더 이상 필요하지 않도록 하는 한 가지 방법은 크로스 프로세스 또는 크로스 채널 개체에 대한 모든 연결이 사라졌을 때 시스템에 알리기 위해 기본 통신 채널에 전적으로 의존하는 것입니다. 그러나 이 메서드를 사용하는 체계는 여러 가지 이유로 허용되지 않습니다. 한 가지 문제는 크로스 프로세스/네트워크 간 프로그래밍 모델과 단일 프로세스 프로그래밍 모델 간에 큰 차이가 필요할 수 있다는 것입니다. 크로스 프로세스/네트워크 간 프로그래밍 모델에서 통신 시스템은 개체 수명 관리에 필요한 후크를 제공하는 반면, 단일 프로세스 프로그래밍 모델에서 개체는 중간 통신 채널 없이 직접 연결됩니다. 또 다른 문제는 이 체계로 인해 시스템 제공 소프트웨어 계층이 프로세스 내 사례의 구성 요소 성능을 방해할 수 있다는 것입니다. 또한 명시적 모니터링을 기반으로 하는 메커니즘은 수천 또는 수백만 개 개체로 확장되지 않는 경향이 있습니다.

COM은 이 문제 집합에 대해 확장 가능하고 분산된 접근 방식을 제공합니다. 클라이언트는 개체를 사용할 때와 개체가 완료되면 개체를 알리고, 더 이상 필요하지 않은 경우 개체가 삭제됩니다. 이 방법은 모든 개체가 자체에 대한 참조를 계산하도록 합니다. 기본적으로 가비지 수집과 같은 고유한 수명 관리 체계가 있는 Java와 같은 프로그래밍 언어는 COM의 참조 계산을 사용하여 COM 개체를 내부적으로 구현하고 사용할 수 있으므로 프로그래머가 처리하지 않도록 할 수 있습니다.

애플리케이션이 메모리가 더 이상 사용되지 않으면 할당된 메모리를 해제해야 하는 것처럼 개체의 클라이언트는 해당 개체가 더 이상 필요하지 않을 때 개체에 대한 참조를 해제해야 합니다. 개체 지향 시스템에서 클라이언트는 개체에 자신을 해제하라는 명령을 제공하여 이 작업을 수행할 수 있습니다.

개체가 더 이상 사용되지 않을 때 할당을 취소하는 것이 중요합니다. 개체 할당을 취소하는 것이 적절한 시기를 결정하는 데 어려움이 있습니다. 이는 자동 변수(스택에 할당된 변수)에서 쉽게 사용할 수 있습니다. 이 변수는 선언된 블록 외부에서 사용할 수 없으므로 블록 끝에 도달하면 컴파일러에서 할당을 취소합니다. 동적으로 할당된 COM 개체의 경우 개체를 더 이상 사용할 필요가 없는 경우( 특히 여러 클라이언트에서 동시에 사용할 수 있는 로컬 또는 원격 개체)를 결정하는 것은 개체의 클라이언트에 달려 있습니다. 개체는 자체 해제하기 전에 모든 클라이언트가 완료될 때까지 기다려야 합니다. COM 개체는 인터페이스 포인터를 통해 조작되며 다른 프로세스 또는 다른 컴퓨터의 개체에서 사용할 수 있으므로 시스템은 개체의 클라이언트를 추적할 수 없습니다.

개체 할당을 취소하는 것이 적절한 시기를 결정하는 COM의 방법은 수동 참조 계산입니다. 각 개체는 연결된 클라이언트 수를 추적하는 참조 횟수를 유지 관리합니다. 즉, 클라이언트의 인터페이스에 존재하는 포인터 수입니다.

자세한 내용은 아래 항목을 참조하세요.

IUnknown 사용 및 구현