Software

Dieci lezioni per la virtualizzazione integrata

QNAP Container Station - Virtualizzazione senza pensieri grazie all'economico Turbo NAS TS-x31+ (Novembre 2018).

Anonim

Alcune cose da tenere a mente quando si sviluppano prodotti per il mercato embedded utilizzando l'elaborazione multicore e la virtualizzazione

DI MARK HERMELING
Wind River Systems
Alameda, CA
//www.windriver.com

Ci sono molti concetti da tenere a mente quando si sviluppano prodotti per il mercato embedded usando l'elaborazione multicore e la virtualizzazione. Ecco cosa pensiamo siano i 10 più importanti.

1. Pensa alle tue opzioni di partizionamento

Esistono diverse opzioni per il partizionamento di un sistema multicore. Il multiprocessing simmetrico (SMP) è un sistema operativo che controlla più core, ma questo ha un sovraccarico e complessità nella programmazione. La multiprocessing asimmetrica (AMP) può essere più adatta alle applicazioni incorporate perché utilizza un sistema operativo separato su ciascun core, che può consentire allo sviluppatore di sistemi di combinare i sistemi operativi in ​​tempo reale e open source con lo stesso design. Consente inoltre a diversi sistemi operativi di funzionare su diversi tipi di core come quelli ottimizzati per la grafica o il networking.

La virtualizzazione offre l'opportunità di astrarre il livello del sistema operativo dal processore. La virtualizzazione viene in genere ottenuta introducendo un livello (il monitor della macchina virtuale o l'hypervisor) direttamente sopra il processore, che quindi crea macchine virtuali in cui è possibile eseguire i sistemi operativi (vedere la Figura 1).

Fig. 1. Diverse configurazioni multicore.

L'hypervisor può essere utilizzato per condividere in tempo un singolo core tra più sistemi operativi (in esecuzione su macchine virtuali). Può anche partizionare un chip a quattro core in due partizioni SMP a due vie. Infine, può essere utilizzato per supervisionare un sistema multiprocessing asimmetrico (o sAMP, per AMP supervisionato); il supervisore fornisce opzioni di avvio, ciclo di vita (pausa, riavvio) e affidabilità e riduce i tempi di sviluppo rispetto a un sistema AMP tradizionale. La virtualizzazione offre la possibilità di partizionare e fornisce sicurezza e affidabilità allo stesso tempo.

2. Pensa alle tue scelte del sistema operativo

Multicore e virtualizzazione offrono l'opportunità di combinare diversi sistemi operativi in ​​partizioni in un singolo prodotto. Ad esempio, è possibile utilizzare un RTOS per attività di importanza critica e utilizzare un sistema operativo generico come Linux per le situazioni in cui il tempo è meno importante. Oppure utilizzare un RTOS insieme a un'interfaccia grafica utente (GUI), fortemente separati in modo da poter aggiornare frequentemente la funzionalità della GUI senza influire sul funzionamento (e sulla certificazione) di RTOS.

La scelta di un sistema operativo abilita anche un sistema operativo e le applicazioni legacy in una partizione combinata con un nuovo sistema operativo in un altro per aggiungere nuove funzionalità a un prodotto esistente, ad esempio.

3. Considerare il consolidamento

Multicore offre l'opportunità di consolidare progetti multiprocessore esistenti in un design a processore singolo. Soprattutto in settori come quello medico e industriale, la pratica consisteva nel separare diversi livelli di sicurezza o certificazione su diversi processori. Il multicore e la virtualizzazione offrono l'opportunità di combinare questi sistemi multiprocessore su diversi core di un singolo chip, in cui lo strato di virtualizzazione mantiene la separazione e garantisce che il sistema sia certificabile (vedi Fig. 2).

Fig. 2. Migrazione da multiprocessore a multicore.

4. Pensa al futuro

Potrebbe essere un buon momento per guardare l'architettura del tuo sistema e prepararti per il futuro. Se si utilizza un dispositivo single-core, si consideri che i processori otterranno solo più core nei prossimi anni. Preparare la tua architettura ora per essere flessibile e pronto per il multi-core potrebbe darti un vantaggio sulla concorrenza.

5. Considera il parallelismo

I core multipli forniscono un vero parallelismo; diverse operazioni verranno eseguite allo stesso tempo, modificando variabili e buffer nella memoria. Un'applicazione esistente che funziona perfettamente su un singolo core può mostrare condizioni di gara quando è in esecuzione su un multicore.

A seconda dell'applicazione, esistono diversi approcci per trarre vantaggio da più core. È possibile eseguire più istanze dell'applicazione in configurazioni SMP, AMP o sAMP. La domanda qui è se l'applicazione può beneficiare di più istanze.

Ci possono essere significativi vantaggi prestazionali nella riscrittura del codice per sfruttare i molteplici core. Ciò è particolarmente utile con le applicazioni che hanno più flussi separati di attività in cui ogni flusso può essere assegnato a un processore separato, il tutto in esecuzione in modo indipendente. In un ambiente a processore singolo, il codice non può essere parallelizzato. Riscrivere il codice potrebbe comportare un aumento significativo della velocità o una riduzione del consumo di energia per le stesse prestazioni.

6. Tieni a mente le risorse

