널널한 개발자님의 자바 JVM의 간단한 구조 영상을 보던 중 문득 의문이 하나 생겼다.
가상머신이 메모리 관리를 수행하고 각종 OS Api를 대신 호출을 하는 등 많은 일을 하는데 해당 작업들을 수행하는 코드들은 컴파일 될 때 내 파일에 생기는 건가? 아니면 내 코드가 실행될 때 가상머신도 같이 실행되어서 가상머신 쪽 함수를 호출하는 형식으로 구현이 된건가? 궁금해졌다.
간단히 구글링한 결과
윈도우 기준으로 닷넷으로 작성된 PE파일을 실행시키면 운영체제가 mscoree.dll을 호출함으로 CLR이 초기화되고 내가 작성한 코드들이 로드되어 실행이 된다고 한다.
dotnet파일 실행 -> 운영체제가 적합한 CLR를 실행 -> CLR가 내 코드를 실행
게임 엔진을 다루어 보았다면 게임엔진이 내 코드를 실행시켜주는 것과 유사하다고 본다.
| 내코드 |
| dotnet |
| 운영체제 |
| 하드웨어 |
내 코드가 실행이 되려면, 운영체제가 프로세서에 내 프로세스를 할당해주어야 하며 닷넷이 내 코드를 실행시켜줘야 내코드가 실행된다.
필요에 따라 내 코드를 실행 중단 시킬 수 있음 (예를 들면 GC?)
내 코드가 컴파일 된 영역에는 닷넷 관련 로직은 없지만 내 코드를 실행 시킬때 운영체제가 닷넷부터 실행시킨다. 이는 내 코드와 닷넷이 동시에 실행되는 구조라기 보단 내 코드가 닷넷에 포함되는 구조임.
(브라우저, 유니티, 언리얼, node.js같은 것과 유사한 것 같다.)
윈도우 구조(dll, PE)와 플랫폼 언어(C#, JAVA 등)이 아닌 네이티브 언어로 작성 된 실행파일(PE파일)의 실행 과정
닷넷 프로그램 실행과정이 컴파일 전략(JIT, AOT)에 따라 차이가 있는가?
C언어 또한 CRT(C 런타임)이 main문을 호출해 주는데 CRT 또한 프레임워크인가?
https://www.youtube.com/watch?v=a-3hfuQqKYY&ab_channel=%EB%84%90%EB%84%90%ED%95%9C%EA%B0%9C%EB%B0%9C%EC%9E%90TV
http://www.csharpstudy.com/DevNote/Article/20
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=oidoman&logNo=90160134036