Condivisione di risorse multiprocessore

Completato

Gli argomenti discussi finora riguardano la condivisione nello spazio e nel tempo di un singolo componente del sistema, ad esempio CPU, memoria e disco. Si affronterà ora la condivisione di un intero sistema, operazione che viene eseguita condividendone tutti i componenti. In linea di principio, questa soluzione è applicabile sia ai sistemi uniprocessore che multiprocessore (ovviamente la condivisione di un sistema multiprocessore è sempre più complessa). Questa sezione è incentrata principalmente sulla condivisione di sistemi multiprocessore. Nella figura 8 viene illustrato un sistema multiprocessore partizionato nello spazio in tre partizioni. A ogni partizione vengono assegnate risorse fisicamente distinte dalle risorse usate dalle altre partizioni.

Ovviamente, la condivisione nello spazio consente a una partizione di possedere fisicamente le risorse. Il numero di partizioni che possono essere supportate in un sistema multiprocessore condiviso nello spazio è pertanto limitato al numero di processori fisici disponibili. Inoltre, si verifica spesso il sottoutilizzo di ognuna delle partizioni fisiche. La condivisione di sistemi multiprocessore nello spazio è quindi in genere una soluzione non ottimale per l'utilizzo del sistema. Ciononostante, la condivisione di sistemi multiprocessore nello spazio presenta vantaggi specifici. In primo luogo, protegge ogni partizione dalla possibilità di attacchi Denial of Service intenzionali o accidentali da parte di altre partizioni. In secondo luogo, non richiede algoritmi sofisticati per la pianificazione e la gestione delle risorse.

A multiprocessor system shared in space.

Figura 8: Condivisione nello spazio di un sistema multiprocessore

Rispetto alla condivisione nello spazio, la condivisione di sistemi multiprocessore nel tempo consente di partizionare un sistema n in un sistema con più di n partizioni, ovvero non si è più limitati dal numero di processori fisici disponibili. Nella figura 9 viene illustrato un sistema multiprocessore con risorse fisiche condivise nel tempo tramite multiplexing. Ovviamente, la condivisione nel tempo consente un migliore utilizzo del sistema poiché è consentito per due partizioni condividere le risorse di una singola scheda di sistema. Il costo da sostenere, tuttavia, è la necessità di adottare meccanismi per fornire modi sicuri ed efficienti per la condivisione delle risorse.

A multiprocessor system shared in time.

Figura 9: Condivisione nel tempo di un sistema multiprocessore

Come indicato in precedenza, la condivisione delle risorse nei sistemi multiprocessore è più complessa rispetto ai sistemi uniprocessore. In un sistema uniprocessore, ad esempio, la pianificazione è unidimensionale. In particolare, dopo aver definito un quantum specifico, l'utilità di pianificazione decide fondamentalmente il processo successivo. In un sistema multiprocessore, invece, dopo la definizione del quantum, l'utilità di pianificazione deve decidere qual è il processo successivo e su quale CPU operare. Quest'ultima dimensione aggiuntiva introduce una certa complessità, come illustrato nella figura 10. La figura illustra un modo per gestire la pianificazione nei multiprocessori in cui viene adottata una singola struttura di dati a livello di sistema, ad esempio un elenco o una coda. Nella figura 10(a) le quattro CPU sono occupate e più processi sono in attesa in una coda condivisa (ovvero visibile e accessibile per tutte le CPU), presupponendo un algoritmo round robin. Nella figura 10(b) la CPU2 completa il lavoro ed esegue il polling per la coda condivisa. Quando la CPU2 ottiene l'accesso alla coda, la blocca e seleziona il processo successivo pronto come indicato dall'algoritmo round robin. Il blocco della coda condivisa viene eseguito per evitare l'accesso non coerente da parte di più CPU inattive.

La pianificazione, come illustrato nella figura 10, è facile da implementare e offre una certa efficienza con il bilanciamento del carico automatico. In particolare, il bilanciamento del carico viene offerto automaticamente perché una CPU non sia mai inattiva mentre altre sono sovraccariche. Una strategia di pianificazione di questo tipo presenta però una mancanza cruciale in relazione alla scalabilità. In particolare, con l'aumento del numero di CPU , aumenteranno anche la contesa per la coda e il sovraccarico per il cambio di contesto.

Un'altra complessità correlata alla pianificazione nei sistemi multiprocessore è la potenziale inefficienza di utilizzo della memorizzazione nella cache. In particolare, quando il processo A nella figura 10 esaurisce il quantum assegnato per la CPU2, il contesto viene cambiato e l'elaborazione viene ripresa in seguito (quando è di nuovo il suo turno), probabilmente su una CPU diversa. Dopo l'esecuzione di A sulla CPU2, è probabile che la cache di CPU2 si riempia dei blocchi di cache di A. Di conseguenza, alla ripresa di A su una CPU diversa, l'impatto del mancato riscontro nella cache sarà elevato con effetti sulle prestazioni complessive. Alcuni sistemi multiprocessore risolvono questo problema applicando la cosiddetta pianificazione basata sull'affinità. Il concetto alla base della pianificazione basata sull'affinità è tentare di pianificare un processo su una CPU usata nel quantum precedente. Per altre informazioni sulla pianificazione basata sull'affinità, vedere The Implications of Cache Affinity on Processor Scheduling for Multiprogrammed, Shared Memory Multiprocessors di Vaswani e Zahorjan.1

Using a single, systemwide data structure (a queue, in this case) to pursue CPU scheduling in a multiprocessor system. The queue is shared across all the CPUs and exemplifies a round-robin algorithm. (a) All CPUs are assumed to be busy. (b) CPU2 finishes its work and gets the next process, B, from the queue. CPU2 has to lock the queue due to being shared by all CPUs before getting B.

Figura 10: Uso di una singola struttura di dati a livello di sistema (in questo caso una coda) per gestire la pianificazione della CPU in un sistema multiprocessore. La coda è condivisa tra tutte le CPU ed esemplifica un algoritmo round robin. (a) Si suppone che tutte le CPU siano occupate. (b) La CPU2 termina il lavoro e riceve il processo successivo, B, dalla coda. La CPU2 deve bloccare la coda perché è condivisa da tutte le CPU prima di ottenere B.

A questo proposito, si noti che la condivisione delle risorse come descritto in questa pagina (ovvero, nel contesto del sistema operativo) si applica anche alla virtualizzazione. In effetti, una delle attività principali dell'hypervisor consiste nel condividere/eseguire il multiplexing dei componenti di sistema sottostanti tra le varie macchine virtuali. Analogamente ai sistemi operativi tradizionali, l'hypervisor può applicare strategie di condivisione nello spazio e nel tempo.


Riferimenti

  1. Raj Vaswani e John Zahorjan (1991). The Implications of Cache Affinity on Processor Scheduling for Multiprogrammed, Shared Memory Multiprocessors SIGOPS Oper. Syst. Rev. 25, 5

Verificare le conoscenze

1.

Qual è il limite massimo per il numero di partizioni che possono essere supportate in un sistema multiprocessore con N processori condivisi nello spazio?

2.

Qual è il limite massimo per il numero di partizioni che possono essere supportate in un sistema multiprocessore con N processori condivisi nel tempo?