JVM 구조와 작동 원리 — Bytecode가 CPU에서 실행되기까지
Java Roadmap의 JVM 영역을 Zoom-in해 Class Loading, Linking/Initialization, Runtime Data Areas, Frame, Interpreter/JIT, GC와 Native 경계를 하나의 실행 흐름으로 연결한다.
Java Roadmap의 JVM 영역을 Zoom-in해 Class Loading, Linking/Initialization, Runtime Data Areas, Frame, Interpreter/JIT, GC와 Native 경계를 하나의 실행 흐름으로 연결한다.
Java를 문법 목록이 아니라 Language, JVM 실행 모델, Standard Library, Concurrency/JMM, 그리고 JPA 같은 생태계 Branch로 나눠 전체 지형과 학습 경계를 잡는다.
Program Execution 전체 지도 지금까지 소스 코드가 컴파일되고, 링크되고, 프로세스가 되어 메모리에 배치되고, 필요할 때 커널 Service를 요청하는 흐름을 따라왔다. 마지막에는 결국 CPU가 Machine 코드를 실행한다. 컴파일러가 만든 Machine 코드는 CPU 안에서 실제로 어떻게 실행되는가? 1. 소스 코드와 ...
Program Execution 전체 지도 지금까지는 네이티브 프로그램을 기준으로 컴파일, 링크, Load, 프로세스, 가상 메모리, System Call을 따라왔다. 그런데 Java, Go, JavaScript, WebAssembly를 보면 실행 구조가 서로 다르다. Runtime이 있다는 말은 정확히 무엇이며, 언어마다 Runtime은 ...
Program Execution 전체 지도 앞선 글에서는 애플리케이션이 System Call을 통해 커널 Service를 요청하는 경계를 살펴봤다. 그런데 컴파일러가 만든 코드, 라이브러리, 운영체제는 서로 따로 만들어질 수 있다. 서로 다른 바이너리는 인자 위치, 반환값, Data 배치 같은 약속을 어떻게 맞출까? 이 바이너리 수준의 ...
Program Execution 전체 지도 앞선 글까지는 프로그램의 코드와 Data가 어떻게 CPU와 메모리에서 실행 가능한 상태가 되는지 살펴봤다. 하지만 실제 프로그램은 계산만 하지 않는다. 파일을 읽는다 네트워크로 데이터를 보낸다 새 Process를 만든다 시간을 확인한다 Device를 사용한다 이런 자원은 운영체제가 관리한다. 그래...
Program Execution 전체 지도 앞선 글에서는 실행 파일이 Loader를 거쳐 프로세스가 되는 흐름을 살펴봤다. 프로세스가 만들어지면 다음 질문이 생긴다. 프로그램이 사용하는 주소는 실제 RAM의 어느 위치를 가리키는가? 처음에는 프로세스가 RAM의 특정 영역을 직접 사용하는 것처럼 생각하기 쉽다. 현대 운영체제에서는 보통 ...
Program Execution 전체 지도 앞선 글에서는 소스 코드가 컴파일과 링크를 거쳐 실행 파일이 되는 과정을 살펴봤다. 그런데 실행 파일이 만들어졌다고 프로그램이 실행 중인 것은 아니다. 디스크에 있는 실행 파일을 실행하면, 운영체제는 무엇을 해서 그것을 프로세스로 만드는가? 이번 글에서는 이 경계를 따라간다. 1. 실행 파일...
Program Execution 전체 지도 앞선 글에서는 프로그램이 실행되는 전체 흐름을 살펴봤다. 이번에는 그중 앞부분인 소스 코드가 실행 파일이 되기까지를 조금 더 자세히 살펴본다. 핵심 질문은 하나다. 왜 소스 코드를 컴파일하는 것만으로 끝나지 않고, 오브젝트 파일과 링커라는 단계가 따로 필요한가? Source Code ...
코드를 작성하고 실행 버튼을 누르면 프로그램이 실행된다. 평소에는 이 과정을 당연하게 사용하지만, 그 사이에는 생각보다 많은 계층이 존재한다. Source Code ↓ Compiler / Toolchain ↓ 실행 모델에 따라 갈라짐 │ ├─ Native │ Object File │ ↓ ...