본문 바로가기
Back-end

가상 머신(스택 기반, 레지스터 기반)

by 신재권 2023. 8. 24.

가성 머신

가상 머신(VM : Virtual Machine)은 물리적인 CPU에 의해 처리되는 동작을 흉내낼 수 있어야 한다.

실제 하드웨어와 유사한 환경을 소프트웨어로 구현한 것이다.

이를 통해 여러 운영체제나 응용 프로그램등을 물리적 하드웨어상에서 실행하는 것처럼 실행할 수 있다.

가상 머신은 호스트 머신(실제 물리적 하드웨어) 위에서 동작하며, 각 가상 머신은 독립적으로 실행되는 것 처럼 보이지만, 실제로는 호스트 머신의 자원을 공유한다.

가상 머신은 아래의 개념을 구현해야 한다.

  • 소스 코드를 VM이 실행할 수 있는 바이트코드로 변환
  • 명령어와 피연산자를 포함하는 데이터 구조
  • 함수를 실행하기 위한 콜스택
  • 다음 실행할 명령어를 가리키는 IP(Instruction Pointer)
  • 가상 CPU
  • Fetch : IP가 가리키는 명령어를 가져온다
  • Decode : 가져온 명령어를 해석한다.
  • Excecution : 디코딩 된 명령어를 수행한다.

위 개념을 구현하는 방법은 2가지가 존재한다.

  • 스택 기반 VM
  • 레지스터 기반 VM

스택 기반 VM

스택 기반 가상 머신은 연산을 수행할 때 스택을 사용한다.

연산자와 피연산자를 스택에 푸쉬하고 팝하여 연산을 수행하는 방식이다.

대표적인 예로 자바 바이트코드를 실행하는 JVM이 있다.

예시로 덧셈을 한다고 가정한다.

1 + 2 + 3 을 한다고 할때, CPU의 덧셈 연산은 2개의 피연산자를 다루므로, 2개를 계산한 결과를 나머지 숫자와 더해야 한다.

스택 기반의 VM은 이 결과를 바로 스택에 저장된다.

즉 1, 2, 3 순으로 쌓여있을 때, 2+3을 수행해 결과인 5를 다시 스택에 푸쉬하고, 1 + 5 를 더해 6 결과를 얻는다.

자바 바이트코드는 피연산자 연산자로 이루어져 있는데, 이를 기반으로 스택에 푸쉬해 연산을 수행한다.

즉, 스택 기반 VM은 피연산자를 저장하고 가져올 때 스택을 활용한다.

장점

  • 하드웨어에 덜 의존적이다 : 하드웨어에 대해 직접적으로 다루지 않으므로, 다양한 하드웨어에서 쉽게 VM을 구현할 수 있다.
  • 명령어의 길이가 짧아진다 : 다음 피연산자는 스택의 TOP에 존재하므로, 피연산자의 주소를 사용할 필요 없다. 즉, 메모리 주소를 적을 필요가 없으므로 명령어의 길이가 짧아진다.

단점

  • 명령어의 수가 많아진다.
  • 스택을 사용하는 오버헤드가 존재한다.
  • 명령어 최적화를 할 수 없다.

레지스터 기반 VM

레지스터 기반 가상 머신은 레지스터를 사용하여 연산을 수행한다.

연산자와 피연산자를 레지스터에 저장하고 레지스터 간의 연산을 수행하는 방식이다.

장점

  • 명령어의 수가 적다 : POP, PUSH 없이 하나의 명령어로 계산이 가능하다.
  • 스택 오버헤드가 없다.
  • 명령어 최적화를 할 수 있다.
  • 동일한 연산식이 존재하는 경우 레지스터에 넣어 캐싱할 수 있다.

단점

  • 명령어의 크기가 커진다.
  • 명령어에 피연산자의 메모리 주소를 명시해야 하므로, 명령어 길이가 길어진다.

'Back-end' 카테고리의 다른 글

IoC/DI  (0) 2023.08.30
JDBC  (0) 2023.08.24
Object.equals()를 재정의 해야 하는 이유  (0) 2023.08.24
sychronized, Atomic  (0) 2023.08.24
Servlet, ServletContainer vs DispatcherServlet  (0) 2023.08.24