티스토리 뷰

우리가 흔히 말하는 가상 머신은 기본 운영 체제를 기반으로 한 물리적 추상화를 에뮬레이트하는 높은 수준의 추상화로, 가상 시스템을 통해 동일한 플랫폼을 여러 운영 체제 및 하드웨어 아키텍처에서 실행할 수 있다. 여기서 가상 머신은 시스템 가상 머신이 아닌 프로세스 가상 머신을 의미한다.

 

일반적으로 가상 머신은 다음의 기능을 할 수 있어야 한다.

  • 물리적 CPU가 수행하는 작업을 에뮬레이션

  • 소스 언어를 바이트 코드로 컴파일

  • 명령어 및 피연산자를 포함하는 데이터 구조 (명령어가 처리하는 데이터)

  • 함수 호출 조작을위한 호출 스택

  • 실행할 다음 명령어를 가리키는 IP(=Instruction Pointer)

  • 가상 CPU-instruction dispatcher

    • 명령 포인터로 주소를 지정해서 다음에 수행할 명령어 가져오기(Fetch)

    • 피연산자를 디코딩

    • 명령을 실행

 

기본적으로 가상 머신을 구현하는 두 가지 방법이 있는데, 스택 기반 가상 머신과 레지스터 기반 가상 머신이다.

스택 기반 VM은 가상 머신을 구현하는 데 널리 사용되는 방법으로 JVM(Java Virtual Machine), .Net CLR 등이 있고, 레지스터 기반 VM은 Lua VM, Dalvik VM 등이 있다.

 

 

그렇다면 여기서 스택 기반 모델과 레지스터 기반 모델이 무엇이고, 왜 JVM은 스택 기반 모델을 사용하고 DVM은 레지스터 기반 모델을 사용하는지 알아보자.

스택 기반 모델과 레지스터 기반 모델은 계산에 사용 되는 기반이 스택인지 레지스터인지의 차이에 있다.

 

 

스택 기반 모델은 계산 할 때 스택을 사용한다. 다음 그림을 통해 스택을 사용해 계산을 하는 예시를 보자.

 

왼쪽 스택은 SP(Stack Pointer)가 20을 가리키고 있다. 여기서 20과 7의 ADD 연산을 하기 위한 명령어는 다음과 같다.

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

 

 

반면에 레지스터 기반 모델은 계산할 때 레지스터를 사용하고, 피연산자가 저장되는 데이터 구조는 CPU의 레지스터를 기반으로 한다. 마찬가지로 아래 그림으로 동작을 확인해보자.

 

여기서 5와 30의 ADD 연산을 하기 위한 명령어는 다음과 같다.

ADD R1, R2, R3        # R1과 R2의 값을 더해서 R3에 결과를 넣어라.

 

 

 

위의 예제를 통해 스택 기반 모델과 레지스터 기반 모델을 비교해 보면 다음과 같다. 각 모델의 장점은 다른 모델의 단점이 되기 때문에 각 모델의 단점은 굳이 적지 않았다.

 

스택 기반 모델 장점

  • 코드를 작성하는 것과 컴파일이 쉽고 가상 머신이 빠르기 때문에 널리 사용 되고 있다.

    • 대상 하드웨어(레지스터, CPU 기능 등)에 대해 직접적으로 다루지 않으므로 다양한 하드웨어에서 VM을 쉽게 구현할 수 있다.

  • 피연산자가 스택 포인터에 의해 암시적으로 처리된다.

    • 즉, 위 예제에서 연산에 필요한 20과 7의 메모리 주소를 스택 포인터가 알고 있기 때문에 20과 7이 어느 메모리에 존재하는지 신경쓸 필요 없이 스택 포인터로 가져오면 된다.

    • 레지스터 기반 모델은 피연산자 주소를 명시적으로 지정해야 하는 반면, 스택 기반 모델에서는 스택 포인터로 인해 피연산자의 메모리 주소를 포함하지 않아도 되기 때문에 하나의 명령어 코드가 더 작은 경향이 있다. 이는 네트워크가 느린데 링크를 통해 코드를 다운로드 하려는 경우 중요할 수 있다.

 

 

레지스터 기반 모델 장점

  • 실제 하드웨어와 비슷하기 때문에 Dalvik의 코드 생성기가 코드를 생성하기 쉽고 빠르다.

    • Dalvik 초기 버전에서는 런타임 중에 명령어를 직접 해석해야 하기 때문에 레지스터 기반 VM의 명령이 더 빠르게 실행되는 레지스터 기반 디자인이 더 효율적이다.

    • 스택 기반 VM은 동일한 피연산자를 여러 번 푸시하는 반면, 레지스터 기반 VM은 적절한 양의 레지스터를 할당하고 그에 대해 작업하므로 작업량과 CPU 시간을 크게 줄일 수 있다.

  • 스택을 사용하지 않아 스택으로 밀고 들어가는 오버 헤드가 존재하지 않는다.

  • 같은 연산을 할 때 스택 기반 모델을 사용할 때의 명령어 수보다 레지스터 기반 모델을 사용할 때 더 적은 명령어로 연산 수행이 가능하다.

  • 스택 기반 접근 방식으로는 수행 할 수없는 일부 최적화가 가능하다.

    • 코드에 공통 하위 표현식이있는 경우, 레지스터 모델이 이를 한 번 계산하여 하위 표현식이 다시 나타날 때 나중에 사용할 수 있도록 레지스터에 결과를 저장할 수 있기 때문에 표현식을 다시 계산하는 비용이 줄어든다.

 

참고로, 연구에 따르면 레지스터 기반 아키텍처는 스택 기반 아키텍처 보다 실행 명령어가 평균 47% 적고, 레지스터 코드는 스택 코드보다 25% 더 크다고 한다. 이로 인해 VM 명령어를 가져 오는 비용이 증가한다고 하지만, 코드의 크기는 VM 명령 당 1.07%의 추가 시스템로드만 포함하기 때문에 무시할 수 있는 정도이다. 또한 레지스터 기반 VM의 전반적인 성능은 표준 벤치 마크를 실행하는 데 평균 32.3% 단축 된 시간이 걸린다.

 

 

두 모델 중 어느 것이 더 좋다고 할 수 없기 때문에, 각 언어에 따른 가상 머신을 설계 목표에 맞게 선택한 것이라고 보면 될 것 같다.

 

 

 

 

 

[참고한 사이트]

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함