Come vengono create le macchine virtuali
Macchina virtuale
Software che emula un intero computer
In informatica, una macchina virtuale ( VM ) è la virtualizzazione o l'emulazione di un sistema informatico. Le macchine virtuali si basano su architetture di computer e forniscono le funzionalità di un computer fisico. Le loro implementazioni possono coinvolgere hardware specializzato, software o una combinazione dei due. Le macchine virtuali differiscono e sono organizzate in base alla loro funzione, mostrata qui:
Alcuni emulatori di macchine virtuali, come QEMU e gli emulatori di console per videogiochi, sono progettati per emulare (o "imitare virtualmente") diverse architetture di sistema, consentendo così l'esecuzione di applicazioni software e sistemi operativi scritti per un'altra CPU o architettura. La virtualizzazione a livello di sistema operativo consente di partizionare le risorse di un computer tramite il kernel. I termini non sono universalmente intercambiabili.
Definizioni
Articolo principale: Macchina virtuale di sistema
Vedi anche: Virtualizzazione hardware e confronto tra software di virtualizzazione della piattaforma
Una "macchina virtuale" è stata originariamente definita da Popek e Goldberg come "un duplicato efficiente e isolato di una macchina di computer reale". [1] L'uso corrente include macchine virtuali che non hanno alcuna corrispondenza diretta con l'hardware reale. [2] L'hardware fisico "reale" che esegue la macchina virtuale viene in genere definito "host" e la macchina virtuale emulata in tale computer viene in genere definita "guest". Un host può emulare diversi guest, ognuno dei quali può emulare diversi sistemi operativi e piattaforme hardware.
Il desiderio di eseguire più sistemi operativi è stato il motivo iniziale per le macchine virtuali, in modo da consentire la condivisione del tempo tra diversi sistemi operativi single-tasking Sistemi. Per certi aspetti, una macchina virtuale di sistema può essere considerata una generalizzazione del concetto di memoria virtuale che storicamente l'ha preceduta. Il CP/CMS di IBM, il primo sistema a consentire la virtualizzazione completa, implementò il time sharing fornendo a ciascun utente un sistema operativo per utente singolo, il Conversational Monitor System (CMS). A differenza della memoria virtuale, una macchina virtuale di sistema autorizzava l'utente a scrivere istruzioni privilegiate nel proprio codice. Questo approccio presentava alcuni vantaggi, come l'aggiunta di dispositivi di input/output non consentiti dal sistema standard. [2]
Man mano che la tecnologia evolve la memoria virtuale ai fini della virtualizzazione, è possibile applicare nuovi sistemi di overcommit della memoria per gestire la condivisione della memoria tra più macchine virtuali su un sistema operativo di computer. Potrebbe essere possibile condividere pagine di memoria con contenuti identici tra più macchine virtuali in esecuzione sullo stesso macchina, ciò che può comportare la mappatura sulla stessa pagina fisica con una tecnica chiamata kernel same-page merging (KSM). Ciò è particolarmente utile per le pagine di sola lettura, come quelle che contengono segmenti di codice, che è il caso di più macchine virtuali che eseguono lo stesso software o software simili, librerie software, server Web, componenti middleware, ecc. I sistemi operativi guest non devono essere conformi all'hardware host, rendendo così possibile l'esecuzione di diversi sistemi operativi sullo stesso computer (ad esempio, Windows, Linux o versioni precedenti di un sistema operativo) per supportare il software futuro. [3]
L'uso di macchine virtuali per supportare sistemi operativi guest separati è popolare per quanto riguarda i sistemi embedded. Un uso tipico sarebbe quello di eseguire un sistema operativo in tempo reale contemporaneamente a un sistema operativo complesso preferito, come Linux o Windows. Un altro uso potrebbe essere per software nuovi e non provati ancora in fase di sviluppo, quindi funziona all'interno di una sandbox. Le macchine virtuali presentano altri vantaggi per lo sviluppo del sistema operativo e possono includere un migliore accesso al debug e riavvii più rapidi. [4]
Più macchine virtuali che eseguono il proprio sistema operativo guest sono spesso impegnate per il consolidamento dei server. [5]
Elabora le macchine virtuali
"Macchina virtuale dell'applicazione" reindirizza qui. Da non confondere con la virtualizzazione delle applicazioni.
Vedi anche: Confronto tra software di virtualizzazione delle applicazioni
Una VM di processo, a volte chiamata macchina virtuale dell'applicazione o Managed Runtime Environment (MRE), viene eseguita come una normale applicazione all'interno di un sistema operativo host e supporta un singolo processo. Viene creato all'avvio del processo e distrutto all'uscita. Il suo scopo è quello di fornire un ambiente di programmazione indipendente dalla piattaforma che astrae dettagli dell'hardware o del sistema operativo sottostante e consente l'esecuzione di un programma allo stesso modo su qualsiasi piattaforma. [ citazione necessaria ]
Una VM di processo fornisce un'astrazione di alto livello, quella di un linguaggio di programmazione di alto livello (rispetto all'astrazione ISA di basso livello della VM di sistema). Le macchine virtuali di processo vengono implementate utilizzando un interprete; Le prestazioni paragonabili ai linguaggi di programmazione compilati possono essere ottenute utilizzando la compilazione just-in-time. [ citazione necessaria ]
Questo tipo di VM è diventato popolare con il linguaggio di programmazione Java, che viene implementato utilizzando la macchina virtuale Java. Altri esempi includono la macchina virtuale Parrot e .NET Framework, che viene eseguito in una macchina virtuale denominata Common Language Runtime. Tutti possono fungere da livello di astrazione per qualsiasi linguaggio informatico. [ citazione necessaria ]
un caso particolare di processo: le VM sono sistemi che astraggono i meccanismi di comunicazione di un cluster di computer (potenzialmente eterogeneo). Tale macchina virtuale non è costituita da un singolo processo, ma da un processo per ogni macchina fisica nel cluster. Sono progettati per facilitare il compito di programmare applicazioni concorrenti consentendo al programmatore di concentrarsi sugli algoritmi piuttosto che sui meccanismi di comunicazione forniti dall'interconnessione e dal sistema operativo. Non nascondono il fatto che la comunicazione avviene e, in quanto tali, non tentano di presentare il cluster come una singola macchina. [ citazione necessaria ]
A differenza di altre VM di processo, questi sistemi non forniscono un linguaggio di programmazione specifico, ma sono incorporati in un linguaggio esistente; in genere un tale sistema fornisce collegamenti per diversi linguaggi (ad esempio, C e Fortran). [ citazione necessaria ] Esempi sono la macchina virtuale parallela (PVM) e il messaggio Interfaccia di passaggio (MPI).
Storia
Vedi anche: Storia di CP/CMS e cronologia dello sviluppo della virtualizzazione
Sia le macchine virtuali di sistema che le macchine virtuali di processo risalgono agli anni '60 e rimangono aree di sviluppo attivo.
Le macchine virtuali di sistema sono nate dal time-sharing, come implementato in particolare nel Compatible Time-Sharing System (CTSS). Il time-sharing permetteva a più utenti di utilizzare un computer contemporaneamente: ogni programma sembrava avere pieno accesso alla macchina, ma solo un programma veniva eseguito alla volta, con il sistema che passava da un programma all'altro in intervalli di tempo, salvando e ripristinando lo stato ogni volta. Questo si è evoluto in macchine virtuali, in particolare attraverso i sistemi di ricerca di IBM: l'M44/44X, che utilizzava la virtualizzazione parziale, e il CP-40 e SIMMON, che utilizzavano la virtualizzazione completa, e furono i primi esempi di hypervisor. La prima architettura di macchina virtuale ampiamente disponibile è stata la CP-67/CMS (vedi Storia di CP/CMS per i dettagli). Un'importante distinzione era tra l'utilizzo di più macchine virtuali su un sistema host per il time-sharing, come in M44/44X e CP-40, e l'utilizzo di una macchina virtuale su un sistema host per la prototipazione, come in SIMMON. Gli emulatori, con l'emulazione hardware di sistemi precedenti per compatibilità, risalgono all'IBM System/360 nel 1963, [6] [7] mentre l'emulazione software (allora chiamata "simulazione") lo precede.
Le macchine virtuali di processo sono nate originariamente come piattaforme astratte per un linguaggio intermedio utilizzato come rappresentazione intermedia di un programma da parte di un compilatore; i primi esempi risalgono al 1964 circa con il sistema di scrittura del compilatore META II che lo utilizzava sia per la descrizione della sintassi che per la generazione di codice target. Un esempio notevole del 1966 fu la macchina O-code, una macchina virtuale che esegue l'O-code (codice oggetto) emesso dal front-end del BCPL compilatore. Questa astrazione ha permesso al compilatore di essere facilmente convertito in una nuova architettura implementando un nuovo back-end che prendeva l'O-code esistente e lo compilava in codice macchina per la macchina fisica sottostante. Il linguaggio di Eulero utilizzava un design simile, con il linguaggio intermedio chiamato P (portatile). [8] Questo è stato reso popolare intorno al 1970 da Pascal, in particolare nel sistema Pascal-P (1973) e nel compilatore Pascal-S (1975), in cui è stato definito p-code e la macchina risultante come una macchina p-code. Questo è stato influente e le macchine virtuali in questo senso sono state spesso generalmente chiamate macchine p-code. Oltre ad essere un linguaggio intermedio, il p-code Pascal veniva anche eseguito direttamente da un interprete che implementava la macchina virtuale, in particolare in UCSD Pascal (1978); questo influenzò gli interpreti successivi, in particolare la Java virtual machine (JVM). Un altro esempio precoce fu SNOBOL4 (1967), che fu scritto in SNOBOL Implementation Language (SIL), un linguaggio assembly per una macchina virtuale, che è stato poi indirizzato alle macchine fisiche mediante il transpiling nel loro assembler nativo tramite un assemblatore di macro. [9] Da allora, tuttavia, le macro sono cadute in disgrazia, quindi questo approccio è stato meno influente. Le macchine virtuali di processo erano un approccio popolare per l'implementazione dei primi software per microcomputer, tra cui Tiny BASIC e giochi di avventura, da implementazioni una tantum come Pyramid 2000 a un motore generico come la z-machine di Infocom, che Graham Nelson sostiene sia "forse la macchina virtuale più portatile mai creata". [10]
Progressi significativi si sono verificati nell'implementazione di Smalltalk-80 [11], in particolare l'implementazione Deutsch/Schiffmann [12] che ha spinto in avanti la compilazione just-in-time (JIT) come approccio di implementazione che utilizza Elaborare la macchina virtuale. [13] Più tardi le VM Smalltalk degne di nota furono VisualWorks, la Squeak Virtual Machine, [14] e Strongtalk. [15] Un linguaggio correlato che ha prodotto molte innovazioni per le macchine virtuali è stato il linguaggio di programmazione Self [16], che ha aperto la strada all'ottimizzazione adattiva [17] e alla garbage collection generazionale. Queste tecniche si sono dimostrate un successo commerciale nel 1999 nella macchina virtuale Java HotSpot. [18] Altre innovazioni includono una macchina virtuale basata su registri, per adattarsi meglio all'hardware sottostante, piuttosto che una macchina virtuale basata su stack, che è una corrispondenza più vicina al linguaggio di programmazione; nel 1995, questo è stato introdotto dalla macchina virtuale Dis per il linguaggio Limbo.
Tecniche di virtualizzazione
Articolo principale: Virtualizzazione
completa
Completa virtualizzazione
Nella virtualizzazione completa, la macchina virtuale simula una quantità sufficiente di hardware per consentire l'esecuzione in isolamento di un sistema operativo "guest" non modificato (progettato per lo stesso set di istruzioni). Questo approccio è stato sperimentato nel 1966 con gli IBM CP-40 e CP-67, predecessori della famiglia VM.
Esempi al di fuori del campo mainframe includono Parallels Workstation, Parallels Desktop per Mac, VirtualBox, Virtual Iron, Oracle VM, Virtual PC, Virtual Server, Hyper-V, VMware Fusion, VMware Workstation, VMware Server (fuori produzione, precedentemente chiamato GSX Server), VMware ESXi, QEMU, Adeos, Mac-on-Linux, Win4BSD, Win4Lin Pro e la tecnologia Egenera vBlade.
Nella virtualizzazione assistita da hardware, l'hardware fornisce un supporto architettonico che facilita la creazione di un monitor di macchina virtuale e consente l'esecuzione di sistemi operativi guest in Isolamento. [19] La virtualizzazione assistita da hardware è stata introdotta per la prima volta su IBM System/370 nel 1972, per l'uso con VM/370, il primo sistema operativo per macchine virtuali offerto da IBM come prodotto ufficiale. [20]
Nel 2005 e nel 2006, Intel e AMD hanno fornito hardware aggiuntivo per supportare la virtualizzazione. Sun Microsystems (ora Oracle Corporation) ha aggiunto funzionalità simili nei suoi processori UltraSPARC T-Series nel 2005. Esempi di piattaforme di virtualizzazione adattate a tale hardware includono KVM, VMware Workstation, VMware Fusion, Hyper-V, Windows Virtual PC, Xen, Parallels Desktop per Mac, Oracle VM Server per SPARC, VirtualBox e Parallels Workstation.
Nel 2006, il supporto hardware x86 a 32 e 64 bit di prima generazione è risultato raramente offrire vantaggi in termini di prestazioni rispetto alla virtualizzazione del software. [21]
Virtualizzazione a livello di sistema operativo
Articolo principale: A livello di sistema operativo Nella
virtualizzazione a livello di sistema operativo, un server fisico viene virtualizzato a livello di sistema operativo, consentendo l'esecuzione di più server virtualizzati isolati e sicuri su un singolo server fisico. Gli ambienti del sistema operativo "guest" condividono la stessa istanza in esecuzione del sistema operativo del sistema host. Pertanto, lo stesso kernel del sistema operativo viene utilizzato anche per implementare gli ambienti "guest" e le applicazioni in esecuzione in un determinato ambiente "guest" lo vedono come un sistema autonomo. L'implementazione pionieristica sono state le jail di FreeBSD; altri esempi includono Docker, Solaris Containers, OpenVZ, Linux-VServer, LXC, AIX Workload Partitions, Parallels Virtuozzo Containers e iCore Virtual Accounts.
Articolo
principale: Snapshot (archiviazione del computer)
Un'istantanea è uno stato di una macchina virtuale, e generalmente dei suoi dispositivi di archiviazione, in un momento esatto. Un'istantanea consente il Stato della macchina virtuale al momento dello snapshot da ripristinare in un secondo momento, annullando in modo efficace le modifiche apportate in seguito. Questa funzionalità è utile come tecnica di backup, ad esempio, prima di eseguire un'operazione rischiosa. [ citazione necessaria ]
Le macchine virtuali utilizzano spesso dischi virtuali per l'archiviazione; in un esempio molto semplice, un'unità disco rigido da 10 gigabyte viene simulata con un file flat da 10 gigabyte. Tutte le richieste da parte della macchina virtuale per una posizione sul disco fisico vengono convertite in modo trasparente in un'operazione sul file corrispondente. Una volta presente tale livello di traduzione, tuttavia, è possibile intercettare le operazioni e inviarle a file diversi, a seconda di vari criteri. Ogni volta che viene creata un'istantanea, viene creato un nuovo file che viene utilizzato come sovrapposizione per i suoi predecessori. I nuovi dati vengono scritti nell'overlay più in alto; La lettura dei dati esistenti, tuttavia, richiede la gerarchia di sovrapposizione da scansionare, con conseguente accesso alla versione più recente. Pertanto, l'intero stack di snapshot è praticamente un singolo disco coerente; In questo senso, la creazione di snapshot funziona in modo simile alla tecnica di backup incrementale. [ citazione necessaria ]
In uno snapshot possono essere inclusi anche altri componenti di una macchina virtuale, ad esempio il contenuto della memoria ad accesso casuale (RAM), le impostazioni del BIOS o le impostazioni di configurazione. La funzione "Salva stato" negli emulatori di console per videogiochi è un esempio di tali istantanee. [ citazione necessaria ]
Il ripristino di un'istantanea consiste nell'eliminare o ignorare tutti i livelli di sovrapposizione aggiunti dopo tale istantanea e nell'indirizzare tutte le nuove modifiche a una nuova sovrapposizione. [ citazione necessaria ]
Articolo
principale: Migrazione (virtualizzazione)
Gli snapshot descritti sopra possono essere spostati in un'altra macchina host con il proprio hypervisor; quando la macchina virtuale viene temporaneamente arrestata, creata snapshot, spostata e quindi ripresa nel nuovo host, si parla di migrazione. Se gli snapshot meno recenti vengono mantenuti sincronizzati regolarmente, questa operazione può essere molto veloce e consentire alla macchina virtuale di fornire un servizio ininterrotto mentre l'host fisico precedente è, ad esempio, disattivato per la manutenzione fisica. [ citazione necessaria ]
Articolo
principale: Failover
Analogamente al meccanismo di migrazione descritto in precedenza, il failover consente alla macchina virtuale di continuare le operazioni in caso di errore dell'host. Generalmente si verifica se la migrazione ha smesso di funzionare. Tuttavia, in questo caso, la macchina virtuale continua l'operazione dall'ultimo stato coerente noto, anziché dallo stato corrente, in base ai materiali forniti l'ultima volta al server di backup. [ citazione necessaria ]
annidato virtualizzazione
La virtualizzazione nidificata si riferisce alla capacità di eseguire una macchina virtuale all'interno di un'altra, con questo concetto generale estendibile a una profondità arbitraria. In altre parole, la virtualizzazione nidificata si riferisce all'esecuzione di uno o più hypervisor all'interno di un altro hypervisor. Non è necessario che la natura di una macchina virtuale guest nidificata sia omogenea con la macchina virtuale host. Ad esempio, la virtualizzazione delle applicazioni può essere distribuita all'interno di una macchina virtuale creata utilizzando la virtualizzazione hardware. [22]
La virtualizzazione nidificata diventa più necessaria man mano che i sistemi operativi più diffusi acquisiscono funzionalità di hypervisor integrate, che in un ambiente virtualizzato possono essere utilizzate solo se l'hypervisor circostante supporta la virtualizzazione nidificata; ad esempio, Windows 7 è in grado di eseguire applicazioni Windows XP all'interno di una macchina virtuale integrata. Inoltre, lo spostamento di ambienti virtualizzati già esistenti in un cloud, seguendo l'approccio Infrastructure as a Service (IaaS), è molto più complicato se la piattaforma IaaS di destinazione non supporta la virtualizzazione nidificata. [23] [24]
Il modo in cui la virtualizzazione nidificata può essere implementata su una particolare architettura di computer dipende dalle capacità di virtualizzazione assistita da hardware supportate. Se una particolare architettura non fornisce il supporto hardware necessario per la virtualizzazione nidificata, vengono impiegate varie tecniche software per abilitarla. [23] Nel corso del tempo, più architetture ottengono il supporto hardware richiesto; ad esempio, a partire dalla microarchitettura Haswell (annunciata nel 2013), Intel ha iniziato a includere lo shadowing VMCS come tecnologia che accelera la virtualizzazione nidificata. [25]
Vedi anche
Riferimenti
- ^ Popek, Gerald J.; Goldberg Robert P. (1974). "Requisiti formali per architetture virtualizzabili di terza generazione" (PDF). Comunicazioni dell'ACM . 17 (7): 412–421. DOI:10.1145/361011.361073. S2CID 12680060.
- ^ a b Smith, James E.; Nair, Ravi (2005). "L'architettura delle macchine virtuali". Computer . 38 (5): 32–38, 395–396. DOI:10.1109/MC.2005.173. S2CID 6578280.
- ^ Oliphant, Patrick. "Macchine virtuali". Calcolo virtuale. Archiviato dall'originale il 2016-07-29. URL consultato il 23-09-2015.
- ^ "Super Fast Server Restarts - Another reason Virtualization rocks" (Riavvii super veloci) del server. vmwarez.com . 2006-05-09. Archiviato dall'originale il 2006-06-14. URL consultato il 14-06-2013.
- ^ "Consolidamento e contenimento dei server con l'infrastruttura virtuale" (PDF). VMware. 2007. Archiviato (PDF) dall'originale il 28/12/2013. URL consultato il 29-09-2015.
- ^ Pugh, Emerson W. (1995). Costruire IBM: Plasmare un settore e la sua tecnologia . MIT. p. 274. CODICE ISBN.
- ^ Pugh, Emerson W.; et al. (1991). I sistemi IBM 360 e Early 370 . MIT. pagine 160-161. CODICE ISBN.
- ^ Wirth, Niklaus Emil; Weber, Helmut (1966). EULER: una generalizzazione di ALGOL, e la sua definizione formale: Parte II, Comunicazioni dell'Associazione per le Macchine Informatiche . Vol. 9. New York: ACM. pagine 89-99.
- ^ Griswold, Ralph E. L'implementazione macro di SNOBOL4 . San Francisco, CA: W. H. Freeman and Company, 1972 (ISBN 0-7167-0447-1), Capitolo 1.
- ^ Nelson, Graham A. A proposito di interpreti". Informa il sito web . Archiviato dal Originale il 2009-12-03. URL consultato il 07-11-2009.
- ^ Goldberg, Adele; Robson, David (1983). Smalltalk-80: Il linguaggio e la sua implementazione . Serie di Addison-Wesley in informatica. Addison-Wesley. CODICE ISBN.
- ^ Deutsch, L. Peter; Schiffman, Allan M. (1984). "Implementazione efficiente del sistema Smalltalk-80". POPL . Salt Lake City, Utah: ACM. DOI:10.1145/800017.800542. CODICE ISBN.
- ^ Aycock, John (2003). "Breve storia del just-in-time". Calcolo ACM. Surv. 35 (2): 97–113. DOI:10.1145/857076.857077. S2CID 15345671.
- ^ Ingalls Jr., Daniel "Dan" Henry Holmes; Kaehler, Ted; Maloney, Giovanni; Wallace, Scott; Kay, Alan Curtis (1997). "Ritorno al futuro: la storia di Squeak, uno Smalltalk pratico scritto in sé". OOPSLA '97: Atti del 12° ACM SIGPLAN conferenza su Programmazione orientata agli oggetti, sistemi, linguaggi e applicazioni . New York, NY, STATI UNITI: ACM Press. pp. 318-326. DOI:10.1145/263698.263754. CODICE ISBN.
- ^ Bracha, Gilad; Griswold, David (1993). "Strongtalk: Typechecking Smalltalk in un ambiente di produzione". Atti dell'ottava conferenza annuale sui sistemi, i linguaggi e le applicazioni di programmazione orientata agli oggetti . OOPSLA '93. New York, NY, STATI UNITI: ACM. pagine 215-230. DOI:10.1145/165854.165893. CODICE ISBN.
- ^ Ungar, David Michael; Smith, Randall B. (dicembre 1987). "Sé: il potere della semplicità". Avvisi ACM SIGPLAN . 22 (12): 227–242. DOI:10.1145/38807.38828. ISSN 0362-1340.
- ^ Hölzle, Urs; Ungar, David Michael (1994). "Ottimizzazione delle chiamate inviate dinamicamente con feedback di tipo run-time". PLDI . Orlando, Florida, Stati Uniti: ACM. pagine 326-336. DOI:10.1145/178243.178478. CODICE ISBN.
- ^ Paleczny, Michael; Vick, Cristoforo; Clic, Cliff (2001). "Il compilatore del server Java HotSpot". Atti del simposio sulla ricerca e la tecnologia della macchina virtuale Java sul simposio sulla ricerca e la tecnologia della macchina virtuale Java . Vol. 1. Monterey, California: Associazione USENIX.
- ^
- ^ Randal, A. (2019). L'ideale contro il reale: rivisitare la storia delle macchine virtuali e dei container.
- ^ Adams, Keith; Agesen, Ole (2006-10-21). Un confronto tra le tecniche software e hardware per la virtualizzazione x86 (PDF). ASPLOS'06 21-25 ottobre 2006. San Jose, California, Stati Uniti. Archiviato (PDF) dall'originale il 2010-08-20.
- ^ Orit Wasserman, Red Hat (2013). "Virtualizzazione nidificata: tartarughe ombra" (PDF). Forum KVM. Estratto il 07-05-2021.
- ^ a b Muli Ben-Yehuda; Michael D. Day; Zvi Dubitzky; Fattore Michael; Nadav Har'El; Abel Gordon; Antonio Liguori; Orit Wasserman; Ben-Ami Yassour (2010-09-23). "Il progetto Turtles: progettazione e implementazione della virtualizzazione nidificata" (PDF). usenix.org . URL consultato il 16-12-2014.
- ^ Alex Fishman; Mike Rapoport; Evgeny Budilovsky; Izik Eidus (2013-06-25). "HVX: Virtualizzazione del cloud" (PDF). rackcdn.com . URL consultato il 16-12-2014.
- ^ "Processori Intel Core vPro di 4ª generazione con Intel VMCS Shadowing" (PDF). Intel. 2013. URL consultato il 16/12/2014.
Ulteriori letture
- James E. Smith, Ravi Nair, Virtual Machines: Versatile Platforms For Systems And Processes , Morgan Kaufmann, maggio 2005, ISBN 1-55860-910-5, 656 pagine (copre sia le macchine virtuali di processo che quelle di sistema)
- Craig, Iain D. Macchine virtuali . Springer, 2006, ISBN 1-85233-969-1, 269 pagine (copre solo le macchine virtuali di processo)