본문 바로가기

IT 살이/04. 기술 - 프로그래밍

04. ASP.NET 웹 어플리케이션, AppDomain

웹 어플리케이션과 Appdomain에 대해서 좀 더 알아보자.



코드의 실행 범위 그리고 리소스의 소유 범위를 결정하는 모델은 프로그래밍 모델, 기술에 따라서 항상 있어왔다. OS에서는 프로세스(process)가 애플리케이션의 경계가 되었고, IIS와 ASP에서는 가상 디렉토리를 기준으로 애플리케이션이 구분되었고 그리고 .NET 실행환경에서는 실행공간을 나누기 위해서 애플리케이션 도메인(AppDomain) 개념을 사용하고 있는 것이다. 즉 애플리케이션의 코드가 실제로 실행되는 런타임 공간이 AppDomain이다.

"웹 어플리케이션"은 IIS 관리자에서 시각적으로 보이기때문에 익숙할 수 있다. 반면에 "어플리케이션 도메인"은 IIS 관리자를 통해서 보여지지 않기때문에 익숙하지 않다. 


각 ASP.NET 어플리케이션은 각자의 AppDomain에서 실행된다. 위 그림를 예로 하면 다음과 같은 어플리케이션 도메인( AppDomain들)이 워커 프로세스에 생성된다. 


System Domain

Shared Domain

Default Domain

Root

webapp


애플리케이션 도메인은 프로그램적으로도 생성할 수 있어서 하나의 프로세스에 여러 개 있을 수 있는 구조가 될 수 있다. 그러나 기본적으로 이처럼 구성된다. 이탤릭체로 된 3개의 AppDomain은 내부적으로 사용되는 특별한 것이고, 이것을 제외하고 나머지 두 개는 각각의 웹 어플리케이션에 댕응되는 것들이다. 웹 어플리케이션은 몇 개의 가상 디렉토리를 가질 수 있는데, 이것들은 같은 AppDomain에서 실행된다. 

AppDomain 리사이클은 워커 프로세스가 리사이클되지 않아도 일어날 수 있다. 간단히 말해서 각 AppDomain은 워커 프로세스내의 프로세스로서 자신의 정적인 리소스 즉 캐시와 세션 등을 갖는다. 그러나 워커 프로세스 내의 모든 AppDomain들은 동일한 GC(Garbage Collector), 쓰레드 풀, finalizer 쓰레드를 공유한다. 각각의 웹 어플리케이션은 AppDomain별로 아래 리소스를 각각 관리해서 관리한다. 


- 해당 어플리케이션이 가지고 있는 모든 어셈블리들

- HttpRuntime 객체

- Cache 객체

- Session 객체


AppDomain이 언로딩되면 이 모든 것들도 사라진다. 따라서 AppDomain이 리사이클되지 않도록 하는 것이 성능적인 측면에서 중요하다. AppDomain은 다음과 같은 일들이 일어날때 리사이클된다. 


- 어플리케이션 설정 파일들(Machine.Config, Web.Config) 또는 Global.asax 이 수정될때 

- bin 디렉토리나 그 내용 파일들이 수정될때

- aspx, ascx, asax 파일이 재 컴파일된 수가 <compilation numRecompilesBeforeAppRestart=/>설정값보다 넘을때(기본값 15 )

- 가상 디렉토리의 물리적 경로가 바뀔때

- CAS 정책이 수정될때

- 웹 서비스가 재시작할때 등

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx


이미 시작된 웹 어플리케이션에 대한 요청이 오면, ASP.NET은 새로운 AppDomain을 생성하지 않고, 이미 있는 AppDomain을 사용한다. 웹 어플리케이션에 포함된 타입의 객체를 생성하고 메소드를 호출한다. 

만약 클라이언트가 다른 웹 어플리케이션 예를 들어 위 그림에서 “webapp”에 포함된 aspx에 대한 요청을 하면, ASP.NET은 CLR에게 새로운 AppDomain을 생성하도록 해서 그 요청을 그곳에서 처리한다. 이때 생성된 AppDomain에는 웹 어플리케이션에서 설정한 configuration을 사용하게 되고, 그리고 필요한 어셈블리들은 기존의 AppDomain과는 별도로 로딩해서 사용한다.


CLR via C# p.540~541 


ASP.NET Case Study: Lost session variables and appdomain recycles

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx