관리 메뉴

KorSA

DotNet 의 AppDomain (Application Domain) 본문

Study Memos/C#

DotNet 의 AppDomain (Application Domain)

Praiv. 2019. 1. 14. 23:36
320x100

● Application Domain 이란 ?

=> 닷넷, 즉 CLR 위에서 돌아가는 논리적인 프로세스이다. 줄여서 AppDomain 이라고도 부른다.


App Domain 을 이해하기 위해서는 CIL과 CLR을 우선 이해해야 한다.


● CIL (Common Intermediate Language) 이란 ?

=> DotNet Framework 에서 실행되는 언어이다. C# 으로 짜여진 소스코드를 컴파일하면 바로 바이너리 파일이 나오는 것이 아니고, CIL 로 쓰여진 파일이 나온다.



● CLR (Common Language Runtime) 이란 ?

=> 자바 사용자들은 JVM 의 C# 버전이라고 생각하면 편하다. 즉 C# 등의 DotNet 언어로 작성된 프로그램이 어느 OS 위에서건 실행되도록 하기 위한 가상 실행 환경이다. OS 위에 CLR 이라는 가상 실행 환경을 하나 더 올리고, 그 위에서 (즉, CLR 위에서) 프로그램을 실행시킨다. 이 때, 이 프로그램은 CIL 로 작성된 프로그램이다.




이 CIL 프로그램들은 하나의 AppDomain 을 기본적으로 가지고 있는데 이를 Default App Domain 이라고 부른다. Default App Domain 은 Sub App Domain 을 생성할 수 있다. 즉, 하나의 CIL 프로그램이 App Domain 을 여러개 가질 수 있다. 서로 다른 App Domain 들끼리 통신을 하고자 하는 경우, Sub App Domain은 가만히 있고, 각 App Domain 들의 대표격인 Default App Domain 들끼리 통신을 한다.


여기서 CLR 의 역할을 좀 더 논하자면, DotNet 의 논리적인 프로세스인 App Domain 을 OS가 인식할 수 있는 물리적인 프로세스, 즉 실제 바이너리 파일 (.exe) 로 변환시켜준다.


App Domain 들은 CLR 이 관리하기 때문에 OS 는 이들을 직접 보지 못하고 CLR 이 보여주는 대로만 볼 수 밖에 없다. 그래서 실제론 하나의 App Domain 안에 Default App Domain 과 세 개의 Sub App Domain 이 있다 할지라도, CLR이 하나의 프로세스라고 OS 에게 말해주면 OS는 하나의 프로세스만 돌고 있다고 여기게 된다.



● 개발 이야기


C# 프로그램을 짜는 도중, 프로그램을 중복 실행시키면 IOException 이 발생하는 버그를 만났다. 이 프로그램은 처음 시작할 때 ResolveAssembly 등 AppDomain 정보 몇 개를 건드리고 시작한다. 그 이후, Mutex 를 이용하여 프로그램이 중복으로 실행되었는지 검사하게 되는데, 이 과정에서 예외가 발생하는 것이었다. 나는 Mutext로 먼저 중복 실행 여부를 확인하고, 그 이후에 AppDomain 정보를 수정하였다. 그리고 이 모든 작업을 Service class 의 Main() 함수 안에서 수행하도록 코드를 옮겼다. 이렇게 컴파일하니 IOException의 발생 없이 정상적으로 Mutex가 동작하여 이 프로그램이 중복으로 실행되지 않았다. 이건 확실하지 않지만, AppDomain 관련 처리는 Main() 함수 내에서 바로 처리해 주어야 하나보다..

728x90
728x90
Comments