# Multiprocessore

Un sistema multiprocessore (in inglese: multiprocessing) è un sistema di elaborazione con più processori e più precisamente un numero di unità di elaborazione centrale collegate insieme per consentire l'elaborazione parallela. L'obiettivo principale dell'utilizzo di un multiprocessore è quello di aumentare la velocità di esecuzione di un sistema, o nei sistemi tolleranti ai guasti operanti in parallelo, in cui l'elaborazioni di un processore vengono replicate e controllate da uno o più processori (doppia, tripla e quadrupla ridondanza), garantire l'integrità e l'esattezza dei dati e la continuità di funzionamento (ridondanza di processori).

## Descrizione

Inizialmente questo avveniva solo sui sistemi che chiedevano un'elevata potenza di calcolo, come quelli che dovevano operare su database di grandi dimensioni o eseguire calcoli molto complessi di simulazione o in ambienti dove le informazioni sono di importanza vitale. Non a caso gli unici processori che supportano tale modalità sono quelli espressamente progettati per il settore server, come gli Intel Xeon MP (multiprocessor), o Itanium 2 MP e gli AMD Athlon MP e Opteron.
Per sfruttare i vantaggi di un sistema multiprocessore, al pari di uno biprocessore, è necessario che anche il sistema operativo e i programmi siano realizzati in maniera da utilizzare le maggiori risorse offerte. In pratica, in fase di programmazione è necessario "parallelizzare" il codice in modo che non si abbiano situazioni in cui l'applicazione "vede" solo uno dei processori saturandolo e lasciando inutilizzati tutti gli altri. Spesso è necessario utilizzare più processori, gruppi di processori e cluster. Nel caso di basi di utenti molto ampie e diffuse, i gruppi di più processori e le varie istanze del database possono anche essere geograficamente dispersi.
Nei multiprocessori diverse CPU condividono una memoria comune:
* Le CPU devono coordinarsi per accedere alla memoria.
* Esistono diversi schemi di collegamento tra CPU e memoria; quello più semplice prevede un bus condiviso.
Nel corso del 2005 sia Intel che AMD sono giunti ad un punto in cui non riescono più ad aumentare la frequenza del clock dei propri processori (a causa dell'eccessivo consumo e produzione di calore) e quindi, dato che ormai i processi di miniaturizzazione lo consentivano, hanno cominciato ad intraprendere la nuova strada del processore dual core che è una sorta di sistema biprocessore un po' particolare. Il socket sulla scheda madre rimane uno solo, ma sul package vengono montati due core identici, che vengono visti dal sistema operativo come due core "fisici", quindi quasi come se fosse un sistema biprocessore tradizionale. In realtà questo non è propriamente un sistema biprocessore, considerando che un sistema dual core condivide lo stesso bus tra i due core.
Combinando processori dual core con schede madri dotate di due socket si avranno dunque quattro core fisici di elaborazione; questo, secondo le definizioni iniziali rimane un sistema biprocessore, anche se all'atto pratico è come se fosse un "quadriprocessore".

### Sfruttamento da parte dei sistemi operativi

Ogni sistema operativo gestisce in modo differente le potenzialità dei sistemi multi-processore, in alcuni casi questa possibilità è limitata dalle licenze e in alcuni casi anche dalle caratteristiche del software. Intel ha già dimostrato un sistema Itanium 2 Montecito (processore dual core) composto da 4 processori. Moltiplicando il numero di CPU per il numero di core di ciascuna, e considerando che ogni core implementa la tecnologia Hyper-Threading, il sistema operativo vedeva ben 16 processori "logici".

### Tipi di sistemi multiprocessore

Ci sono molti tipi di sistemi multiprocessore. Questi possono essere classificati in base alle seguenti caratteristiche:
* Multiprocessore "Loosely coupled" (ad accoppiamento largo)
* Multiprocessore "Tightly coupled" (accoppiamento stretto)
* Multiprocessore eterogeneo
* Multiprocessore omogeneo
* Multiprocessore con memoria condivisa distribuita
* Sistema UMA
* Sistema cc-NUMA
* Sistema ibrido - memoria condivisa per dati globali, memoria locale per dati locali.