응용 프로그램 도메인을 이해하지 못합니다.


80

.NET에는 내가 이해하는 바에서 어셈블리를 메모리에로드하는 데 사용할 수있는 애플리케이션 도메인 개념이 있습니다. 이 주제에 대한 추가 지식을 얻기 위해 응용 프로그램 도메인에 대한 조사를 수행하고 지역 서점에 갔지만 매우 부족한 것 같습니다.

응용 프로그램 도메인으로 할 수있는 작업은 메모리에 어셈블리를로드하고 원하는 경우 언로드 할 수 있다는 것뿐입니다.

응용 프로그램 도메인에 대해 언급 한 다른 기능은 무엇입니까? 스레드는 애플리케이션 도메인 경계를 존중합니까? 통신 성능을 넘어서 주요 응용 프로그램 도메인이 아닌 다른 응용 프로그램 도메인에 어셈블리를로드하는 데 따른 단점이 있습니까?

응용 프로그램 도메인을 설명하는 리소스에 대한 링크도 좋습니다. 나는 그들에 대한 많은 정보가없는 MSDN을 이미 확인했습니다.

답변:


100

AppDomain은 매우 가벼운 프로세스로 가장 잘 시각화됩니다.

.Net 프로세스 당 N 개의 AppDomain이있을 수 있지만 일반적으로 말하면 하나만 있습니다. AppDomains의 진정한 장점은 프로세스 내에서 격리 경계를 제공한다는 것입니다. 개체는 원격 또는 직렬화를 통해 AppDomain 경계를 넘어서 만 서로 통신 할 수 있습니다.

프로세스 내에서 완전히 다른 보안 수준에서 2 개의 AppDomain을 실행할 수도 있습니다. 이렇게하면 훨씬 낮은 신뢰 수준에서 신뢰할 수없는 플러그인을 실행하면서 전체 신뢰에서 기본 애플리케이션을 실행할 수 있습니다.

스레드가 AppDomain을 존중하는지 여부에 대해 예 또는 아니오를 포괄적으로 말하기는 어렵습니다. 단일 스레드가 N 개의 서로 다른 AppDomain에있을 수 있습니다. 이러한 상황은 한 AppDomain의 개체가 다른 AppDomain의 개체를 원격 호출하는 경우 가능합니다. 스레드를 완료하려면 AppDomain간에 전환해야합니다.

AppDomains의 단점은 주로 복잡성입니다. Remoting은 머리를 돌리는 데 약간의 시간이 걸릴 수 있으며 AppDomain을 올바르게 설정하는 것은 사소한 프로세스가 아닐 수 있습니다.

AppDomains에 대한 MSDN 설명서를 살펴볼 수 있습니다. 복잡한 기능이 다양하기 때문에이를 설명하는 간결한 자습서를 찾기가 어렵습니다. 이것은 귀하의 질문에 직접 답변하지 않으면 최소한 올바른 위치로 안내하는 멋진 개요를 제공합니다.

http://msdn.microsoft.com/en-us/library/cxk374d9.aspx

이 문서는 더 이상 유지 관리되지 않습니다. 업데이트 된 버전은 https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx를 참조하십시오.


4
주요 관심사는 내가 그것들을 사용함으로써 얻는 능력을 이해하지 못한다는 것입니다. 나는 그것들이 가벼운 프로세스라는 것을 읽었지만 그것들은 그 이상을 가지고있는 것처럼 보이며 나중에 나를 물릴 수있는 무언가를 놓치고 있을지도 모른다. IE 필요한 것보다 더 많이 꺼내고 있습니다.
Jeremy Edwards

92

JaredPar의 대답은 좋습니다. 단, AppDomains에 대한 이유 를 알지 못합니다 . 즉, AppDomain을 언로드하여 어셈블리를 언로드 할 수만 있다는 것입니다. 오래 실행되는 OS 프로세스이고 어떤 이유로 든 어셈블리 를로드 한 다음 나중에 언로드 해야하는 경우 AppDomain이 필요합니다. 여기의 프로토 타입 예제는 ASP.NET으로, 요청시 앱 코드 어셈블리를로드 한 다음 앱이 더 이상 활발하게 사용되지 않을 때 나중에 언로드 할 수 있습니다.

