다음을 통해 공유


수명 임대

이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.

MBR(참조에 의한 마샬링 개체)은 서버가 활성화한 Singleton 개체인지 아니면 클라이언트가 활성화한 개체인지에 관계없이 메모리에 계속 상주하지 않습니다. 대신, 형식이 MarshalByRefObject.InitializeLifetimeService를 재정의하여 자체 수명 정책을 제어하는 경우 이외에는 각 MBR에는 임대, 임대 관리자 및 스폰서 수의 조합으로 제어되는 수명이 있습니다. 이 경우 MBR 개체의 수명은 개체가 메모리에서 활성화 상태를 유지하는 전체 시간입니다. 임대는 .NET Framework 원격 시스템이 특정 개체를 삭제하여 메모리를 회수하기 전까지 해당 개체가 메모리에서 활성화 상태를 유지하는 시간입니다. 서버 응용 프로그램 도메인의 임대 관리자는 원격 개체를 가비지 수집으로 표시할 시점을 결정하는 개체입니다. 스폰서는 임대 관리자에 스스로를 등록하여 특정 개체에 대한 새 임대를 요청할 수 있는 개체입니다.

MBR 개체가 응용 프로그램 도메인 외부의 원격 개체일 때마다 해당 개체에 대해 수명 임대가 만들어집니다. 각 응용 프로그램 도메인에는 해당 도메인에서의 임대를 관리하는 임대 관리자가 포함되어 있습니다. 임대 관리자는 주기적으로 모든 임대의 만료된 임대 시간을 확인합니다. 임대가 만료된 경우 임대 관리자는 해당 개체의 스폰서 목록에 요청을 전송하고 임대 갱신을 커밋했는지 여부를 쿼리합니다. 임대를 갱신하는 스폰서가 없으면 임대 관리자가 임대를 제거하고, 개체가 삭제되며, 메모리는 가비지 수집에 의해 회수됩니다. 그러면 스폰서에 의해 또는 클라이언트의 지속적 호출에 의해 두 번 이상 갱신된 경우 개체의 수명이 해당 개체의 수명 임대보다 길어질 수 있습니다.

원격 개체의 수명은 해당 클라이언트의 활성화 수명에 독립적입니다. 기본 개체의 임대는 매우 길어질 수 있으며 이 경우 여러 클라이언트가 개체를 사용할 수 있습니다. 개체의 임대는 클라이언트에 의해 주기적으로 갱신되어 개체 수명을 더 연장할 수 있습니다. 이 방법은 분산된 가비지 수집에 필요한 네트워크 트래픽이 매우 작기 때문에 임대를 효율적으로 사용하는 방법입니다. 하지만 부족한 리소스를 사용하는 원격 개체의 임대는 수명이 짧을 수 있으며 이 경우 클라이언트는 더 짧은 시간 범위로 자주 갱신합니다. 모든 클라이언트의 원격 개체 사용이 끝나면 .NET Framework 원격 시스템은 개체를 신속하게 가비지 수집되도록 표시합니다. 서버 리소스의 효율적 사용을 위해 네트워크 트래픽을 증가시키는 대신 이 정책을 사용할 수 있습니다.

임대를 사용하여 원격 개체의 수명을 관리하는 방법은 안정적이지 않은 네트워크 연결에서 비효율적이고 복잡할 수 있는 참조 횟수에 대한 대안입니다. 임대는 원격 개체의 수명을 정확하게 필요한 수명보다 길게 연장하도록 구성할 수 있지만 참조 횟수와 클라이언트로의 요청 전송에 필요한 네트워크 트래픽을 감소시키기 때문에 임대는 특정 시나리오에 적절하게 구성하기만 하면 매우 효율적인 솔루션입니다.

다음 표에서는 임대의 기본 속성을 설명합니다.

속성 설명

InitialLeaseTime

임대 관리자가 개체 삭제 프로세스를 시작하기 전에 개체가 메모리에 남아 있는 초기 시간 범위를 지정합니다. 구성 파일에서 이것은 <lifetime> 요소 구성 요소의 leaseTime 특성입니다. 기본값은 5분입니다. 임대 시간이 0이면 임대가 무한 수명으로 설정됩니다.

CurrentLeaseTime

임대 만료까지 남은 시간을 지정합니다. 임대가 갱신되면 CurrentLeaseTimeCurrentLeaseTime의 최대값 또는 RenewOnCallTime으로 설정됩니다.

RenewOnCallTime

