가상머신
가상머신(VM, Virtual Machine)이란 실재하는 컴퓨터상에 가상으로 컴퓨터를 구동시키는 것이다. 물리적인 하드웨어를 가상화하여, 하나의 하드웨어에서 여러 대의 컴퓨터가 구동되는 것처럼 에뮬레이션 하는 것이다.[1] 가상기계 또는 브이엠(VM)이라고도 한다.
목차
개요
가상머신은 소프트웨어를 이용하여 특정한 컴퓨터 시스템을 에뮬레이션한 것을 말한다. 에뮬레이션(emulation)이라는 소프트웨어 기술을 사용하여, 하나의 컴퓨터가 다른 기종의 컴퓨터와 동일한 방식으로 작동하는 것처럼 보이도록 만드는 것을 말한다. 가상머신 기술을 이용하면 하나의 물리적 하드웨어시스템 위에 다수의 가상 환경을 구성하여, 복수의 운영체제(OS)나 시스템을 운영할 수 있다. 대표적인 예로 자바 가상머신(Java Virtual Machine, JVM)이 있다.
특징
이전에는 중앙 처리 장치(CPU), 메모리 등의 한계로 가상 머신이 특별한 경우에만 사용되었지만, 시간이 갈수록 컴퓨터 사양이 높아져, 서버와 개인용 데스크톱에서 사용하는 경우도 많아졌다. 현재는 서버용 운영체제에 거의 필수적으로 가상화 기술이 포함되어 있다.[1] 가상머신에서 소프트웨어를 사용할 경우, 가상 머신 내부에서 작동하는 소프트웨어는 가상머신이 정해놓은 환경과 자원에 대한 제약을 받기 때문에 가상 세계를 벗어날 수 없다. 게스트 운영체제가 항상 포함되기 때문에 용량이 보통 수 GB에 해당하고, 애플리케이션을 실행할 때에도 먼저 가상 머신을 띄우고 자원을 할당한 다음, 게스트 운영체제를 부팅하여 애플리케이션을 실행시켜야 한다.
장점
가상 머신은 호환성이 높아 일반적인 컴퓨터처럼 작동하기 때문에, 기존 PC 또는 서버에서 하던 작업들을 그대로 할 수 있다. 그렇지만 가상 머신은 격리성을 띄고 있어 컴퓨터와는 엄연히 다르기 때문에, 하나의 가상 머신이 바이러스에 감염되더라도 다른 곳에는 피해가 가지 않는다. 한 번 구성된 가상머신은 캡슐화를 통해 복제되어 여러 컴퓨터 또는 하나의 컴퓨터에서도 여러 개로 복제하여 슬 수 있다. 이는 컴퓨터에 운영체제를 다시 설치할 필요를 줄여준다. 가상머신은 여러 종류의 하드웨어에서 사용하더라도 문제가 없기 때문에, 다양한 환경에서 사용된다. 일반적인 데스크톱 환경은 가상 머신의 격리성과 캡슐화의 큰 도움을 받을 수 있다. 새로운 프로그램이나, 금융 관련 프로그램을 설치하여 어떤 문제가 생길지 모를 경우, 가상머신을 사용하면 그런 위험에서 벗어날 수 있다. 서버환경에서는 앞에서 언급한 모든 장점을 사용할 수 있다. 기존 하드웨어에 구동되던 운영체제를 그대로 가상 머신으로 바꾸어 구동할 수 있고, 하나의 서버에 여러 가상 머신을 구동하여 하나의 하드웨어를 여러 서버로 구동시킬 수도 있다. 이러한 점들을 이용하여, 하드웨어에 영향을 받지 않고 서버를 쉽게 늘리거나 줄이고, 문제가 발생하였을 때 가상 머신을 손쉽게 복제하거나 수정하는 것으로 서버 환경을 관리할 수 있다는 장점을 갖고 있다. [1] 하나의 컴퓨터에서 여러 개의 가상 머신을 사용할 수 있기 때문에, 물리적 하드웨어 시스템에 대한 요구가 줄어 비용이 절감된다. 비슷한 맥락으로, 하드웨어를 보다 효율적으로 사용할 수 있고, 하드웨어 유지, 보수비용이 절감되고, 전력, 냉각의 수요가 감소한다. 가상화 하드웨어에는 장애가 발생하지 않기 때문에, 관리자는 가상 환경을 활용하여 백업, 재해복구(DR), 새로운 시스템 구축 및 기본 시스템 관리 작업을 간소화하여 수행할 수 있다.
단점
하나의 하드웨어의 중단으로 인해서 자원이 과도하게 사용되거나 여러 가상머신(VM)에서 운영이 중단되는 등 통합에 따른 위험이 존재한다. 가상 머신은 항상 실제 컴퓨터보다 느리고, 물리적 램이 작고, 그래픽 성능이 떨어지며, 저장 공간도 작다. USB나 플래시 드라이브를 추가하기 어렵고, 추가한다고 해도 여러 단계를 거쳐 짧지 않은 시간이 소요된다. 또한 항상 작동한다는 보장이 없다.[2]
시스템 가상머신
시스템 가상머신(system virtual machine)은 하드웨어 가상 머신이라고 하기도 하며, 각 운영체제를 실행하는 가상머신 사이의 기초가 되는 물리 컴퓨터를 다중화한다. 실제 기계의 대체재를 제공하고, 완전한 운영체계의 실행을 위해 요구되는 기능성의 수준을 제공한다. 시스템 가상 머신을 사용하면 여러 운영체제를 쓰는 환경이 여러 개의 운영체제가 각각의 가상머신 안에서 고립 된 채 같은 컴퓨터에서 존재할 수 있다. 가상 머신은 실제의 컴퓨터가 제공하는 것과 다른 형태의 명령어 집합 구조(ISA)를 제공한다. 다양한 운영체제를 제공하기 위해 멀티부팅의 어려움을 겪지 않아도 되고, 각각은 독립되어 있기 때문에 서로에게 영향을 미치지 않는다. 이는 관리가 용이하고, 외부의 위험으로부터 분리된 환경으로 다양한 테스트 환경에 적합하다는 것을 의미한다. 자신만의 운영체제를 실행하는 여러 개의 가상 머신들을 게스트 운영체제라고 하며, 다른 장치가 충돌을 피하기 위해 각 장치에서 실행하기 위한 서버 통합에 사용되고, 각 가상 머신은 같은 컴퓨터에서 사용된다. 이것을 제품 품질의 고립(QoS 고립)이라 한다. 다른 게스트 운영체제를 지원하기 위해 가상 머신을 사용하는 것은 임베디드 시스템에서 인기를 끌고 있다.[3]
하이퍼바이저
가상화를 제공하는 소프트웨어 계층은 가상머신 모니터 또는 하이퍼바이저라고 한다. 하드웨어를 가상화 하면서, 하드웨어와 각각의 가상 머신을 모니터링하는 중간 관리자 역할을 하기 때문에 가상화 머신 모니터(Virtual Machine Monitor, VMM)라고도 한다. 하이퍼바이저는 하드웨어를 공유하고 관리하기 위한 네이티브 실행을 이용하고, 독립된 다른 환경들을 같은 물리적인 기계에서 실행하기 위해서 허용한다. 현대의 하이퍼바이저들은 하드웨어의 도움을 받는 가상화를 이용하는데, 그것들은 주로 주 중앙처리장치(CPU)들의 특정 하드웨어 기능을 사용하여 효과적이고 완전한 가상화를 제공한다.[4] 하이퍼 바이저는 하드웨어 또는 호스트 운영 체제 위에서 실행할 수 있고 여러 가지 운영체제를 제공하기 위해서 멀티부팅의 어려움을 겪지 않아도 되고 각각은 서로 독립되어 있어서 서로 영향을 미치지 않는다. 게스트 운영체제란 가상 머신에 설치된 운영체제를 뜻하고, 실제 컴퓨터에 설치된 운영체제는 호스트 운영체제라고 한다.
분류
- 베어메탈(bare-metal): 네이티브(native) 가상화 라고도 한다. 하이퍼바이저가 하드웨어 바로 위에서 실행되는 방식으로, 하드웨어를 직접 제어하기 때문에 자원을 효율적으로 사용할 수 있다. 호스트 운영체제에 의존하지 않기 때문에, 입출력 디바이스와 직접 통신해야하고, 가상 머신 간에 입출력 디바이스가 공유되기 위해서는 하이퍼바이저 소프트웨어가 저레벨의 드라이버를 보유해야 한다. 또한 게스트 가상 머신을 위해 공유되는 디바이스를 반드시 에뮬레이션 할 수 있어야 한다. 베어메탈 가상화 아키텍처에서 가상 머신 간에 공유되는 시스템 입출력 디바이스는 반드시 하이퍼바이저의 커널 드라이브에 접근해야 한다. 베어메탈 하이퍼바이저가 입출력 디바이스에 접근할 수 있는 또 다른 방법은 파티셔닝으로, 개별 디바이스를 특정 가상 머신에 배정하는 방법이다. 입출력 성능과 엔지니어링에 대한 지원을 대폭 향상할 수 있고, 파티션된 입출력 디바이스는 네이티브 드라이버를 사용하여 가상 머신으로부터 직접 접근이 가능하기 때문에 하이퍼바이저에 의한 간섭이 적어진다. 호스트 운영체제에 의존하지 않기 때문에 오버헤드가 적어 인터럽트 지연을 막고 결정성 있는 성능을 가능하게 하는 기능을 구현할 수 있고, 동일한 하드웨어에서 리얼 타임 및 범용 운영체제를 구현할 수 있다는 장점이 있다. 다만 가상 머신간에 공유되는 디바이스용 드라이버뿐만 아니라, 다양한 하드웨어 플랫폼을 지원하기 위한 모든 드라이버가 하이퍼 바이저에 반드시 포함되어 있어야 하고, 호스트형 솔루션보다 설치나 구성이 어렵다는 단점이 있다.[5] Xen, 마이크로소프트 Hyper-Vm KVM등이 대표적이다. 하드웨어와 인터랙션하는 방식에 따라 전가상화(Full Virtualization), 반가상화(Para Virtualization) 이렇게 두 가지로 세분화 할 수 있다. 전가상화란 게스트 운영체제를 호스트 시스템과 완전히 분리하여 실행하고, 하드웨어 자원을 요청하기 위해, 반드시 하이퍼바이저가 중재해야 한다. 각 운영체제는 관리 머신을 거쳐 하이퍼바이저와 통신하기 때문에, 중앙 처리 장치와 램처럼 입출력이 잦은 자원은 컨트롤하기 어렵다고 번거롭다는 단점이 있다. 이러한 단점을 개선하기 위해서 출현한 것이 반가상화다. 반가상화는 게스트 운영체제의 일부를 수정하여 하드워어가 자원을 직접적으로 요구할 수 있도록 하는 것이다. 반가상화 방식을 하드웨어를 완전히 가상화하지 않고, 게스트 운영체제의 커널을 일부 수정하여 하드웨어와 인터랙션할 수 있도록 해야 한다. 운영체제를 수정해야 하기 때문에, 게스트 운영체제가 윈도우일 경우 별도의 Tool을 이용해야한다는 번거로움이 있다. 대표적인 반가상화방식 소프트웨어인 Xen에서 게스트 운영체제는 Hyper Call이라는 명령어를 통해 하드웨어에 필요한 자원을 바로 하이퍼바이저에 전달하고, 하이퍼바이저는 바로 하드웨어를 제어한다. 각각의 운영체제가 한꺼번에 처리하여 하드웨어를 제어하는 전가상화 방식에 비해 성능이 좋다.
- 호스트형(hosted): 호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 운영체제 위에서 실행된다. 하드웨어 자원을 VM 내부게스트의 게스트 운영체제에 에뮬레이트 하는 방식이기 때문에 베어 메탈 방식에 비해 오버헤드가 크지만, 게스트 운영종류에 대한 제약이 없고, 데스크톱뿐 아니라, 노트북에서도 운영할 수 있다. 기본 운영체제가 먼저 설치되고, 그 위에 하이퍼바이저 소프트웨어가 호스트 운영체제 위에 설치되면, 호스트 운영체제 위에서 다양한 게스트 운영체제를 실행할 수 있다. 대표적으로 VMware sercer, VMware Workstation, Virtual box, Paralls Desktop이 있다. 하이퍼바이저에 의해 구동되는 가상머신은 각 가상 머신 별로 독립된 가상의 자원을 할당받는다. 가상 머신은 논리적으로 분리되어 있어서 한 가상 머신에 오류가 발생해도, 다른 가상 머신으로 확산되지 않는다는 장점이 있다.[6] 또한 설치와 구성이 편리하고, 호스트 운영체제가 저레벨 하드웨어와 통신하기 위한 드라이버를 제공하기 때문에 사용자 정의 없이 광범위한 PC에서 실행가능하다. 호스트형 가상화는 일반적으로 제한된 입출력 디바이스 서브셋으로만 접근이 가능하다. 호스트 운영체제는 컴퓨터에 연결된 물리적인 입출력에 대한 소유권이 있고, 가상화 머신 모니터는 각 가상 머신에 실제 하드웨어의 에뮬레이션 된 보기를 제공한다. 가상화 머신 모니터는 PCI(Peripheral Component Interconnect ) 데이터 수집 카드와 같은 대부분의 비일반 입출력 디바이스에 대한 지식이 없기 때문에, 에뮬레이션된 디바이스를 가상 머신에 제공하지 않고, 네트워크 인터페이스와 씨디롬(Compact Disc Read Only Memory, CD-ROM)드라이브 같은 일반 디바이스만 에뮬레이션 된다. 호스트형 가상화 솔루션은 USB 포트를 위한 passthrough 기능도 제공한다. 이 기능을 통해 사용자들은 게스트 운영체제에서 USB 데이터 수집 디바이스에 접근하여 데이터를 수집하는 등 개별 가상 머신에서 USB 드라이브에 직접 접근할 수 있다. 여러 소프트웨어 컴포넌트가 함께 작동하여 호스트형 가상화 아키텍처에서 입출력이 가능하도록 한다. 이때 알아야 할 것은 궁극적으로 입출력 요청은 호스트형 가상화 아키텍처의 호스트 운영체제를 통해 전달된다는 것이다.[5]
가상화 기법
개별 가상 머신은 컴퓨터 하드웨어와 분리하기 위해 가상화 머신 모니터가 사용할 수 있는 여러 가지 내부 기술을 사용한다. 지금까지 본 가상화 아키텍처는 2진 전환, 하드웨어 보조, 파라버추얼라이제이션(Paravirtualization) 이 3가지 중 적어도 한 가지를 사용한다. 2진 전환을 사용하는 하이퍼바이저는 시스템 상태에 끼치는 영향을 피하기 위해 실행되는 코드를 동적을 변경한다. 버추얼머신의 컴파일된 코드에 특권 명령을 포함하게 되면 기본 하이퍼바이저는 2진 전환을 사용하여 입출력 요청을 적절하게 방향을 전환하고 개별 가상머신 간 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하여 입출력 방향을 전환하고 개별 가상머신 간의 충돌을 방지한다. 호스트형 가상화 소프트웨어는 일반적으로 2진 전환을 사용하는데 대표적인 예로 VMware Workstation 제품을 들 수 있다. 코드가 전환될 때마다 성능이 저하되므로, 2진 전환을 사용하는 가상화 소프트웨어는 그 때마다 지시 모음을 검사하고 전환한다. 2진 전환을 사용하는 소프트웨어는 가상화 머신 모니터가 버추얼 머신 실행과 반드시 인터페이스해야 하는 시간을 최소화하여 사용자가 경험하는 성능 영향을 최소화할 수 있다. 하드웨어 보조 방식은 실행되는 도안 가상 머신 코드를 변경하는 대신, 특권 명려에 대한 시스템 상태 변경을 피하기 위해 특수 프로세서 기술을 사용한다. 인텔(Intel)과 어드밴스트 마이크로 디바이시스(Advanced Micro Devices, AMD) 모두 필요할 때마다 가상화 머신 모니터를 자동 호출하기 위해 각 프로세서에 새로운 가상화 기능을 적용하고 있다. 많은 베어 메탈 하이퍼바이저가 이 기술을 활용한다. 2진 전환의 경우에서와 같이 성능은 하이퍼바이저가 버추얼 머신의 실행을 간섭해야 할 때마다 저하된다. 이 같은 효과를 최소화하기 위해 가상화를 위한 하드웨어 기능을 통합하는 프로세서는 절대적으로 필요할 때에만 가상 머신 실행을 간섭하도록 구성된다. 예를 들어, 특정 입출력 디바이스가 파티셔닝되면, 그 후에는 하이퍼바이저의 간섭없이 배정된 가상머신이 접근 가능할 것이다. 가상화를 수행하기 위한 마지막 기법은 파라버추얼라이제이션으로, 운영체제를 명시적으로 변경함으로써 가상화되고 있음을 인식하도록 하고, 가상화 머신 모니터가 필요할 때 자동 호출하도록 한다. 이와 같은 호출을 하이퍼콜이라고도 한다. 파라버추얼라이제이션이 가상화 머신 모니터가 반드시 호출되어야 하는 횟수를 최소화함으로써 성능을 대폭 향상할 수 있지만, 변경이 이루어지도록 하기 위해 운영코드의 소스 코드로의 접근을 확보하였다.[7]
프로세스 가상머신
프로세스 가상머신(process virtual machine)은 플랫폼에 독립적인 프로그램 실행 환경과 추상화를 제공하여 하나의 단일 프로그램(프로세스)을 실행하도록 설계되었다. 운영체제 안에서 일반 응용 프로그램을 구동하고 단일 프로세스를 지원한다. 프로세스가 시작하고, 끝내기되어 파괴될 때 만들어진다. 목적은 어떤 플랫폼에서나 동일한 방식으로 실행되는 프로그램을 허용하고, 자바와 같이 독립적인 환경에서 컴퓨터 프로그램을 실행하기 위해 고안하는 것이다. 특별한 경우, 가상 머신 프로세스는 잠재적으로 균일하지 못한 컴퓨터 클러스터의 통신 구조를 넘어 추출하는 시스템으로 사용된다. 이러한 가상 머신은 단일 프로세스로 이루어져 있지 않지만, 클러스터에서 물리 컴퓨터마다 하나의 프로세스를 이룬다. 이것들은 병렬 응용 프로그램들을 프로그래밍하는 작업을 쉽게 하기 위해서 만들어져있다. 이로써 프로그램이 운영체제와 상호작용이 제공하는 통신 구조보다 알고리즘에 집중할 수 있다. 이것들은 통신이 일어난다는 사실을 숨기지 않고, 단일 병렬 컴퓨터로 클러스터를 제공하지 않는다. 다른 가상머신들과는 달리, 이런 시스템들은 특정한 프로그래밍 언어를 제공하지는 않지만 기존의 언어에 통합되어 있어, 병렬 가상 머신(Parallel Virtual Machine, PVM)이나 메시지 전달 인터페이스(Message Passing Interface, MPI)와 같은 여러 가지 언어를 위한 꾸러미들을 제공해야 한다. 원래 개발 목적은 중간 언어를 위한 추상 플랫폼으로, 1966년 BCPL 컴파일러의 프론트엔드에서 발생한 목적 코드를 실행하기 위한 O-code머신을 예로 들 수 있다. 스몰토크-80, Deutsch/Schiffmann의 구현으로 상당한 진보를 이루었고, 프로세스 가상 머신을 사용하는 구현 접근으로서 JIT 컴파일을 가속화시켰다. 현대의 가상 머신은 컴파일을 위한 중ㅈ간 대상으로서나 인터프리터에서 직접 구현할 플랫폼으로서 사용되는데, 그 예로 2013년에 공개된 안드로이드 런타임(ART)은 바이트코드를 네이티브 코드로 컴파일하며, 초기의 달빅 가상 머신은 바이트코드를 해석한다.
활용
가상머신은 자바 등 다양한 프로그래밍 언어와 블록체인 기반의 암호화폐 플랫폼에서 활용되고 있다.
- 윈도우 가상머신(Windows Virtual Machine): 대부분의 하이퍼바이저는 윈도우 운영체제를 게스트로 실행하는 가상 머신을 제공한다. 마이크로소프트의 Hyper-V 하이퍼바이저는 윈도우 운영체제의 일부로서 제공된다. 설치할 때 자신과 기본 윈도우 운영체제를 모두 포함하는 상위 파티션을 작성하며, 이들 각각은 하드웨어에 대한 액세스 권한을 부여 받는다. 윈도우 게스트를 포함한 다른 운영 체제는 상위 파티션을 통해 하드웨어와 통신하는 하위 파티션에서 실행된다.
- 안드로이드 가상 머신(Android Virtual Mahine): 구글의 오픈소스 안드로이드는 모바일 디바이스에서 공통이며, 홈 엔터테인먼트 디바이스 등의 홈 디바이스에 연결된다. 안드로이드는 이러한 디바이스에 공통인 ARM(Advanced Risk MAchine) 프로세서 아키텍처에서만 실행되지만, 안드로이드 게이머나 소프트웨어 개발자 등이 이를 PC에서 실행하고자 할 수도 있다. 이 경우 전혀 다른 x86 프로세서 아키텍처에서 실행되는 PC와 하드웨어 가상화 하이퍼바이저가 가상 머신 및 중앙처리 장치 간의 명령어만 전달하기 때문에 문제가 생긴다. 다양한 명령어 집합을 보유한 프로세서에 대해서는 변환하는 기능을 제공하지 않기 때문에 이 문제를 해결하려면 다음과 같은 방법을 사용해야 한다. shashlik 또는 Genymotion 등의 일부 프로그램 소프트웨어에서는 ARM 아키텍처를 재작성하는 에뮬레이터를 사용한다. 또는 Anbox를 사용하여 리눅스 운영체제의 커널에서 안드로이드 운영 체제를 실행하는 방법도 있다.
- 자바 가상 머신: 자바 플랫폼은 자바 소프트웨어 개발 언어로 작성된 프로그램의 실행 환경이다. 자바는 한 번만 작성하고 어디서나 실행하는 기능을 제공하는데, 이는 자바 플랫폼을 실행하는 모든 하드웨어에서 모든 자바 프로그램이 실행될 수 있다는 의미다. 이 기능을 제공하기 위해 자바 플랫폼에는 자바 가상 머신이 포함되어 있다. 자바 프로그램에는 바이트 코드가 포함되며, 이는 자바 가상 머신용으로 작성된 명령어다. 자바 가상 머신은 이 바이트 코드를 호스트 컴퓨터에서 사용하는 최하위 레벨 언어인 머신 코드로 컴파일한다. 하나의 컴퓨팅 플랫폼의 자바 플랫폼에 있는 자바 가상 머신은 프로세서가 예상하는 머신 코드에 기반 하여 다른 머신 코드 명령어 세트를 기타의 자바 가상 머신에 작성한다. 따라서 자바 가상 머신은 전체 운영체제를 실행하지 않고, 다른 자바 가상 머신에서 사용하듯이 하이퍼바이저를 사용하지 않지만, 대신 이는 특정 하드웨어에서 실행할 애플리케이션 레벨 소프트웨어 프로그램을 변환한다.
- 우분투 가상 머신(Ubuntu Vitrual Machine): 우분투는 캐노니컬(Canonical)에서 제작한 리눅스 배포판으로, 데스크탑과 서버 버전에서 사용 가능하며, 가상 머신으로 설치할 수 있다. 우분투를 마이크로소프트 Hyper-V에서 게스트 운영체제로 배치할 수도 있다. 우분투는 Hyper-V의 상향된 세션 모드에서 잘 작동하는 우분투 데스크탑의 최적화된 버전을 제공하고, 윈도우 호스트와 우분투 가상 머신 간의 긴밀한 통합을 제공한다. 여기에는 클립 보드 통합, 동적 데스크탑 크기 조정, 공유 폴더 및 호스트와 게스트 데스크탑 간의 마우스 이동에 대한 지원이 포함된다.[8]
- 이더리움 가상머신(Ethereum Virtual Machine, EVM): 이더리움 가상 머신은 스마트 컨트랙트 배포 및 실행을 처리하는 이더리움의 일부다. 하나의 외부 소유 계정(External Owned Account)에서 다른 외부 소유 계정으로 간단한 값을 전송하는 트랜잭션은 이더리움 가상 머신이 필요 없지만, 그 외 모든 것은 이더리움 가상 머신에 의한 상태 업데이트를 수반한다. 크게 보면 이더리움 블록체인에서 실행되는 이더리움 가상 머신은 자체 영구 데이터 저장소가 있는 수백만 개의 실행 가능 객체를 가진 전 세계에서 탈중앙화된 컴퓨터다. 스마트 컨트랙트 실행에 사용할 수 있는 가스 양에 따라 모든 실행 프로세스가 유한 개의 계산 단계로 제한된다는 것을 의미한다. 이더리움 가상머신은 메모리 내의 모든 값을 스택에 저장하는 스택 기반 아키텍처로 256비트의 단어 크기로 동작하며, 주소 지정이 가능한 여러 개의 데이터 구성 요소를 가지고 있다. 실행할 스마트 컨트랙트의 바이트 코드가 저장되는 불변 프로그램 코드 롬, 모든 위치가 0으로 초기화하는 파괴성 메모리, 이더리움 상태의 일부인 영구 저장소가 이에 해당한다. 이더리움 가상 머신의 명령어 집합에는 산술 및 비트 논리 연산, 실행 컨트랙트세트 조회, 스택, 메모리, 스토리지 접근, 흐름제어 작업, 로깅, 호출, 기타연산자 등이 있다.[9]
프로그램
가상 머신 응용 소프트웨어
- 공통 언어 런타임(Common Language Runtime, CLR)
- 마이크로소프트 이니셔티브에서 제공하는 가상 머신의 구성요소로 프로그램 코드를 위한 실행 환경을 정의하는 마이크로소프트의 공통 언어 기반(CLI) 표준의 기능이다. C#이나 VB 닷넷과 같은 언어로 프로그래밍 하며, 해당 언어의 컴파일러가 소스 코드를 공통 중간 언어(IL) 코드로 변환한다. CLR은 관리되는 코드를 실행하기 위한 런타임으로, 관리되는 언어로 작성한 소스코드를 컴파일하면 관리되는 코드가 생성된다. 관리되는 코드를 실행 파일 또는 라이브러리(.dll) 형태로 만들고 그것을 형식 정보, 즉 메타자료와 함께 하나의 패키지로 묶은 것을 어셈블리라고 한다. 어셈블리를 적재할 때 CLR은 IL 코드를 해당 컴퓨터 고유의 기계어 코드로 변환한다. 이러한 변환을 담당하는 것이 CLR의 JIT(Just – in – time)컴파일러이다. 어셈블리는 원래의 원본 언어의 구성을 거의 그대로 유지하기 때문에, 코드를 조사하기 쉽고 심지어 동적으로 생성하기도 쉽다.[10]
- 병렬 가상 머신(Parallel Virtual Machine)
- 1989년 오크리지 국립연구소의 알 가이스트(Al Geist)에 의해 처음 생성되었고, 이 작업을 바탕으로 이 프로젝트는 꾸준히 확장되고, 성장해왔다. 병렬 가상 머신 시스템에는 개별 머신에 있는 애플리케이션과 인터페이스 루틴 라이브러리 두 부분이 있다. 소프트웨어 응용 프로그램을 병렬 가상 시스템 데몬, pmvd3 또는 pmvd라고 한다. 이 작은 프로그램은 병렬 가상 머신 애플리케이션을 실행해야할 때까지 수동적으로 배치된다. 사용가가 이 유형의 프로그램을 실행하려면, 먼저 병렬 가상 머신을 시작해야 한다. 이를 통해 다른 호스트의 소프트웨어에 액세스 할 수 있다. 병렬 가상 머신 루틴 라이브러리에는 별도의 호스트에서 실행되는 다양한 작업을 조정하는 데 필요한 모든 코드의 전체 목록이 있다. 이 라이브러리에는 메시지 전달, 작업 조정 및 가상 머신 자체의 변경에 대한 표준 루틴이 포함되어 있다. 병렬 가상 머신의 핵심 개념은 모든 애플리케이션에 독립적으로 실행할 수 있는 여러 태스크가 있다는 것이다. 병렬 가상 머신에서는 기능적 병렬 처리와 데이터 병렬 처리 두 가지 방식으로 병렬 처리를 할 수 있다. 기능적 병렬 처리는 애플리케이션을 명확하게 정의된 독립적인 작업으로 분리하는 것으로, 별도의 호스트 시스템에서 수행한다. 병렬 가상 머신은 입력, 솔루션, 출력 및 디스플레이와 같은 기능을 기반으로 조정하는데 사용된다. 이 방식 보다는 데이터 병렬 처리 또는 단일 프로그램 다중 데이터(SMPD)가 더 널리 사용되곤 한다. 이 방법에서는 모든 작업이 동일하지만, 각 호스트는 더 큰 퍼즐의 작은 조각을 해결한다는 차이점이 있다. 병렬 가상 머신 환경은 두 가지 방법을 모두 지원하므로, 필요에 따라 두 가지 방법을 혼합해서 사용하는 것이 가장 효과적이다. C, C++ 및 Fortan 등의 프로그래밍 언어가 사용된다.[11]
하드웨어 가상 머신
- 마이크로소프트 버추얼 머신(Microsoft Virtual Machine
- VMware
- 버추얼박스(Virtualbox)
비교
컨테이너
컨테이너화를 이끄는 두 가지 주도적인 힘은 컨테이너 가동에 널리 사용되는 툴인 도커, 그리고 여러 컨테이너를 관리하는 데 도움이 되는 구글 쿠버네티스다. 컨테이너는 호스트 OS의 커널을 공유하는 독립적인 코드 실행 환경이다. 컨테이너는 중복 게스트 OS 및 관련 시작 오버헤드를 건너뛰므로 가상머신에 비해 더 능률적이고 가볍다. 개발자는 동일한 하드웨어에서 가상머신에 비해 6~8배 더 많은 컨테이너를 실행할 수 있다. 컨테이너에도 단점은 있다. 비교적 새로운 접근 방법이므로 성숙한 기술에서 흔히 볼 수 있는 풍부한 관리 툴이 없고 따라서 설정과 유지보수 작업이 많이 필요하다. 또한 보안에 대한 우려도 있다. 가상머신에서는 게스트 이미지를 사용해서 호스트에서 호스트로 손쉽게 워크로드를 옮길 수 있지만 베어 메탈은 업그레이드와 이동이 더 어렵다. 베어 메탈 서버에서는 머신 상태 롤백이 쉽지 않은 일이다.
서버리스 컴퓨팅
전통적인 IaaS 클라우드 환경에서 고객은 먼저 가상머신, 스토리지, 데이터베이스, 관련 보안 및 관리 툴을 프로비저닝한 다음 가상머신에 애플리케이션을 로드한다. 서버리스 컴퓨팅에서는 개발자가 코드를 쓰고 클라우드 서비스 제공업체가 나머지 모든 부분을 처리한다. 개발자는 서버, 운영체제, 프로비저닝 또는 관리에 대해 생각할 필요가 없다. 물론 코드를 실행하는 실제 서버가 있지만 이는 클라우드 서비스 제공업체의 책임이다. 모놀리식 애플리케이션 대신 코드는 구체적인 함수로 세분화된다. 그 함수를 트리거하는 이벤트가 발생하면 서버리스 서비스(아마존 람다(Lambda) 등)가 함수를 실행한다. 서버리스 제공업체는 함수별로 고객에게 비용을 청구한다. 마이크로서비스/컨테이너 시나리오와 마찬가지로, 서버리스 컴퓨팅은 가상머신 계층을 건너뛰며 함수는 베어 메탈에서 실행된다. 현재 시점에서 서버리스 컴퓨팅은 비교적 미성숙한 기술이며 사용 사례도 제한적이다.[12]
각주
- ↑ 1.0 1.1 1.2 Namu(南無), 〈가상 머신이란 무엇인가, 그 장점이 무엇이길래?〉, 《시사공작소》, 2013-01-18
- ↑ Licoln Spector. 〈단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실〉, 《아이티월드》, 2013-10-11
- ↑ 흉내쟁이. 〈가상머신(Virtual Machine)의 이해〉, 《티스토리》
- ↑ 〈가상 머신〉, 《위키백과》
- ↑ 5.0 5.1 덕쑤, 〈가상화(Virtualization)의 내부기술〉, 《티스토리》, 2013-01-18
- ↑ 〈서버 가상화 기술의 진화:VM과 컨테이너〉, 《가비아 라이브러리》
- ↑ shineLight〈가상화(Virtualization)〉, 《블로거》, 2016-08-31
- ↑ 〈가상 머신(VM)〉, 《IBM》
- ↑ HAS3ONG, 〈(Ethereum) EVM, 이더리움 가상 머신 –1-〉, 《티스토리》, 2019-06-22
- ↑ HJH0825, 〈C#) CLR(Common Language Runtime)이란?〉, 《티스토리》, 2020-02-04
- ↑ 〈병렬 가상 머신이란 무엇입니까?〉, 《Netinbag》
- ↑ Neal Weinberg , 〈서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단〉, 《아이티월드》, 2018-07-13
참고자료
- Namu(南無), 〈가상 머신이란 무엇인가, 그 장점이 무엇이길래?〉, 《시사공작소》, 2013-01-18
- Licoln Spector. 〈단점을 중심으로 본 ‘가상 컴퓨터’에 대한 오해와 진실〉, 《아이티월드》, 2013-10-11
- 흉내쟁이. 〈가상머신(Virtual Machine)의 이해〉, 《티스토리》
- 〈가상 머신〉, 《위키백과》
- 덕쑤, 〈가상화(Virtualization)의 내부기술〉, 《티스토리》, 2013-01-18
- 〈서버 가상화 기술의 진화:VM과 컨테이너〉, 《가비아 라이브러리》
- shineLight〈가상화(Virtualization)〉, 《블로거》, 2016-08-31
- 〈가상 머신(VM)〉, 《IBM》
- HAS3ONG, 〈(Ethereum) EVM, 이더리움 가상 머신 –1-〉, 《티스토리》, 2019-06-22
- HJH0825, 〈C#) CLR(Common Language Runtime)이란?〉, 《티스토리》, 2020-02-04
- 〈병렬 가상 머신이란 무엇입니까?〉, 《Netinbag》
- Neal Weinberg , 〈서버 가상화의 미래 : 컨테이너 및 서버리스 비교 진단〉, 《아이티월드》, 2018-07-13
같이 보기