Ci sono ancora colli di bottiglia in un sistema virtualizzato, e di solito sono la memoria, le cache e l'I / O. Nello sviluppo di un sistema virtualizzato, è necessario prestare attenzione al modo in cui la memoria di sistema è accessibile dai diversi core. Questo può essere gestito automaticamente dall'hypervisor, ma per più applicazioni ristrette alle risorse e per il debug, la mappatura delle risorse chiara aiuta il processo di sviluppo.

L'I / O può essere un collo di bottiglia che può essere superato aumentando le risorse di I / O o assicurando che i dati in entrata vengano mappati in modo efficiente su più core. Per alcuni sistemi, questo può essere semplice come allocare un core particolare a un set di I / O, ma per altri potrebbe essere più complicato. Ciò può anche influire sulla scelta dell'architettura software multicore con diversi modi di allocare i sistemi operativi ai core.

7. Non dimenticare la sicurezza

Uno dei principali vantaggi della virtualizzazione è la capacità di rendere un sistema più sicuro. Eseguendo applicazioni chiave come il controllo degli accessi o la gestione delle risorse in una macchina virtuale con una protezione rigorosa, è possibile aggiungere altre applicazioni al sistema senza comprometterne la sicurezza. Questo è sempre più importante con i sistemi industriali e embedded che hanno sempre più collegamenti di rete.

8. Non dimenticare l'avvio

Avviare un sistema virtualizzato con più core non è solo una questione di premere l'interruttore On. Il software deve essere consapevole del fatto che si tratta di un sistema multicore e di generare un core in modalità single-core per eseguire i test iniziali su memoria e I / O; altrimenti si scatenerà il caos, con core multipli che testano memorie e periferiche in quello che potrebbe essere un modo casuale. Ciò è particolarmente importante in caso di reset del sistema o di interruzione di corrente perché una scheda potrebbe accendersi in modo diverso in una sessione di debug.

Di nuovo, un hypervisor fornisce questa funzionalità fuori dalla scatola. Un concetto relativo all'avvio è l'aggiornamento sul campo. Molti sistemi ricevono aggiornamenti sul campo e devono essere riavviati con un aggiornamento nel minor tempo possibile. La virtualizzazione offre buone funzionalità perché è semplice eseguire un SO aggiuntivo per un hot spare che può caricare il carico mentre il SO originale si riavvia. Questo hot spare può condividere lo stesso core del sistema operativo che supporta il carico oppure può essere eseguito su un core separato.

9. Non dimenticare gli strumenti

Con i sistemi embedded che aumentano di dimensioni, la sfida spesso non è solo il debugging, ma è la ricerca di cosa fare il debug. Gli strumenti di analisi forniscono una panoramica del sistema (tracce di eventi, utilizzo della memoria, copertura del codice e molto altro) per individuare le aree in cui l'esecuzione è errata, in modo che un debugger possa essere utilizzato per investigare il codice effettivo.

Il debug di un sistema multicore è un po 'più complicato di un sistema single-core. Pensa a fermare un'applicazione su un core. Gli altri core del sistema stanno ancora facendo progressi. Pertanto, eventuali buffer di comunicazione tra le applicazioni su core diversi si riempiono e si riempiono rapidamente. Inoltre, cercare di determinare lo stato globale del sistema su tutti i core è difficile senza poter fermare tutti i core contemporaneamente. Il debug on-chip tramite le interfacce JTAG consente di arrestare tutti i core su un chip (quasi) contemporaneamente e può allo stesso tempo essere molto utile durante l'avvio del sistema (vedere n. 8).

10. Esplora e misura

I sistemi multicore rappresentano un approccio completamente nuovo per il progettista embedded e possono offrire notevoli vantaggi in termini di prestazioni e risparmi sui costi. Ma questi sono altamente dipendenti dall'applicazione. Parlare con alcuni esperti aiuterà a concentrarsi sulle esatte esigenze del progetto.

Trovare la migliore configurazione multicore (SMP, AMP, sAMP o virtualizzata) non è semplice; richiede un'attenta analisi Anche in questo caso non è possibile prevedere con precisione le prestazioni di una determinata applicazione su una determinata configurazione con un elevato grado di affidabilità.

Stabilire la configurazione e l'esecuzione di benchmark è davvero l'unico modo per garantire prestazioni adeguate. I benchmark, tuttavia, sono molto generici e l'applicazione potrebbe sottolineare l'hardware in modo diverso rispetto al benchmark.

Il benchmark più accurato è quello derivato dall'applicazione, una suite di test che misura le prestazioni dell'applicazione nella configurazione e riporta i numeri rilevanti per l'utente. La virtualizzazione ti aiuta nuovamente a stabilire la configurazione.

Esempio

Gli hypervisor per i sistemi embedded sono stati introdotti negli ultimi anni. Una di queste è Wind River Hypervisor, che è stato recentemente aggiornato alla versione 1.1 e funziona con processori single-core e multicore. Le nuove funzionalità includono il supporto per le ultime microarchitetture Intel, come i processori basati su Nehalem (con supporto per QorIQ di Freescale dopo la fine di quest'anno), l'integrazione con le ultime versioni di VxWorks e Wind River Linux e il supporto di altri sistemi operativi per una maggiore flessibilità, funzionalità aggiuntive per la comunicazione della macchina a intervalli e ottimizzazione per l'uso in combinazione con il debug on-chip 3.2. ■