Máy ảo

Bách khoa toàn thư mở Wikipedia
Bước tới điều hướng Bước tới tìm kiếm

Trong khoa học máy tính, một máy ảo (VM) là một trình giả lập một hệ thống máy tính. Máy ảo dựa trên kiến trúc máy tính và cung cấp chức năng của máy tính vật lý. Việc triển khai của chúng có thể liên quan đến phần cứng, phần mềm chuyên dụng hoặc kết hợp.

Có nhiều loại máy ảo khác nhau, mỗi loại có chức năng khác nhau:

  • Máy ảo hệ thống (còn được gọi là máy ảo ảo hoá hoàn thoàn) cung cấp một sự thay thế cho một máy thật. Chúng cung cấp chức năng cần thiết để thực thi toàn bộ hệ điều hành. Một trình ảo hóa sử dụng thực thi riêng để chia sẻ và quản lý phần cứng, cho phép nhiều môi trường được cách ly với nhau, nhưng vẫn tồn tại trên cùng một máy vật lý. Các siêu giám sát hiện đại sử dụng ảo hóa hỗ trợ phần cứng, phần cứng dành riêng cho ảo hóa, chủ yếu từ các CPU chủ
  • Máy ảo tiến trình được thiết kế để thực thi các chương trình máy tính trong môi trường độc lập với nền tảng.

Một số máy ảo như QEMU, được thiết kế để mô phỏng các kiến trúc khác nhau và cho phép thực thi các ứng dụng phần mềm và hệ điều hành được viết cho CPU hoặc kiến trúc khác. Ảo hoá cấp hệ điều hành cho phép các tài nguyên của máy tính được phân vùng thông qua kernel. Các nhóm không thể thay thế cho nhau.

Các định nghĩa[sửa | sửa mã nguồn]

Máy ảo hệ thống[sửa | sửa mã nguồn]

Một "máy ảo" được định nghĩa ban đầu bởi Popek và Goldberg như là "một bản sao hiệu quả, tách biệt của một máy tính thực sự."[1] Việc sử dụng hiện tại bao gồm các máy ảo không có sự tương ứng trực tiếp với bất kỳ phần cứng thực nào.[2] TPhần cứng vật lý, "thế giới thực" chạy VM thường được gọi là 'máy chủ' (host) và máy ảo được mô phỏng trên máy đó thường được gọi là 'khách' (guest). Một host có thể mô phỏng một số khách, mỗi khách có thể mô phỏng các hệ điều hành và nền tảng phần cứng khác nhau.

Mong muốn chạy nhiều hệ điều hành là động lực ban đầu cho các máy ảo, để cho phép chia sẻ thời gian giữa một số hệ điều hành tác vụ đơn. Trong một số khía cạnh, một máy ảo hệ thống có thể được coi là một khái quát của khái niệm bộ nhớ ảo có trước đây trong lịch sử. CP/CMS của IBM, các hệ thống đầu tiên cho phép ảo hóa hoàn toàn, đã thực hiện chia sẻ thời gian bằng cách cung cấp cho mỗi người dùng một hệ điều hành một người dùng, Conversational Monitor System (CMS). Không giống như bộ nhớ ảo, một máy ảo hệ thống cho phép người dùng viết các hướng dẫn đặc quyền trong mã của chúng. Cách tiếp cận này có những lợi thế nhất định, chẳng hạn như thêm các thiết bị vào/ra không được hệ thống tiêu chuẩn cho phép.[2]

Khi công nghệ phát triển bộ nhớ ảo cho mục đích ảo hóa, ác hệ thống dư thừa bộ nhớ mới có thể được áp dụng để quản lý chia sẻ bộ nhớ giữa nhiều máy ảo trên một hệ điều hành máy tính. Có thể chia sẻ các trang nhớ có nội dung giống hệt nhau giữa nhiều máy ảo chạy trên cùng một máy vật lý, điều này có thể dẫn đến việc ánh xạ chúng đến cùng một trang vật lý bằng một kỹ thuật gọi là kernel same-page merging (KSM). Điều này đặc biệt hữu ích cho các trang chỉ đọc, chẳng hạn như các trang đang giữ phân đoạn mã, đó là trường hợp cho nhiều máy ảo chạy cùng một phần mềm hoặc thư viện phần mềm, máy chủ web, thành phần phần mềm trung gian, v.v. tuân thủ phần cứng máy chủ, do đó có thể chạy các hệ điều hành khác nhau trên cùng một máy tính (ví dụ: Windows, Linux hoặc các phiên bản trước của hệ điều hành) để hỗ trợ phần mềm trong tương lai.[3]

