갑자기 궁금한데, VMWare 같은것들, 어떻게 이렇게 빠른거죠?

freezm7의 이미지

예전에는 단순히 하드웨어를 에뮬레이션 하는것이라고 생각했는데,

그건 매우 기초적인 가상화이고, 그렇게 할 경우는 실제 하드웨어 속도의 1/100 정도로 돌아간다고 하더군요.. (그럴듯해요)

근데 VMWare 같은거 써보면 생각보다 꽤 빠르거든요.

간략하게 이런 이런 기술을 써서 빠르다 요약해 주실분 계신가요?

엄청 전문적인 이야기 나오면 못 알아들을테고...

지리즈의 이미지

가상머신 내부에서 돌아가는 프로그램을 실제 가상머신의 CPU에서 에뮬레이트하는 것이 아니라,
프로그램의 바이너리코드 내용을 메모리로 올릴때 조작을 가해서 실제 호스트의 CPU에서 실행하기 때문입니다.

사용자도 그렇지만 프로그램도 속이는 거죠. 가상 머신에서 돌아가고 있는 것처럼요.

그렇기 때문에 이러한 기술은 호스트와 게스트가 같은 바이너리 코드(기계어)를 사용하는 시스템에서만 사용 가능합니다.

이런 비슷한 기술이 가상머신 이전부터 많이 쓰여왔는데요, 대표적인 것이 바로 디버킹 툴입니다.

또 다른 기술은 게스트내부의 프로그램을 실행할 때 게스트의 바이너리 코드를 실제 호스트 시스템에서 사용하는 바이너리 코드로 번역을 해서
실제 호스트 시스템의 CPU에서 실행시키는 것입니다.

이 방식은 가상머신(게스트)의 CPU와 실제 CPU(호스트)가 다른 경우에도 사용할 수 있습니다.

이 기술은 원래 Java나 .net같은 시스템에서 사용하는 방식이지만, 가상 머신 시스템에도 확장해서 사용되는 추세입니다.

There is no spoon. Neo from the Matrix 1999.

There is no spoon. Neo from the Matrix 1999.

JuEUS-U의 이미지

요즘 VM들은 AMD-v나 Intel VT-x같은 CPU 단계에서 지원해주는 기능을 사용해서 native에 가까운 속도를 보여줍니다.

이런 하드웨어 기반 가상화 기술이 보편화 되기 전에는 전부 소프트웨어로 처리했습니다.
이 때 사용된 최적화 기술로 Binary translation이 있는데, 이게 지리즈님이 말씀하신 guest에서 host로의 코드 변환입니다.
이 분류의 기술 중 좀 많이 발전한게 Dynamic recompilation인데, VirtualBox의 모태가 된 Qemu에 적용되어있습니다.