Thực thi chương trình |
---|
Khái niệm chung |
Các loại mã |
Chiến lược biên dịch |
Runtime đáng chú ý |
|
Trình biên dịch & toolchain đáng chú ý |
|
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ộ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.
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] Phầ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 quy trình, đôi khi được gọi là máy ảo ứng dụng, hoặc Môi trường thời gian chạy được quản lý (MRE), chạy như một ứng dụng bình thường bên trong hệ điều hành máy chủ và hỗ trợ một quy trình duy nhất. Nó được tạo ra khi quá trình đó được bắt đầu và bị phá hủy khi nó thoát. Mục đích của nó là cung cấp một môi trường lập trình độc lập với nền tảng giúp tóm tắt các chi tiết của phần cứng hoặc hệ điều hành bên dưới và cho phép một chương trình thực thi theo cùng một cách trên bất kỳ nền tảng nào.
Máy ảo quy trình cung cấp tính trừu tượng mức cao - của ngôn ngữ lập trình mức cao (so với mức trừu tượng ISA mức thấp của máy ảo hệ thống). Máy ảo quy trình được thực hiện bằng cách sử dụng trình thông dịch; có thể đạt được hiệu suất tương đương với các ngôn ngữ lập trình đã biên dịch bằng cách sử dụng biên dịch đúng lúc.[cần dẫn nguồn]
Loại máy ảo này đã trở nên phổ biến với ngôn ngữ lập trình Java, được thực hiện bằng máy ảo Java. Các ví dụ khác bao gồm máy ảo Parrot và .NET Framework, chạy trên máy ảo được gọi là Common Language Runtime. Tất cả chúng có thể đóng vai trò là một lớp trừu tượng cho bất kỳ ngôn ngữ máy tính nào.
Một trường hợp đặc biệt của máy ảo quy trình là hệ thống trừu tượng hóa các cơ chế giao tiếp của một cụm máy tính (có khả năng không đồng nhất). Một máy ảo như vậy không bao gồm một quá trình đơn lẻ, mà một quá trình cho mỗi máy vật lý trong cụm. Chúng được thiết kế để dễ dàng thực hiện công việc lập trình các ứng dụng đồng thời bằng cách cho phép người lập trình tập trung vào các thuật toán hơn là các cơ chế giao tiếp được cung cấp bởi kết nối liên kết và hệ điều hành. Họ không che giấu thực tế rằng giao tiếp diễn ra, và do đó, không cố gắng trình bày cụm như một máy duy nhất.[cần dẫn nguồn]
Không giống như các máy ảo quy trình khác, các hệ thống này không cung cấp một ngôn ngữ lập trình cụ thể mà được nhúng vào một ngôn ngữ hiện có; thường một hệ thống như vậy cung cấp các ràng buộc cho một số ngôn ngữ (ví dụ: C và Fortran). [cần nguồn dẫn] Ví dụ là Máy ảo song song (PVM) và Giao diện truyền thông báo (MPI). Chúng không hoàn toàn là máy ảo vì các ứng dụng chạy trên đầu vẫn có quyền truy cập vào tất cả các dịch vụ hệ điều hành và do đó không bị giới hạn trong mô hình hệ thống.
Cả máy ảo hệ thống và máy ảo xử lý đều có từ những năm 1960 và tiếp tục là những lĩnh vực phát triển tích cực.
Các máy ảo hệ thống đã phát triển nhờ tính năng chia sẻ thời gian, đặc biệt là được triển khai trong Hệ thống chia sẻ thời gian tương thích (CTSS). Chia sẻ thời gian cho phép nhiều người dùng sử dụng máy tính đồng thời: mỗi chương trình dường như có toàn quyền truy cập vào máy, nhưng chỉ một chương trình được thực thi tại thời điểm đó, với hệ thống chuyển đổi giữa các chương trình theo từng lát thời gian, lưu và khôi phục trạng thái mỗi lần. Điều này đã phát triển thành các máy ảo, đặc biệt là thông qua các hệ thống nghiên cứu của IBM: M44 / 44X, sử dụng ảo hóa một phần và CP-40 và SIMMON, sử dụng ảo hóa hoàn toàn và là những ví dụ ban đầu về siêu giám sát. Kiến trúc máy ảo đầu tiên được phổ biến rộng rãi là CP-67 / CMS (xem Lịch sử của CP / CMS để biết thêm chi tiết). Một điểm khác biệt quan trọng là giữa việc sử dụng nhiều máy ảo trên một hệ thống máy chủ để chia sẻ thời gian, như trong M44 / 44X và CP-40 và sử dụng một máy ảo trên hệ thống máy chủ để tạo mẫu, như trong SIMMON. Trình giả lập, với khả năng mô phỏng phần cứng của các hệ thống trước đó để tương thích, có từ thời Hệ thống IBM / 360 vào năm 1963, trong khi mô phỏng phần mềm (khi đó được gọi là "mô phỏng") có trước nó.
Xử lý máy ảo ban đầu là nền tảng trừu tượng cho một ngôn ngữ trung gian được trình biên dịch sử dụng làm đại diện trung gian của một chương trình; các ví dụ ban đầu có niên đại khoảng năm 1966. Một ví dụ đầu năm 1966 là máy mã O, một máy ảo thực thi mã O (mã đối tượng) được phát ra bởi giao diện người dùng của trình biên dịch BCPL. Sự trừu tượng này cho phép trình biên dịch dễ dàng được chuyển sang một kiến trúc mới bằng cách triển khai một back end mới lấy mã O hiện có và biên dịch nó thành mã máy cho máy vật lý bên dưới. Ngôn ngữ Euler đã sử dụng một thiết kế tương tự, với ngôn ngữ trung gian có tên là P (portable). Điều này đã được phổ biến vào khoảng năm 1970 bởi Pascal, đặc biệt là trong hệ thống Pascal-P (1973) và trình biên dịch Pascal-S (1975), trong đó nó được gọi là mã p và kết quả là máy mã p. Điều này đã có ảnh hưởng và các máy ảo theo nghĩa này thường được gọi là máy mã p. Ngoài vai trò là một ngôn ngữ trung gian, mã p Pascal còn được thực thi trực tiếp bởi một trình thông dịch thực thi máy ảo, đặc biệt là trong UCSD Pascal (1978); điều này ảnh hưởng đến các trình thông dịch sau này, đặc biệt là máy ảo Java (JVM). Một ví dụ ban đầu khác là SNOBOL4 (1967), được viết bằng Ngôn ngữ triển khai SNOBOL (SIL), một ngôn ngữ hợp ngữ cho một máy ảo, sau đó được nhắm mục tiêu đến các máy vật lý bằng cách chuyển tiếp đến trình hợp dịch gốc của chúng thông qua trình hợp dịch macro. Tuy nhiên, các macro đã không còn được ưa chuộng nữa nên cách tiếp cận này đã ít ảnh hưởng hơn. Máy ảo xử lý là một cách tiếp cận phổ biến để triển khai phần mềm máy tính vi mô ban đầu, bao gồm Tiny BASIC và các trò chơi mạo hiểm, từ việc triển khai một lần như Pyramid 2000 đến một công cụ đa năng như z-machine của Infocom, mà Graham Nelson lập luận là "có thể là nhiều nhất máy ảo di động từng được tạo ra ".
Những tiến bộ đáng kể đã xảy ra trong việc triển khai Smalltalk-80, đặc biệt là việc triển khai Deutsch / Schiffmann đã thúc đẩy quá trình biên dịch đúng lúc (JIT) như một phương pháp triển khai sử dụng máy ảo quy trình. Các máy ảo Smalltalk đáng chú ý sau này là VisualWorks, Máy ảo Squeak và Strongtalk. Một ngôn ngữ có liên quan đã tạo ra rất nhiều đổi mới máy ảo là ngôn ngữ lập trình Self, ngôn ngữ này đi tiên phong trong việc tối ưu hóa thích ứng và thu gom rác nhiều thế hệ. Những kỹ thuật này đã được chứng minh là thành công về mặt thương mại vào năm 1999 trong máy ảo HotSpot Java. Những đổi mới khác bao gồm việc có một máy ảo dựa trên thanh ghi, để phù hợp hơn với phần cứng bên dưới, chứ không phải là một máy ảo dựa trên ngăn xếp, điều này phù hợp hơn với ngôn ngữ lập trình; vào năm 1995, điều này đã được tiên phong bởi máy ảo Dis cho ngôn ngữ Limbo. OpenJ9 là một giải pháp thay thế cho HotSpot JVM trong OpenJDK và là một dự án nhật thực mã nguồn mở tuyên bố khởi động tốt hơn và tiêu thụ ít tài nguyên hơn so với HotSpot.
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.
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ẽ.[6] Ả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, Intel và AMD đã cung cấp phần cứng bổ sung để hỗ trợ ảo hóa. Sun Microsystems (bây giờ là Oracle Corporation) đã 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, VirtualBox và Parallels 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.[7]
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.
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.
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.