Scopo delle Moderne MV per HLL La necessità è quella di distribuire programmi sulla rete a piattaforme diverse interconnesse. In questa situazione una architettura a HLL VM è molto conveniente: Ogni piattaforma implementa la VM. I programmi sono distribuiti in form compilata e vengono eseguiti sulla locale VM.
Modern HLL VMs features Oltre alle istruzioni (analoghe a quelle della P-code) HLL VMs includono le strutture dati: oggetti nella JavaVM. funzioni in a VM funzionale In questo modo la struttura dati è implementata sulla macchina fisica, in accordo alle carateristiche definite nella descrizione dei metadati.
HLL VM code to Local Machine code Loader Internal Data Structures Metadata Interpreter Code Native code Translator
Modern HLL VMs features Sicurezza e protezione: devono essere garantite anche eseguendo programmi recevuti da fonti non affidabili Robustezza: è molto importante per problemi complessi in ambiente distribuito Networking: Sulla rete si trovano situazioni molto diverse a cui è necessario adattarsi, per esempio larghezza di banda ridotta Performance
Sicurezza and Protezione I programmi (guest) (in forma compilata) sono distribuiti sulla rete ma eseguiti localmente dalla VM. I programmi guest devono poter accedere a alcuni file locali e remoti ma invece l’accesso ad altri file locali e remoti deve essere impedito. Anche il software della VM deve essee protetto dai programmi guest anche se in esecuzioni appartengono allo stesso processo. Tale tipo di protezione è diversa dalla protezione di solito fornita dai SO (isolamento dell’utente e protezione delle risorse)
Sicurezza and Protezione: file publici La HLL VM controlla che l’accesso ai file loali e/o remoti avvenga su file publici. Un metodo semplice è quello di definire define convenzioni concordate pubblicamente a proposito del naming dei file publici. Naturalmente la responsabilità della visibilità dei files è dell’utente del sistema remoto.
Sicurezza and Protezione: sandboxes L’ accesso alla memoria nell’host è controllata e limitata alle così dette sandbox. Fondamentalmente una sandbox è lo spazio di memoria di un’applet (piccola applicazione) in Java. Più recetemente (in Java 2) è stato introdotto un modello più sofisticato per la sicurezza.
Componenti della sandbox Emulation engine trusted standard libraries trusted lib met. nat. met. load met. class file Network File System loader trusted security manager trusted local file. local file Local File System Every thing outside the big box is untrusted except explicitely stated Ogni cosa fuori dalla riquado grande è non affidabile a meno che esplicitamente stabilito
Componenti della sandbox Emulation engine: esegue il codice Loader: controlla la definizione dei metodi nei class file e produce una versione locale dei metodi (loaded method) Security manager: controlla i tentativi di accesso ai file loali Metodi affidabili (trusted): librerie native: alcuni di questi sono quelli invocati per accedere a file locali. loaded (ottenuti dal loader come risultato del controllo)
Cosa deve essere controllato accessi alla memoria necessari per operare sulle strutture dati. trasferimenti di controllo (jumps) devono essere all’interno dell’area del programma (code area) transferimenti di controllo fuori dall’area del del programma devono derivare solo da chiamate e ritorni di metodi.
Processo di controllo statico Viene eseguito dal loader. se il languaggio è fortemente tipato, il loader può controllare che : tutte le structure dati siano parte di meta dati e gli accessi alla memoria devono essere consistenti. jumps sono all’interno dell’area del programma, se il jump è assoluto (?verificare) i transferimenti di controllo derivano solo da invocazioni e ritorni di metodi l’implementazione è più efficiente dato che i controlli a runtime sono limitati. accessi alla memoria il cui indirizzo viene calcolato da un computazione (f.i. arrays) non possono essere controllati staticamente, ma, devono essere controllati a run-time.
Processo di controllo dinamico viene eseguito dall’emulation engine controlla tutto quello che non è controllato staticamente. permette di utilizzare metodi di quelunque HL language (fortemente tipato o no). è inefficiente dato che il controllo è ripetuto ad ogni esecuzione
Caratteristiche Object-Oriented Tutti dati sono oggetti i.e. Una classe è un a specie di tipo astratto (equivalenza nominale di tipo) Una specie perchè le informazioni sull’implementation possono essere nascoste(private) o essere pubbliche (public) o protette(protcted). Ereditarietà e l’overriding di metodi, forniscono un tipo di polimorfismo Interfacces e classi astratte permettono di separare la specifica e l’implementazione
Garbage collection Oggetti sono allocati dinamicamente and memorizzati nello heap. Se un oggetto non è più raggiungibile, iil suo spazio di memoria può essere recuperato e riusato. Alcuni (vecchi) languaggi (Pascal C++) mettono a disposzione dell’utente meccanismi per liberare dati (objects) non più necessari. Problemi con riferimenti di memoria non validi(memory leaks) Una soluzione diversa è quella della garbage collection: un programma che visita la memoria per raccogliere dati non pi`u usati e restituirli al memory management.
Networking Operando in rete, può essere necessario risparmiare memoria a seconda anche del tipo di ambiente in cui eve operare.. Usando la tecnologia HLLVMs , programmi che circolano in rete sono expressi in un linguaggio ad alto livello, quindi sono molto più compatti. Comunque la specifica dei metadata probabilmente cancella la larghezza di banda (bandwidth) risparmiata. Il caricamento (loading) dinamico e incrementale è il reale beneficio.
Performance C’è molto spazio per migliorere la performance di sistema: traduzione invece di interpretazione ci sono parecchie tecniche che possono essere used per l’ottimizzazione: ottimizzazione traditional, profiling etc. (beyond the scope of the course)