Tecnologie
Teoria ed esercitazioni su corso Tecnologie e Progettazione 3° - docente Massimo Cappellano presso ISIS "Andrea Ponti" di Gallarate - massimocappellano72 [at] gmail [dot] com
Last updated
Was this helpful?
Teoria ed esercitazioni su corso Tecnologie e Progettazione 3° - docente Massimo Cappellano presso ISIS "Andrea Ponti" di Gallarate - massimocappellano72 [at] gmail [dot] com
Last updated
Was this helpful?
Quando un programma viene mandato in esecuzione dal S.0., quest'ultimo si occupa di caricare in memoria il nuovo processo, riservando ad esso un proprio spazio di memoria. Questo spazio di memoria virtuale, spiegheremo in seguito perché si dice virtuale, è diviso in diverse zone dette segmenti (segments in inglese): Per ogni processo mandato in esecuzione ci sono i seguenti segmenti:
codice: il codice binario del processo contenete le istruzioni da eseguire (SOLA LETTURA);
dati statici: la zona di memoria dove sono allocate le variabili statiche e globali del programma;
dati dinamici, che si dividono in:
area HEAP per l'allocazione dinamica;
area STACK per la gestione delle chiamate di funzione;
Concentriamoci per ora sullo STACK (PILA in italiano)
Lo stack viene utilizzato all'interno del processo per gestire le chiamate di funzione: ad ogni chiamata di funzione viene aggiunto un activation record sullo stack (elemento della pila) e lo stack viene incrementato di uno. Viceversa quando una funzione ritorna, lo stack viene decremetato.
Esempio con le chiamata ricorsive di calcolo del fattoriale: https://www.programiz.com/c-programming/examples/factorial-recursion
Lo stesso problema poteva essere risolto in modo iterativo: https://www.programiz.com/c-programming/examples/factorial
Nella versione ricorsiva si può vedere meglio la gestione delle chiamate di funzione tramite struttura a STACK:
quando di chiama una funzione, si crea per essa un record di attivazione che piene aggiunto alla cima dello stack;
questo record di attivazione è una zona di memoria che contiene i suoi parametri formali e le sue variabili locali;
quando la funzione termina, il record di attivazione viene cancellato dallo stack, liberando quindi la memoria per successivi record di attivazione.
ALTRA ZONA in cui è divisa la memoria dinamica (oltre allo STACK) è quella dello HEAP dove vengono allocate strutture dati dinamiche come liste o strutture ad albero (funzione malloc
in C per allocare zone di memoria dinamicamente).
per vedere i processi attivi e il rispettivo pid (numero che identifica un processo - process identifier)
Con solo in comando ps
senza opzioni vedete solo i vostri processi.
Utilizzate il comando ps
con le opzioni -f
-e
per vedere tutti i processi attivi sul PC:
Visualizza in output:
Mentre con
mostra i segmenti di memoria del processo con pid <pid>.
Ad esempio per vedere i segmenti di memoria della bash utilizzo il suo pid (in questo caso 3528) quindi:
I moderni S.O. sono multitasking cioè permettono a più processi di essere eseguiti contemporaneamente, quindi più processi sono caricati in memoria, ognuno di essi, avendo il proprio spazio di memoria indipendente. Per il singolo processo lo spazio di indirizzamento inizia da 0, è il sistema operativo che permette questo.
Per gestire il multitasking il S.O. permette quindi ai processi di condividere:
CPU;
spazio memoria - come ora accennato;
accesso alle periferiche;
Lo scopo del corso è vedere come fa il S.O. e le strutture dati dei moderni sistemi operativi.