개체에 대한 각 원격 호출 후 CurrentLeaseTime이 설정될 최대 시간 범위를 지정합니다. 기본값은 2분입니다.

SponsorshipTimeout

임대 시간이 만료되었다는 알림을 받은 후 임대 관리자가 스폰서의 응답을 기다리는 시간을 지정합니다. 스폰서가 지정된 시간 안에 응답하지 않으면 스폰서가 제거되고 다른 스폰서가 호출됩니다. 더 이상 스폰서가 없으면 임대가 만료되고 원격 개체가 가비지 수집되도록 표시됩니다. 값이 0이면(TimeSpan.Zero) 임대는 스폰서를 등록하지 않습니다. 기본값은 2분입니다.

LeaseManagerPollTime

임대 관리자가 만료된 임대 항목을 확인한 후 대기하는 시간을 지정합니다. 기본값은 10초입니다.

MBR 개체가 다른 응용 프로그램 도메인에서 활성화되면 임대가 만들어집니다. 이 시점에서 ILease.CurrentState 속성이 LeaseState.Initial이면 임대 속성을 설정할 수 있습니다. 설정한 뒤에는 직접 변경할 수 없습니다. ILease.Renew 호출에서 또는 임대 관리자가 스폰서에 대해 ISponsor.Renewal을 호출하고 스폰서가 TimeSpan 개체로 응답하는 경우에 CurrentLeaseTime만 변경할 수 있습니다. MarshalByRefObject에는 수명 임대의 기본 구현이 있으며 만들어질 때 이 임대가 수정된 경우 이외에는 임대 속성이 항상 동일합니다.

임대 속성 수정

수명 임대 속성은 다음 방법으로 수정할 수 있습니다.

  • MBR 개체에서 MarshalByRefObject.InitializeLifetimeService를 재정의하여 사용자 지정 수명 임대를 선언하여 임대 속성을 직접 설정하거나 null 참조(Visual Basic의 경우 Nothing)를 반환합니다. 참조를 반환하는 옵션은 .NET Framework 원격 시스템에게 이 유형의 인스턴스가 수명이 무한함을 알립니다.

  • 개발자 또는 관리자는 응용 프로그램 또는 시스템 구성 파일의 <lifetime> 요소 요소에서 특정 응용 프로그램의 모든 개체에 대한 수명 속성을 지정할 수도 있습니다. 자세한 내용은 임대 초기화를 참조하십시오.

만들어진 임대는 다음 방법으로 갱신할 수 있습니다.

  • 클라이언트에서 Renew를 직접 호출합니다.

  • ILease.RenewOnCallTime 속성이 설정된 경우 원격 개체에 대한 각 호출은 지정된 시간 동안 임대를 갱신합니다.

  • 임대가 Renewal 메서드를 호출하여 임대 갱신을 요청하고 스폰서가 TimeSpan으로 응답합니다.

자세한 내용은 임대 갱신을 참조하십시오.

임대 관리자

임대 관리자는 주기적으로 임대의 시간 만료를 검사해야 합니다. 임대의 시간이 만료되면 임대가 이를 알게 되고 스폰서를 호출하여 직접 갱신을 시도합니다.

임대 관리자는 임대가 응답을 기다리는 스폰서 목록을 유지합니다. 스폰서가 SponsorshipTimeout 시간 범위로 지정된 간격 안에 응답하지 않으면 해당 스폰서는 스폰서 목록에서 제거됩니다.

악의적 원격 클라이언트가 임대 시스템을 악용하여 원격 서비스에 대해 DOS(서비스 거부) 공격을 탑재할 수 있습니다. 악의적 클라이언트는 여러 임대를 스폰서한 다음 서버의 갱신 쿼리에 대한 응답을 거부합니다. 이러한 DOS 공격은 TypeFilterLevel이 full로 설정된 경우에만 가능합니다.

임대의 만료가 허용된 경우에는 추가적인 임대 메시지 또는 스폰서 반환이 허용되지 않습니다. 임대의 참조가 임대 목록에서 제거되고 .NET Framework 원격 시스템이 내부 테이블에서 개체 참조를 제거합니다. 그런 다음 가비지 수집 시스템이 임대와 개체를 제거합니다.

참고 항목

작업

방법: InitializeLifetimeService 인터페이스 재정의
방법: 임대 갱신

참조

원격 설정 스키마
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

개념

원격 서비스 예제: 수명
임대 초기화
임대 갱신

관련 자료

개체 활성화 및 수명