언로드 기능에 대해 지불하는 비용은 독립성입니다. AppDomain 경계를 넘어 통신해야합니다. 간단한 메서드 호출을 만들 수 없습니다. AppDomain 수명주기를 관리해야합니다. 기타.

그냥 동적으로로드 어셈블리에 필요하고 생각하지 않으면 당신은 그들을 언로드해야합니다 단일 프로세스의 수명 동안 그때는 아마 하지 않는 여러 응용 프로그램 도메인을 실행해야합니다. 여기에 좋은 예는 플러그인 모델을 지원하는 풍부한 앱으로, "etc"디렉토리에서 플러그인 어셈블리를 찾아 내고 모두로드하는 것입니다. 그러나 플러그인 모델이 플러그인 언로드를 요구하는 경우 ... 음.

외부 시나리오가 있습니다. 마찬가지로 두 개의 서로 다른 버전의 어셈블리를 동시에로드한다고 가정합니다. AppDomain으로 분리하지 않으면 함정에 빠질 수 있습니다. 그러나 그것은 매우 드문 일입니다.

AppDomains의 존재를 정당화하는 핵심 시나리오는 어셈블리를 언로드 할 수 있어야하는 장기 실행 프로세스입니다.

물론 어셈블리를 언로드하려는 경우 응용 프로그램은 OS 프로세스에 의존 할 수 있습니다. 즉, 각각 자체 어셈블리 집합이있는 3 개 또는 4 개의 협력 프로세스를 실행할 수 있으며 어셈블리를 언로드하려는 경우 해당 어셈블리를 호스팅하는 프로세스를 종료하면됩니다. 그러나 AppDomain은 프로세스 중지 / 시작 또는 프로세스 간 통신을 요구하지 않고이를 수행 할 수있는 더 높은 성능의 메커니즘을 제공합니다. 이는 앞서 설명한 교차 AppDomain 통신보다 여전히 무겁습니다. 내 말은 여전히 ​​원격이지만 더 느리고 더 많은 컨텍스트 전환입니다.


17
정의해야한다고 생각하는 단어를 사용하는 이유는 무엇입니까?
BlueRaja-Danny Pflughoeft

44
컴퓨터 과학 질문에 대한 답에 프랑스어 단어를 사용하는 것이 재미 있기 때문입니다.
Cheeso

13
@ BlueRaja-DannyPflughoeft는 영어로 훨씬 더 서투르게 정의 된 아이디어를 완벽하게 캡슐화하는 일반적으로 사용되는 외국 용어에 익숙하지 않은 사람들을 교육하는 데 도움이됩니다.
Sam Holder

6
@SamHolder 링크 된 Wikipedia 기사는 영어 번역이 "존재 이유"라고 말합니다. 그것은 나에게 너무 서투르게 정의되지 않은 것 같습니다.
Bognar

5
내가 찾을 수있는 한 MSDN의 어느 곳에서도 "raison d' etre"가 명확하게 언급되지 않았기 때문에 이것이 최선의 대답입니다.
Dan Ling

27

AppDomain으로 수행 할 수있는 작업 :

  • 프로그램의 안정성을 위협하지 않고 종료 할 수 있습니다.
  • 코드를로드하고 자신의 프로세스보다 적은 권한을 부여 할 수 있습니다 (예 : 프로세스가 완전히 신뢰할 수 있지만 디스크에 파일을 생성 할 수없는 별도의 AppDomain에 코드를로드합니다).
  • 프로세스를 중단하지 않고도 AppDomain의 처리되지 않은 예외를 처리 할 수 ​​있습니다.
  • 기타.

간단히 말해서 보안 경계이며 대부분의 프로세스 경계입니다. 성능에 관한 한 프로세스 내의 여러 AppDomain은 상당한 오버 헤드를 나타내지 않습니다. AppDomain 대신 별도의 프로세스를 시작하는 것은 훨씬 더 많은 비용이 듭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.