Việc sử dụng các máy ảo để hỗ trợ các hệ điều hành khách riêng biệt là phổ biến đối với các hệ thống nhúng. Một cách sử dụng thông thường sẽ là chạy một hệ điều hành thời gian thực đồng thời với một hệ điều hành phức tạp ưa thích, chẳng hạn như Linux hay Windows. Một ứng dụng khác sẽ dành cho phần mềm mới và chưa được chứng minh vẫn đang trong giai đoạn phát triển, vì vậy nó chạy trong một sandbox. Máy ảo có những lợi thế khác để phát triển hệ điều hành và có thể bao gồm cải thiện truy cập gỡ lỗi và khởi động lại nhanh hơn.[4]

Nhiều máy ảo chạy hệ điều hành khách của riêng chúng thường được sử dụng để hợp nhất máy chủ.[5]

Máy ảo tiến trình[sửa | sửa mã nguồn]

A process VM, sometimes called an application virtual machine, or Managed Runtime Environment (MRE), runs as a normal application inside a host OS and supports a single process. It is created when that process is started and destroyed when it exits. Its purpose is to provide a platform-independent programming environment that abstracts away details of the underlying hardware or operating system and allows a program to execute in the same way on any platform.

A process VM provides a high-level abstraction – that of a high-level programming language (compared to the low-level ISA abstraction of the system VM). Process VMs are implemented using an interpreter; performance comparable to compiled programming languages can be achieved by the use of just-in-time compilation.[cần dẫn nguồn]

This type of VM has become popular with the Java programming language, which is implemented using the Java virtual machine. Other examples include the Parrot virtual machine and the .NET Framework, which runs on a VM called the Common Language Runtime. All of them can serve as an abstraction layer for any computer language.

A special case of process VMs are systems that abstract over the communication mechanisms of a (potentially heterogeneous) computer cluster. Such a VM does not consist of a single process, but one process per physical machine in the cluster. They are designed to ease the task of programming concurrent applications by letting the programmer focus on algorithms rather than the communication mechanisms provided by the interconnect and the OS. They do not hide the fact that communication takes place, and as such do not attempt to present the cluster as a single machine.[cần dẫn nguồn]

Unlike other process VMs, these systems do not provide a specific programming language, but are embedded in an existing language; typically such a system provides bindings for several languages (e.g., C and Fortran).[cần dẫn nguồn] Examples are Parallel Virtual Machine (PVM) and Message Passing Interface (MPI). They are not strictly virtual machines because the applications running on top still have access to all OS services and are therefore not confined to the system model.

Lịch sử[sửa | sửa mã nguồn]

Both system virtual machines and process virtual machines date to the 1960s and continue to be areas of active development.

System virtual machines grew out of time-sharing, as notably implemented in the Compatible Time-Sharing System (CTSS). Time-sharing allowed multiple users to use a computer concurrently: each program appeared to have full access to the machine, but only one program was executed at the time, with the system switching between programs in time slices, saving and restoring state each time. This evolved into virtual machines, notably via IBM's research systems: the M44/44X, which used partial virtualization, and the CP-40 and SIMMON, which used full virtualization, and were early examples of hypervisors. The first widely available virtual machine architecture was the CP-67/CMS (see History of CP/CMS for details). An important distinction was between using multiple virtual machines on one host system for time-sharing, as in M44/44X and CP-40, and using one virtual machine on a host system for prototyping, as in SIMMON. Emulators, with hardware emulation of earlier systems for compatibility, date back to the IBM System/360 in 1963,[6][7] while the software emulation (then-called "simulation") predates it.

