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ự." 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. 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. 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. 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. 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ủ. 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ẽ. Ả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, 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. 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.