ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 레지스터 기반 가상 머신 vs 스택 기반 가상 머신(JVM) 이해하기
    BackEnd/자바 2022. 9. 3. 02:51

    가상 머신(VM)은 고급 언어(Java, Python 등)를 하드웨어가 이해할 수 있는 저수준 명령어로 실행하기 위한 소프트웨어 아키텍처입니다.
    VM의 아키텍처는 크게 두 가지 방식으로 나뉘며:

    • 레지스터 기반(Register-based VM)
    • 스택 기반(Stack-based VM)

    대표적인 스택 기반 VM이 바로 JVM(Java Virtual Machine)입니다.
    이 글에서는 두 가지 구조의 차이점과 장단점, 그리고 JVM의 스택 구조에 대해 정리해보겠습니다.

     

     레지스터 기반 가상 머신

    특징

    • CPU와 유사하게 동작하며, 연산에 필요한 값을 레지스터에 저장하여 처리
    • 명령어에는 연산 대상인 레지스터 주소(R1, R2 등)가 명시되어 있음
    • PUSH/POP 명령어 없이 바로 연산 수행

    ✅ 장점

    • PUSH/POP 작업이 없어서 연산 속도가 빠름
    • 공통 하위 표현식(공통된 중간 연산 결과)을 레지스터에 저장해 재사용 가능 → 최적화 용이
    • 명령어 디스패치 루프에서 실행이 효율적

    ❌ 단점

    • 피연산자 위치를 명시해야 하므로 명령어 길이가 김
    • 레지스터 개수 제한이 존재

    가상 머신의 레지스터 기반 구현에서 피연산자가 저장되는 데이터 구조는 CPU의 레지스터를 기반으로 합니다. 

    여기에는 PUSH 또는 POP 작업이 없지만 명령어에는 피연산자의 주소(레지스터)가 포함되어야 합니다. 

    즉, 피연산자를 가리키는 스택 포인터가 있었던 스택 기반 모델과 달리 명령어의 피연산자는 명령어에서 명시적으로 주소가 지정됩니다. 

    예를 들어 레지스터 기반 가상 머신에서 추가 작업을 수행해야 하는 경우 명령어는 다음과 같습니다.

     

    앞서 언급했듯이 POP 또는 PUSH 작업이 없으므로 추가 지침은 한 줄입니다. 

    그러나 스택과 달리 피연산자의 주소를 R1, R2 및 R3으로 명시적으로 언급해야 합니다. 

    여기서 장점은 스택으로 푸시하거나 스택에서 팝핑하는 오버헤드가 없고 레지스터 기반 VM의 명령어가 명령어 디스패치 루프 내에서 더 빠르게 실행된다는 것입니다.

    레지스터 기반 모델의 또 다른 장점은 스택 기반 접근 방식에서 수행할 수 없는 일부 최적화를 허용한다는 것입니다. 

    그러한 경우 중 하나는 코드에 공통 하위 표현식이 있는 경우 레지스터 모델이 이를 한 번 계산하고 하위 표현식이 다시 나타날 때 나중에 사용할 수 있도록 결과를 레지스터에 저장할 수 있으므로 표현식을 다시 계산하는 비용을 줄일 수 있습니다.

    레지스터 기반 모델의 문제는 피연산자 주소를 명시적으로 지정해야 하므로 평균 레지스터 명령이 평균 스택 명령보다 크다는 것입니다. 

    스택 머신의 명령어는 스택 포인터로 인해 짧지만 각 레지스터 머신 명령어는 피연산자 위치를 포함해야 하며 스택 코드에 비해 레지스터 코드가 더 커집니다.

    https://www.codeproject.com/Articles/461052/Stack-Based-vs-Register-Based-Virtual-Machine-Arch

     


    스택 기반 가상 머신 (JVM)

    특징

    • 연산 시 피연산자를 스택에 푸시(PUSH)하고 결과를 다시 스택에서 팝(POP)하여 처리
    • 연산 대상 주소를 명시할 필요가 없어 명령어가 간결하고 짧음
    • JVM은 지역 변수와 피연산자 스택을 별도로 관리

    ✅ 장점

    • 명령어가 단순하고 구현이 쉬움
    • 스택 포인터를 이용하므로 명령어 크기가 작음

    ❌ 단점

    • PUSH/POP 연산의 오버헤드가 존재
    • 중간 계산 결과를 재사용하기 어렵기 때문에 일부 최적화가 불리

    JVM은 계산을 할 때 '피연산자 스택'이라는 공간을 사용합니다.
    이 스택은 계산에 필요한 값을 잠깐 담아두는 작업 공간처럼 쓰입니다. 예를 들어 a + b 같은 계산을 할 때, a와 b를 이 스택에 차례로 넣고(PUSH), 꺼내서(POP) 더합니다.

    피연산자 스택도 배열처럼 생겼지만, 우리가 흔히 쓰는 배열처럼 인덱스를 이용해서 값을 꺼내거나 넣지는 않습니다.
    대신, iload, iadd, istore 같은 JVM 명령어들이 값을 스택에 넣고, 꺼내고, 계산해주는 역할을 합니다.

    JVM 스택 구조

    JVM은 메서드를 실행할 때마다 스택 프레임(Stack Frame)을 생성합니다.
    각 프레임은 메서드 호출 정보와 실행에 필요한 데이터를 저장합니다. 내부 구성은 다음과 같습니다:

    // Class Declaration
    class Example {
      public void bike(int i, long l, float f, double d, Object o, byte b){
        
      } 
    }

     

    1. 로컬 변수 배열(Local Variable Array, LVA)

    메서드 내부의 로컬 변수들을 저장하는 고정 배열입니다. 인덱스를 이용해 접근합니다.

    2. 피연산자 스택(Operand Stack, OS)

    계산 중에 사용하는 임시 저장 공간입니다. 명령어로만 접근 가능하며 연산 결과도 여기서 저장/이동됩니다.

     

    • iload_0과 iload_1은 로컬 변수 배열에서 값을 꺼내어 피연산자 스택에 푸시합니다.
    • isub는 스택에서 두 값을 꺼내어 빼기 연산을 수행한 뒤, 결과를 다시 스택에 저장합니다.
    • istore_2는 연산 결과를 스택에서 꺼내어 로컬 변수 배열의 2번 위치에 저장합니다.

     

    '

    iload_0     // LVA[0] (a의 값 50)을 operand stack에 복사
    iload_1     // LVA[1] (b의 값 20)을 operand stack에 복사
    isub        // 스택에서 50, 20 꺼내서 뺌 → 30을 다시 스택에 저장
    istore_2    // 30을 꺼내서 LVA[2]에 저장

     

     

    3. Frame Data (FD)

    - JVM에서 Frame Data는 하나의 메서드가 실행될 때 생성되는 실행 프레임(Execution Frame)의 일부입니다.
    메서드가 호출되면, 그 메서드만을 위한 고유한 공간(Frame)이 생성되고, 이 안에 여러 데이터가 포함됩니다.
    그 중 중요한 구성 요소 중 하나가 Frame Data입니다.

    - 예외가 발생했을 때 JVM은 Exception Table을 참조하여 "이 예외를 처리할 수 있는 catch 블록이 있는가?"를 찾습니다.
    FD는 이 테이블에 대한 참조(reference)를 가지고 있어서, 예외 발생 시 빠르게 해당 정보를 사용할 수 있습니다.

     

    https://www.geeksforgeeks.org/java-virtual-machine-jvm-stack-area/

     

    Java Virtual Machine (JVM) Stack Area - GeeksforGeeks

    Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.

    www.geeksforgeeks.org

     

    반응형

    'BackEnd > 자바' 카테고리의 다른 글

    JVM  (0) 2022.09.03
    CompletableFuture  (0) 2022.04.14
    코드개선예제  (0) 2022.04.11
    동시성 - 모던 자바 인 액션  (0) 2022.04.11
    모듈화 - 모던 자바 인 액션  (0) 2022.04.10
Designed by Tistory.