Process virtual machines arose originally as abstract platforms for an intermediate language used as the intermediate representation of a program by a compiler; early examples date to around 1966. An early 1966 example was the O-code machine, a virtual machine that executes O-code (object code) emitted by the front end of the BCPL compiler. This abstraction allowed the compiler to be easily ported to a new architecture by implementing a new back end that took the existing O-code and compiled it to machine code for the underlying physical machine. The Euler language used a similar design, with the intermediate language named P (portable).[8] This was popularized around 1970 by Pascal, notably in the Pascal-P system (1973) and Pascal-S compiler (1975), in which it was termed p-code and the resulting machine as a p-code machine. This has been influential, and virtual machines in this sense have been often generally called p-code machines. In addition to being an intermediate language, Pascal p-code was also executed directly by an interpreter implementing the virtual machine, notably in UCSD Pascal (1978); this influenced later interpreters, notably the Java virtual machine (JVM). Another early example was SNOBOL4 (1967), which was written in the SNOBOL Implementation Language (SIL), an assembly language for a virtual machine, which was then targeted to physical machines by transpiling to their native assembler via a macro assembler.[9] Macros have since fallen out of favor, however, so this approach has been less influential. Process virtual machines were a popular approach to implementing early microcomputer software, including Tiny BASIC and adventure games, from one-off implementations such as Pyramid 2000 to a general-purpose engine like Infocom's z-machine, which Graham Nelson argues is "possibly the most portable virtual machine ever created".[10]

Significant advances occurred in the implementation of Smalltalk-80,[11] particularly the Deutsch/Schiffmann implementation[12] which pushed just-in-time (JIT) compilation forward as an implementation approach that uses process virtual machine.[13] Later notable Smalltalk VMs were VisualWorks, the Squeak Virtual Machine,[14] and Strongtalk.[15] A related language that produced a lot of virtual machine innovation was the Self programming language,[16] which pioneered adaptive optimization[17] and generational garbage collection. These techniques proved commercially successful in 1999 in the HotSpot Java virtual machine.[18] Other innovations include having a register-based virtual machine, to better match the underlying hardware, rather than a stack-based virtual machine, which is a closer match for the programming language; in 1995, this was pioneered by the Dis virtual machine for the Limbo language. OpenJ9 is an alternative for HotSpot JVM in OpenJDK and is an open source eclipse project claiming better startup and less resource consumption compared to HotSpot.

Ảo hóa hoàn toàn[sửa | sửa mã nguồn]

Sơ đồ logic của ảo hóa hoàn toàn

Trong ảo hóa hoàn toàn, máy ảo mô phỏng đủ phần cứng để cho phép một hệ điều hành "khách" chưa được sửa đổi (một thiết kế cho cùng một tập lệnh) được chạy tách biệt. Cách tiếp cận này đã đi tiên phong vào năm 1966 với IBM CP-40 và CP-67, tiền thân của gia đình VM.

Các ví dụ bên ngoài mainframe bao gồm Parallels Workstation, Parallels Desktop for Mac, VirtualBox, Virtual Iron, Oracle VM, Virtual PC, Virtual Server, Hyper-V, VMware Workstation, VMware Server (ngừng phát triển, trước đây là GSX Server), VMware ESXi, QEMU, Adeos, Mac-on-Linux, Win4BSD, Win4Lin Pro, và Egenera vBlade.

Ảo hóa dựa vào phần cứng[sửa | sửa mã nguồn]

Trong ảo hóa dựa vào phần cứng, phần cứng cung cấp hỗ trợ kiến trúc tạo điều kiện cho việc xây dựng trình giám sát máy ảo và cho phép các hệ điều hành khách được chạy riêng rẽ.[19] Ảo hóa dựa vào phàn cứng lần đầu được giới thiệu trên IBM System/370 in 1972,[cần dẫn nguồn] cho sử dụng với VM/370, hệ điều hành máy ảo đầu tiên được IBM cung cấp như một sản phẩm chính thức.

