찾아보다가 개념이 정리된 거 같아서 직접 끄적여 봤습니다ㅠ__ㅠ*
일단 들어가기 전에 먼저, 우리가 잘못 생각한게 하나 있습니다.
먼저, Full Virtualization을 수행할 때 방식이, VCPU를 생성하고 Mgtm의 Control Domain 0과 Guest OS가 통신하면서 하이퍼바이저를 거쳐 INTEL VT-x나 AMD-V같은 하드웨어에서 실제 명령을 처리하는 식입니다, 정확히 말하면 Binary Translation같은 기능들을 INTEL VT-x나 AMD-V에서 제공해준다고 보면 됩니다.
그래서 Hardware Emulation(ISA Emulation이라 보면 될라나요 :d)와 달리 Full Virtualization은 INTEL VT-x나 AMD-V가 없이는 동작할 수 없습니다. Control Domain을 만들수 없기 때문이죠 :D,
그래서 열심히 토론했었던 INTEL VT-x과 AMD-V가 없는 환경에서의 Hardware Emulation과 Full Virtualization의 속도 차이...는 아예 일어날수가 없는 상황이었습니다 -____-!
** 물론, INTEL VTx나 AMD-V가 없는 환경에서 Full Virtualization을 수행하는 방법이 없는 것은 아닙니다, 단지, Binary translation등을 직접 구현해야 하는데 차라리 Para를 하겠어요.ㅋㅋㅋ
** 물론, INTEL VTx나 AMD-V 이전의 환경에서는 Software적으로 Binary Translation을 수행함으로써 Full Virtualization을 사용했을 것입니다. 그런데 소프트웨어적으로 Binary Translation을 구현하면 속도가 좀 많이 느립니다. 그래서 차라리 Paravirtualization을 수행하는게 속도 면으론 더 좋았지요. 그러다 INTEL VTx나 AMD-V에서 Hardware적으로 Binary Translation을 지원해 주면서 속도가 향상되어서 Paravirtualization의 이점이었던 속도 문제가 이젠 이점으로 작용하지 않고 있습니다.
Hardware Emulation(좀 더 정확히 말하면 ISA Emulation)은 게임 에뮬레이트를 하는 방식과 유사합니다.
즉, if(!strcmp(instruction[0], "MOV"))
// TODO: Write here routine of Virtualized MOV
뭐 이런 식인데요, 그렇기 때문에 엄청 느립니다.... 대신 하드웨어 의존적이지 않기 때문에, 모든 기종을 가상으로 생성해 내면 모든 기종을 에뮬레이트 할 수 있습니다. 예를 들어, Bochs같은 경우 x86 머신을 아예 가상으로 만들어 버리죠.
그에 반해 Full virtualization은, VCPU를 생성하고, Mgtm단의 Control Domain (DOM 0)과 Guest OS가 통신하고, 그것이 하이퍼바이저를 거쳐서 실제 하드웨어에 도달하고 이 하드웨어는 INTEL VT-x와 AMD-V를 지원합니다. INTEL VT-x와 AMD-V에서 Binary Translation같은 기능들을 지원해 주기 때문에 하드웨어 의존적으로 실제 처리되어야 할 ISA 등은 하드웨어단에서 처리됩니다. 따라서 하드웨어 의존적인 에뮬레이팅을 하게 되고, CPU단에서 ISA가 처리되기 떄문에 엄청 빨라지는거죠 :D
물론 단점은 있습니다. 그 CPU단에서 처리되기 때문에 CPU의 종류에 따라, 즉 에뮬레이트 할 수 있는 기종이 한정되어 있다는 점입니다. 어제 알아봤던 대로 "동일 기종"만 돌릴수 있다는 것이 그 이유 때문입니다.
이왕 말 나온 김에 Paravirtualization까지 한번 달려보죠!
Para-Virtualization은 근본적으로 Full Virtualization과 구성이 다르고, 그 다른 구성에 의해 속도차이가 납니다. Full Virtualization이 Mgtm의 Control Domain (DOM 0)과 Guest OS 상호간의 통신을 한다면, Para-Virtualization은 Bare H/W가 직접 Hypervisor과 통신을 합니다. 그리고 그 Hypervisor가 OS와 상호간 통신을 하죠. 여기서 OS가 직접 하이퍼바이저를 이용할 때 사용하는게 바로 Hyper Call입니다. Hyper Call은 일종의 시스템 콜과 비슷한 개념이라 생각하시면 됩니다(대상이 커널이 아니라 하이퍼바이저로 이동했다고 생각하시면 편합니다).
그런데 여기서 성능의 문제가 발생합니다. 모든 리소스를 하이퍼바이저가 처리하고 이런 식으로 통신하다 보면 하이퍼바이저의 덩치가 커지고 그럼 오히려 역으로 성능이 저하될 수 있습니다. 따라서 사용이 빈번한 자원들(CPU나 램)만 하이퍼바이저가 컨트롤 하는데, 이것 때문에 Guest OS의 수정이 필요합니다. 자원을 구분해서 CPU나 램 같은 것들은 하이퍼바이저로 들어가도록이요.
나머지 불필요한 자원들은 전가상화와 똑같이 Mgmt의 DOM0을 통해서 통신하게 됩니다 :D
** 추가 **
한글이 문맥이 조금 이상해서 혼동되는 부분이 있는데
Paravirtualization에서요 하이퍼바이저에게 빈번히 사용되는 CPU나 램 따위의 리소스를 넘겨주려면 Guest OS의 소스를 수정해야 하니까 Para와 Full을 구분하는 방법은 Guest OS의 수정 유무입니다 :)
혹시 궁금하신 점 있으시면 언제든지 물어봐 주세요! ㅠ__ㅠ
전 그럼 Control Domain의 역할에 대해 공부하고 여기 다시 글을 쓰도록 하겠습니다..^^
수고하세요! ^^
댓글 10
-
동선
2011.04.03 11:00
-
구사무엘
2011.04.03 13:00
위에 쓰신 말이 맞는건가요? 음.. 좀 이상한게 있어서요.
그래서 Hardware Emulation(ISA Emulation이라 보면 될라나요 :d)와 달리 Full Virtualization은 INTEL VT-x나 AMD-V가 없이는 동작할 수 없습니다. Control Domain을 만들수 없기 때문이죠 라는 가정이 참이라면,
INTEL VT-x 와 AMD-V 이전에는 Full virtualization 은 존재하지 않았다 도 참이라고 말할 수 있을꺼 같은데,
그런 가정하에서는 듀얼 코어 이전엔 VMWARE 역시 80X86 에뮬레이터 였다는 말이 되는거 같은데,
좀 이상한거 같습니다.
제가 생각하고 있던 Full Virtualization 솔루션들은 다음과 같은 포인트 들이 Boches 나 Qemu 같은 에뮬레이터들 보다 + 되있는 거 같던데요
Full virtualization = Hardware Emulation + Device passthru + Binary translation
제가 틀리게 이해하고 있는지도 모릅니다 TAT...
다른 분들의 의견, 또는 올바르게 알고 있는 분이 답 좀 알려주세요!
-
백창우
2011.04.03 15:05
간단히 설명하면 다음과 같습니다.
boches, qemu와 같은 emulator type은 개개의 instruction에 대해서 S/W로써 emulation 해주는데 반해,
초기 vmware가 사용한 binary translation 기법은 non-sensitive instruction에 대해서는 바로 수행시키고,
sensitive instruction과 VMM 구현에 필요한 instruction들은 변환해서 수행시킨다는 것이 다른점입니다.
-
구사무엘
2011.04.03 13:17
아하, 그렇군요
guest 의 수정 유무에 따라서 Full / Para 만 나뉜다는 말씀이시죠?
혹시 몹시 궁금하여서 질문을 드리는데,
Boches 나 Qemu 와 초기의 VMWare 의 차이점은 무엇인지 말씀해주실 수 있나요?
어제 스터디 그룹에서도 애기가 많이 나왔었는데, 정확한 답이 무엇인지 궁금합니다.
-
황선욱
2011.04.03 13:21
처음에 그렇게 생각하다가, 제가 HW(CPU Instruction Level)에서의 지원 유무가 아닌가? 라는 말로 혼란을 만든 하는 바람에...ㅜㅜ;
면목이 없습니다. 정리 감사합니다.
-
동선
2011.04.03 13:32
Full Virtualization과 ParaVirtualization은 동작 방식이 다릅니다, 그렇기 떄문에 백창우 님께서 간단하게 나누는 방법으로 Guest OS의 소스를 수정한다 라는 기준을 정해주셨는데요, 이 내용이 제 글에 적혀져 있습니다 :D
Hyper-call을 이용해 OS와 하이퍼바이저가 직접적으로 통신하고, 하이퍼바이저와 Bare HW가 직접적으로 통신함에 있어서 일부 사용이 빈번한 리소스를 바로 하이퍼바이저로 넘겨야 되기 때문에 Guest OS의 수정이 필요한 것입니다.
제가 언급했던 구현 방식이 바로 이 말이었습니다 'ㅁ'ㅋㅋ
-
백창우
2011.04.03 13:09
Full virtualization은 guest 소스 수정 유무를 판단해서 나눌뿐입니다. 구현 방식과는 관계가 없죠.
-
동선
2011.04.03 13:33
Full virtualization이 INTEL VT-x나 AMD-V 이전엔 없었다 는게 제 의도가 아니었구요.ㅠㅠㅠ
말씀하신대로 Binary Translation이 INTEL VT-x 이전엔 Software적으로 구현되어 있다가 Hardware적으로 옮겨진게 맞아요,
CPU단에서 처리해주기 때문에 더욱 빨라진거죠 :D 그래서 속도가 향상된 거구요!
제가 적어둔 글이 문장이 좀 이상해서 의미가 혼란스러워 지네요 수정하겠습니다!
-
구사무엘
2011.04.03 13:29
'ㅅ'; 제가 글을 단건 그 윗부분에 Full virtualization이 INTEL VT-x 이전엔 없었다 라고 되있는 부분이 틀린거 같아서 단거니
오해하지는 말아주세요 ㅠㅠ,
-
동선
2011.04.03 13:23
** 물론, INTEL VTx나 AMD-V가 없는 환경에서 Full Virtualization을 수행하는 방법이 없는 것은 아닙니다, 단지, Binary translation등을 직접 구현해야 하는데 차라리 Para를 하겠어요.ㅋㅋㅋ
라고 적어 뒀었는데 못 보셨나 보네요 'ㅁ'...
.
ㅠㅠ, Control domain에 대해 자세히 나와있는 논문을 찾아보기 힘드네욥