07
27

 

 

이 글은 STACK BASED VS REGISTER BASED VIRTUAL MACHINE ARCHITECTURE, AND THE DALVIK VM 의 내용 일부를 제가 보기 좋도록 정리한 것 입니다. 원문을 읽는 것을 추천합니다. 

 

 

 

 

Virtual Machine

 

가상 머신(virtual machine, VM)은 컴퓨터 환경을 소프트웨어로 구현한 것이다. 컴퓨터 시스템을 에뮬레이션(가상현실화)하는 소프트웨어로, 가상 머신 상에서 운영 체제나 응용 프로그램을 설치하고 실행할 수 있다. 이 때, 가상 머신 안에서 돌아가는 소프트웨어는 가상 머신이 제공하는 환경 및 자원에 제한을 받는다. 가상 머신을 사용하면 동일한 플랫폼을 여러 운영 체제 및 하드웨어 아키텍처에서 실행할 수 있다.

 

 

가상 머신은 시스템 가상 머신과 프로세스 가상 머신으로 나뉜다.

  • 시스템 가상 머신 : 완전한 시스템 플랫폼, 즉 운영 체제(OS)의 실행을 지원한다.
  • 프로세스 가상 머신 : 하나의 단일 프로그램, 프로세스를 지원한다.

 

 

이후로 이 글에서는 프로세스 가상 머신에 대해 말한다. 가상 머신은 실제 CPU가 하는 작업을 가상현실화 할 수 있어야 하므로 다음을 포함해야 한다.

  • VM별 바이트 코드로 소스 언어 컴파일
  • 명령어 및 피연산자를 포함하는 데이터 구조
  • 함수 호출 작업을 위한 콜스택
  • 실행할 다음 명령을 가리키는 명령 포인터 (IP)
  • 가상 CPU : dispatcher는 다음과 같다
    • Fetch : 명령 포인터(IP) 가 가리키는 명령어를 가져온다
    • Decode : 피연산자를 디코딩한다
    • Execute : 명령어를 실행한다

 

 

가상 머신을 구현하는 방법에는 스택 기반, 레지스터 기반 두 가지가 있다. 이 두 접근 방식의 차이점은 피연산자와 그 결과를 저장하고, 검색하는 데 사용되는 매커니즘에 있다.

  • 스택 기반 → Python VM, Java VM, .NET CLR
  • 레지스터 기반 → Lua VM, Dalvik VM

 

 

 

 

 

스택 기반 VM

 

스택 기반 VM에서, 피연산자가 저장되는 메모리 구조는 스택으로 되어있다. 스택에서 데이터를 꺼내어(pop) 명령을 처리한 후 결과를 다시 스택에 밀어넣는다(push). 그렇기에 스택 기반 VM에서는 모든 연산이 피연산자 push, pop을 통해 수행된다.

 

  • POP 20
  • POP 7
  • ADD 20, 7, result
  • PUSH result

 

 

장점

  • 다음 피연산자의 주소는 stack의 top 이므로 피연산자의 주소를 작성할 필요가 없어 명령의 길이가 짧다.
  • 하드웨어(레지스터, CPU)를 직접 다루지 않으므로 다양한 하드웨어에서 쉽게 VM을 구현할 수 있다.

 

 

 

 

 

 

레지스터 기반 VM

 

레지스터 기반 VM에서, 피연산자가 저장되는 메모리 구조는 CPU의 레지스터를 기반으로 한다. push, pop과 같은 연산이 없는 대신 명령어가 피연산자의 주소(레지스터)를 포함해야한다. 스택 기반 VM에서는 stack의 top이 다음 피연산자를 가리키고 있었으나 레지스터 기반에서는 그렇지 않기 때문에 다음 피연산자의 주소를 알려주어야 한다.

 

  • ADD R1, R2, R3 ;        # Add contents of R1 and R2, store result in R3

 

 

장점

  • 같은 명령을 처리할 때 스택 기반보다 적은 명령어로 처리가 가능하다.
  • 스택에서 push, pop하는 오버헤드가 없다.
  • 최적화가 가능하다. 공통 하위 표현식이 있는 경우 한 번 계산한 값을 레지스터에 저장하여 재사용 할 수 있다.

 

 

 

 

 

한 쪽의 장점은 다른 쪽의 단점이 된다. 정리하면 아래와 같다.

 

  스택 기반 레지스터 기반
하드웨어 영향 적다 크다
평균 명령어 크기 적다 크다 (피연산자의 주소를 직접 명시)
평균 명령어 수 많다 (push, pop 여러 번 명령) 적다
일부 최적화 X O (표현식 사용 후 저장하여 재사용 가능)
push/pop 오버헤드 O X (stack 안 씀)

 

 

 

 

 

'CS > 기타' 카테고리의 다른 글

[SQL] 프로그래머스 SQL 풀이  (0) 2022.07.31
캐싱 전략  (0) 2022.07.29
GraphQL 이란 ?  (0) 2022.07.05
바이트코드와 기계어  (0) 2022.05.17
CS 관련 Github repo 정리  (0) 2022.03.30
COMMENT