Vào năm 2005 và 2006, IntelAMD đã cung cấp phần cứng bổ sung để hỗ trợ ảo hóa. Sun Microsystems (bây giờ là Oracle Corporation) ađã bổ sung các tính năng tương tự trong bộ xử lý UltraSPARC T-Series của họ năm 2005. Ví dụ về các nền tảng ảo hóa thích ứng với phần cứng đó bao gồm KVM, VMware Workstation, VMware Fusion, Hyper-V, Windows Virtual PC, Xen, Parallels Desktop for Mac, Oracle VM Server for SPARC, VirtualBoxParallels Workstation.

Năm 2006, hỗ trợ phần cứng 32 và 64 bit x86 thế hệ đầu tiên được tìm thấy hiếm khi mang lại lợi thế về hiệu suất so với ảo hóa phần mềm.[20]

Ảo hóa cấp hệ điều hành[sửa | sửa mã nguồn]

Trong ảo hóa cấp hệ điều hành, một máy chủ vật lý được ảo hóa ở cấp hệ điều hành, cho phép nhiều máy chủ ảo hóa an toàn và tách biệt chạy trên một máy chủ vật lý. Các môi trường hệ điều hành "khách" có chung thể hiện của hệ điều hành với hệ thống chủ. Do đó, nhân hệ điều hành tương tự cũng được sử dụng để thực hiện các môi trường "khách" và các ứng dụng chạy trong môi trường "khách" đã xem nó như một hệ thống độc lập. Việc thực hiện tiên phong là FreeBSD jails; Các ví dụ khác bao gồm Docker, Solaris Containers, OpenVZ, Linux-VServer, LXC, AIX Workload Partitions, Parallels Virtuozzo Containers, và iCore Virtual Accounts.

Xem thêm[sửa | sửa mã nguồn]

