Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Il passaggio del controllo di un programma al sistema operativo
(ovvero al suo kernel, o nucleo) per effettuare chiamate a sistema avviene normalmente mediante il meccanismo degli interrupt. Un interrupt è un evento che interrompe il flusso di esecuzione del programma e passa il controllo a codice del sistema operativo, cambiando modalità di esecuzione in modo che il programma abbia privilegi più alti. Un interrupt può essere generato dalla CPU stessa oppure da eventi esterni come la pressione di un tasto sulla tastiera.
I moduli principali del kernel del sistema operativo, attivati mediante interrupt, sono adibiti alla gestione dei processi, della memoria, di file e I/O in genere, e del tempo.
Il modulo di esecuzione dei processi è adibito al caricamento di un programma eseguibile (loading), alla sua schedulazione (assegnazione della CPU), alla gestione degli interrupt, al mantenimento delle informazioni sull'esecuzione in una struttura chiamata...
Process Control Block (PCB) e alla gestione dei segnali, un meccanismo di notifica di eventi tra processi e tra sistema operativo e processi. Il modulo di gestione della memoria fornisce nei sistemi operativi moderni un meccanismo di virtualizzazione della memoria in modo che ogni processo veda una porzione tutta sua e non sia possibile per un processo accedere alla memoria di un altro processo senza che quest'ultimo ne sia a conoscenza. Questo meccanismo di protezione impedisce ad esempio a un programma malevolo o difettoso di accedere allo spazio di memoria di un altro programma alternandone il contenuto. La virtualizzazione è basata su una separazione tra memoria fisica e memoria logica accessibile ai programmi. Un altro aspetto della gestione della memoria riguarda l'allocazione dello spazio logico disponibile ai programmi stessi. Il modulo di gestione dei file e dell'I/O in generale si occupa di soddisfare le richieste di uso dei dischi e di dispositivi daParte dei programmi. Importanti sono i driver, componenti software che forniscono un'interfaccia standard verso il kernel astraendo le caratteristiche specifiche dei dispositivi esterni.
Il modulo di gestione del tempo fornisce al kernel e alle applicazioni funzionalità per la misurazione del tempo reale e del tempo speso attivamente sulla CPU su base singolo processo.
L'uso dell'hardware da parte di un programma avviene come segue:
- la CPU può essere usata dal programma in modalità utente senza il tramite del sistema operativo. Questo avviene quando il programma gira in modalità utente
- ogni altra interazione con l'hardware è mediata dal sistema operativo.
Prima Parte Pagina 6
Come viene programmato un sistema di calcolo?
martedì 1 marzo 2022 09:00
Prima Parte Pagina 7
Prima Parte Pagina 8
Sintassi AT&T
mercoledì 2 marzo 2022 09:00
Tipi di dato Suffisso Dimensione Corrispondenza macchina assembly tipi C
Byte b 1 byte
(8 bit) (unsigned) char
Word w 2 byte (16 bit) (unsigned) short
Double word l 4 byte (32 bit) • (unsigned) int•
Indirizzo di memoria• (unsigned) long
Quad word q 8 byte (64 bit) Indirizzo di memoria per x86_64x
Prima Parte Pagina 9
Prima Parte Pagina 10
Prima Parte Pagina 11
Prima Parte Pagina 12
If/if-else in Assembly martedì 8 marzo 2022 09:00
Prima Parte Pagina 13
Prima Parte Pagina 14
While/ for in Assembly mercoledì 9 marzo 2022 09:00
Prima Parte Pagina 15
Prima Parte Pagina 16
Prima Parte Pagina 17
Aritmetica dei puntatori martedì 15 marzo 2022 09:00
Prima Parte Pagina 18
Prima Parte Pagina 19
mercoledì 16 marzo 2022 09:00 c=a
char c
short c
int c
c=a
unsigned char c
unsigned short c
unsigned int c
char a
Spostamento Down-cast
Down-cast unsigned
Spostamento Down-cast
Down-cast
movb %cl, %al
movb %cl, %al
movb %cl, %al
char a
movb %cl, %al
movb %cl, %al
movb %cl, %al
short a
Up-cast
Spostamento Down-cast unsigned
Up-cast
Spostamento Down-cast
movsbw %cl, %ax
35 Ottimizzazione dei programmi
martedì 12 aprile 2022 09:00
Seconda Parte Pagina 36
Seconda Parte Pagina 37
Profilazione automatica
mercoledì 20 aprile 2022 09:00
Seconda Parte Pagina 38
Seconda Parte Pagina 39
Ulteriori ottimizzazioni del compilatore
martedì 26 aprile 2022 09:00
Seconda Parte Pagina 40
Seconda Parte Pagina 41
Seconda Parte Pagina 42
Immagine di memoria di un processore
mercoledì 27 aprile 2022 09:00
Seconda Parte Pagina 43
Seconda Parte Pagina 44
Seconda Parte Pagina 45
Esecuzione dei programmi
martedì 3 maggio 2022 09:00
L'esecuzione di un programma, quindi di ogni istruzione che lo compone, è suddivisa dall'hardware in diverse sotto-operazioni che coinvolgono le varie parti della CPU:
- unità di controllo
- Registri
- unità aritmetico-logica (o ALU)
- interfaccia verso la memoria e l'I/O
Le CPU sono tipicamente organizzate in stadi che sono delegati a portare a termine l'esecuzione delle
sottoparti di un'istruzione, quindi ogni istruzione viene eseguita dalla CPU attivando nella corretta sequenza una serie di stadi di esecuzione.
Gli stadi basati su un'architettura RISC del processore sono:
- Fetch (F): l'istruzione corrente viene prelevata dalla memoria e viene calcolato l'indirizzo dell'istruzione che segue la corrente in memoria;
- Decode (D): viene interpretata l'istruzione, eventuali operandi immediati dell'istruzione vengono letti, così come eventuali registri di input dell'istruzione;
- Execute (E): se richiesto dall'istruzione, l'unità aritmetico-logica esegue un'operazione;
- Memory (M): se richiesto dall'istruzione, la memoria di sistema viene acceduta in lettura o scrittura;
- Write-Back (W): se richiesto dall'istruzione, i registri di output vengono aggiornati.
Storicamente le CPU erano divise, in base alle istruzioni dell'ISA che potevano essere processate, in:
- RISC (Reduced Instruction Set Computer):
- Numero ridotto di istruzioni
- Hardware più semplice
- Frequenze di clock più alte
- Più istruzioni disponibili
- Hardware più complesso => più transistor => più consumo energetico
- Frequenze di clock più basse
- Il calcolo di ciascuno stadio richiede tipicamente qualche centinaio di picosecondi (10-12 sec).
- La sequenza di stadi viene ripetuta per ogni istruzione eseguita.
- Per scandire il tempo e
potrebbe leggermente crescere per via della maggiore complessità dell'hardware con pipelining).
- Si ha un impatto invece sul numero di istruzioni eseguite nell'unità di tempo (throughput), che in condizioni ideali può aumentare di un fattore pari al numero di stadi
- La temporizzazione di una CPU con pipelining assume che ogni stadio richieda un ciclo di clock, con frequenze di clock più alte.
- L'esecuzione sequenziale delle tre istruzioni richiede 15 cicli di clock
- L'esecuzione con pipelining delle tre istruzioni richiede 7 cicli di clock
Seconda Parte Pagina 46
Purtroppo, vi sono varie ragioni (hazard) per cui non è sempre possibile avere una pipeline sempre a regime ("piena") con le istruzioni in esecuzione durante il ciclo designato e ottenere quindi il throughput ideale.
Ci sono vari tipi di hazard:
- Hazard strutturali: due o più istruzioni richiedono di usare simultaneamente lo stesso componente
- Si noti come al ciclo di clock 4 due istruzioni chiedono di accedere contemporaneamente alla memoria: istr1 per leggere un dato, istr4 per prelevare l'istruzione.
- Questo particolare tipo di hazard è in realtà mitigato dalla presenza di memorie tampone (cache) distinte per dati e istruzioni.
- Hazard strutturali possono coinvolgere anche altri componenti (registri, ALU) e possono essere in generale risolti duplicando l'hardware oppure mediante la tecnica dello stallo.
hardware durante lo stesso ciclo di clock come ad esempio la memoria;
Hazard sui dati: vi sono dipendenze fra i dati su cui operano istruzioni differenti come ad esempio un'istruzione che ha come input l'output di quella precedente;
movl $1, %eax movl %eax, %ecx
Si noti che l'istruzione movl %eax, %ecx non può essere eseguita prima che movl $1, %eax abbia ultimato lo stadio di Write-Back:
Questo tipo di hazard viene normalmente risolto dall'hardware, con una pen