# Overhead

Overhead (termine della lingua inglese, in italiano lett. "in alto" o "che sta di sopra"), in informatica, è utilizzato per definire le risorse accessorie, richieste in sovrappiù rispetto a quelle strettamente necessarie per ottenere un determinato scopo in seguito all'introduzione di un metodo o di un processo più evoluto o più generale.

## Esempi d'utilizzo
### Sistemi operativi

Il tempo di overhead è un parametro fondamentale per lo studio delle prestazioni di un sistema operativo. Esso rappresenta il tempo medio di CPU necessario per eseguire i moduli del kernel. È spesso fornito in percentuale rispetto al tempo totale di utilizzo della CPU. Si può calcolare con:
${\text{Overhead }}\%=100\cdot {\frac {\text{tempo CPU per l'esecuzione dei moduli del kernel}}{\text{tempo totale di utilizzo CPU}}}$
Ovviamente, più il tempo è basso, maggiore sarà la quantità di tempo CPU che si può utilizzare per i processi utente.
Nei sistemi a livelli l'inserimento di più strati implica un sostanziale aumento dell'Overhead, diminuendo l'efficienza del sistema stesso.

### Programmazione

Nei linguaggi di programmazione ad alto livello, un esempio di overhead riguarda il tempo di esecuzione dei sottoprogrammi: al tempo da questi impiegato per svolgere il loro compito (ad esempio il calcolo di una radice quadrata) si aggiunge infatti il tempo necessario a gestire il meccanismo stesso di chiamata a sottoprogramma attraverso record di attivazione. Questo tempo aggiuntivo può essere ridotto con un uso accorto di specifiche tecniche di ottimizzazione, ma non può essere eliminato del tutto.
In generale, più i linguaggi di programmazione sono ad alto livello, maggiore tende a essere l'overhead associato ai loro meccanismi di funzionamento. L'overhead necessario a chiamare un metodo in un linguaggio di programmazione object oriented, per esempio, è superiore a quello necessario a chiamare un sottoprogramma di un linguaggio procedurale, a causa della necessità di risolvere dinamicamente situazioni di overriding.
Sempre in generale, e per motivi analoghi, l'overhead aumenta se si sovrappongono strati di astrazione. Un esempio in questo senso potrebbe essere quello di una classe (C++, Java, ecc.) che incapsula un'API in linguaggio C. In questo caso, l'invocazione di un metodo della classe comporterà sia l'overhead proprio della chiamata di metodo sia quello immediatamente successivo, legato alla chiamata della funzione C sottostante.
Per questi motivi, nello sviluppo di sistemi con forti requisiti a livello di prestazioni si opta talvolta per strumenti di programmazione "a basso livello" (come il linguaggio C o addirittura l'assembly) che consentono di contenere i costi di overhead al prezzo di una maggior difficoltà nella scrittura del programma.

### Reti di calcolatori

Nelle reti di calcolatori, il termine "overhead" si riferisce a quella parte di banda di trasmissione che viene utilizzata per spedire, anziché informazione utile, dati aggiuntivi necessari per il particolare protocollo di rete utilizzato. Anche in questo caso, la presenza di molteplici livelli di astrazione (caratteristica tipica dell'architettura dei protocolli di rete) si traduce in un sommarsi dell'overhead imposto da ciascun livello (imbustamento). In termini pratici, questo overhead si concretizza nella maggior parte dei casi nell'introduzione di un cosiddetto header dei messaggi che contiene, per esempio, l'indirizzo di destinazione e altre informazioni. (Per una analogia, si pensi all'indirizzo scritto su una busta, o alla busta stessa, come un overhead necessario per spedire l'informazione utile, ovvero la lettera contenuta nella busta).

### Reti di telecomunicazione

Anche nelle reti di telecomunicazioni, il termine "overhead" si riferisce a quella parte di banda di trasmissione che viene utilizzata per spedire, anziché l'informazione utile, dati aggiuntivi necessari per i protocolli di trasmissione stessa (per esempio SDH o PDH) e per il monitoraggio, la gestione e il controllo della rete stessa, sia da parte di meccanismi automatici (per esempio, protocolli di protezione di rete) che da parte di sistemi di gestione esterni, per esempio per segnalare condizioni di guasto o per consentire la configurazione della rete tramite sistemi remoti centralizzati. Il contenuto e il significato delle informazioni di overhead dipende dal tipo di protocollo di trasmissione utilizzato.

### Processi di sviluppo

Nell'ambito di un progetto di sviluppo di un prodotto, il "lavoro utile" è quello direttamente finalizzato alla realizzazione del prodotto. Eventuale lavoro aggiuntivo necessario per amministrare il progetto (per esempio nel contesto di un determinato modello di processo) può essere quindi identificato come "overhead".