Tham khảo[sửa | sửa mã nguồn]

  1. ^ Popek, Gerald J.; Goldberg, Robert P. (1974). “Formal requirements for virtualizable third generation architectures” (PDF). Communications of the ACM 17 (7): 412–421. doi:10.1145/361011.361073. 
  2. ^ a ă Smith, James E.; Nair, Ravi (2005). “The Architecture of Virtual Machines”. Computer 38 (5): 32–38, 395–396. doi:10.1109/MC.2005.173. 
  3. ^ Oliphant, Patrick. “Virtual Machines”. VirtualComputing. Bản gốc lưu trữ ngày 29 tháng 7 năm 2016. Truy cập ngày 23 tháng 9 năm 2015. Some people use that capability to set up a separate virtual machine running Windows on a Mac, giving them access to the full range of applications available for both platforms. 
  4. ^ “Super Fast Server Reboots – Another reason Virtualization rocks”. vmwarez.com. Ngày 9 tháng 5 năm 2006. Bản gốc lưu trữ ngày 14 tháng 6 năm 2006. Truy cập ngày 14 tháng 6 năm 2013. 
  5. ^ “Server Consolidation and Containment With Virtual Infrastructure” (PDF). VMware. 2007. Bản gốc (PDF) lưu trữ ngày 28 tháng 12 năm 2013. Truy cập ngày 29 tháng 9 năm 2015. 
  6. ^ Pugh, Emerson W. (1995). Building IBM: Shaping an Industry and Its Technology. MIT. tr. 274. ISBN 978-0-262-16147-3.  Đã bỏ qua tham số không rõ |url-access= (trợ giúp)
  7. ^ Pugh, Emerson W. và đồng nghiệp (1991). IBM's 360 and Early 370 Systems. MIT. tr. 160–161. ISBN 978-0-262-16123-7.  Đã bỏ qua tham số không rõ |url-access= (trợ giúp)
  8. ^ Wirth, Niklaus Emil; Weber, Helmut (1966). EULER: a generalization of ALGOL, and its formal definition: Part II, Communications of the Association for Computing Machinery 9 (2). New York: ACM. tr. 89–99. 
  9. ^ Griswold, Ralph E. The Macro Implementation of SNOBOL4. San Francisco, CA: W. H. Freeman and Company, 1972 (ISBN 0-7167-0447-1), Chapter 1.
  10. ^ Nelson, Graham A.. “About Interpreters”. Inform website. Bản gốc lưu trữ ngày 3 tháng 12 năm 2009. Truy cập ngày 7 tháng 11 năm 2009. 
  11. ^ Goldberg, Adele; Robson, David (1983). Smalltalk-80: The Language and its Implementation. Addison-Wesley Series in Computer Science. Addison-Wesley. ISBN 978-0-201-11371-6.  Đã bỏ qua tham số không rõ |url-access= (trợ giúp)
  12. ^ Deutsch, L. Peter; Schiffman, Allan M. (1984). “Efficient implementation of the Smalltalk-80 system”. POPL. Salt Lake City, Utah: ACM. ISBN 0-89791-125-3. doi:10.1145/800017.800542. 
  13. ^ Aycock, John (2003). “A brief history of just-in-time”. ACM Comput. Surv. 35 (2): 97–113. doi:10.1145/857076.857077. 
  14. ^ Ingalls, Jr., Daniel "Dan" Henry Holmes; Kaehler, Ted; Maloney, John; Wallace, Scott; Kay, Alan Curtis (1997). “Back to the future: the story of Squeak, a practical Smalltalk written in itself”. OOPSLA '97: Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications. New York, NY, USA: ACM Press. tr. 318–326. ISBN 0-89791-908-4. doi:10.1145/263698.263754. 
  15. ^ Bracha, Gilad; Griswold, David (1993). “Strongtalk: Typechecking Smalltalk in a Production Environment”. Proceedings of the Eighth Annual Conference on Object-oriented Programming Systems, Languages, and Applications. OOPSLA '93. New York, NY, USA: ACM. tr. 215–230. ISBN 978-0-89791-587-8. doi:10.1145/165854.165893. 
  16. ^ Ungar, David Michael; Smith, Randall B. (tháng 12 năm 1987). “Self: The power of simplicity”. ACM SIGPLAN Notices 22 (12): 227–242. ISSN 0362-1340. doi:10.1145/38807.38828. 
  17. ^ Hölzle, Urs; Ungar, David Michael (1994). “Optimizing dynamically-dispatched calls with run-time type feedback”. PLDI. Orlando, Florida, United States: ACM. tr. 326–336. ISBN 0-89791-662-X. doi:10.1145/178243.178478. 
  18. ^ Paleczny, Michael; Vick, Christopher; Click, Cliff (2001). “The Java HotSpot server compiler”. Proceedings of the Java Virtual Machine Research and Technology Symposium on Java Virtual Machine Research and Technology Symposium 1. Monterey, California: USENIX Association. 
  19. ^ Uhlig, Rich; Neiger, Gil; Rodgers, Dion; Santoni, Amy L.; Martins, Fernando C. M.; Anderson, Andrew V.; Bennett, Steven M.; Kägi, Alain; Leung, Felix H.; Smith, Larry (tháng 5 năm 2005). “Intel virtualization technology”. Computer 38 (5): 48–56. doi:10.1109/MC.2005.163. 
  20. ^ Adams, Keith; Agesen, Ole (ngày 21 tháng 10 năm 2006). A Comparison of Software and Hardware Techniques for x86 Virtualization (PDF). ASPLOS’06 21–ngày 25 tháng 10 năm 2006. San Jose, California, USA. Bản gốc (PDF) lưu trữ ngày 20 tháng 8 năm 2010. Surprisingly, we find that the first-generation hardware support rarely offers performance advantages over existing software techniques. We ascribe this situation to high VMM/guest transition costs and a rigid programming model that leaves little room for software flexibility in managing either the frequency or cost of these transitions. 

Đọc thêm[sửa | sửa mã nguồn]

  • James E. Smith, Ravi Nair, Virtual Machines: Versatile Platforms For Systems And Processes, Morgan Kaufmann, May 2005, ISBN 1-55860-910-5, 656 pages (covers both process and system virtual machines)
  • Craig, Iain D. Virtual Machines. Springer, 2006, ISBN 1-85233-969-1, 269 pages (covers only process virtual machines)

Liên kết ngoài[sửa | sửa mã nguồn]