Slide di Informatica sui processi nei sistemi operativi. Il Pdf esplora l'allocazione della memoria, distinguendo tra stack e heap, e introduce la gestione dei processi come monotasking e multitasking, con focus su context switch e time sharing, essenziali per l'Università.
See more44 Pages


Unlock the full PDF for free
Sign up to get full access to the document and start transforming it with AI.
I processiIntroduzione e ripasso
Il sistema operativo (SO) è un software di base i cui compiti principali sono:
Il kernel è il nucleo del sistema operativo e include tutte le funzionalità di gestione dell'hardware (CPU, memoria e periferiche). Idealmente il kernel "avvolge" tutte le risorse hardware del calcolatore: i programmi applicativi possono accedere all'hardware esclusivamente passando per il kernel, tramite le chiamate di sistema (system call).
Le chiamate di sistema sono di fatto funzioni messe a disposizione dal kernel per il programmatore.
Un programma, ad esempio, usa delle chiamate di sistema quando utilizza dispositivi di input/output o interagisce col disco per leggere/scrivere file.
Ad esempio in C++ cin e cout fanno uso di chiamate di sistema per le operazioni di input/output.
Anche l'utente può interagire direttamente con il sistema operativo, tramite l'interfaccia utente. Esistono due tipi di interfacce utente:
Domande per il pubblico sul kernel
Process Name User Resident Memory Shared Memory % CPU CPU Time ID Priority chrome -- type=renderer -- crashpad-handler-p andrea 195,7 MB 121,9 MB 0,00 5:49.48 3859 Normal cinnamon andrea 264,0 MB 136,7 MB 0,54 3:40.66 1677 Normal firefox-bin andrea 696,4 MB 270,6 MB 0,00 3:36.55 3071 Normal chrome -- type=gpu-process -- crashpad-hand andrea 197,5 MB 117,3 MB 0,00 3:07.83 3549 Normal Isolated Web Co andrea 297,5 MB 138,6 MB 0,04 1:30.33 3311 Normal Isolated Web Co andrea 218,3 MB 115,9 MB 0,00 1:22.14 3359 Normal chrome andrea 435,2 MB 308,2 MB 0,00 1:05.39 3502 Normal chrome -- type=renderer -- crashpad-handler-p andrea 329,1 MB 134,5 MB 0,00 0:53.63 3896 Normal gnome-system-monitor andrea 71,4 MB 46,6 MB 0,21 0:45.74 6617 Normal pipewire andrea 19,3 MB 9,6 MB 0,00 0:25.73 1354 Very High pipewire-pulse andrea 34,3 MB 10,1 MB 0,00 0:24.07 1358 Very High 0 chrome -- type=utility -utility-sub-type=netwc andrea 196,5 MB 150,2 MB 0,00 0:17.58 3550 Normal mintreport-tray andrea 52,0 MB 32,8 MB 0,00 0:17.44 2919 Normal Web Content andrea 217,2 MB 116,8 MB 0,00 0:10.75 3367 Normal 0 chrome -- type=renderer -- crashpad-handler-p andrea 244,7 MB 129,8 MB 0,00 0:08.39 7718 Normal blueman-tray andrea 42,1 MB 27,1 MB 0,00 0:07.63 2195 Normal
Quando un processo viene lanciato, il SO gli assegna un'area di memoria RAM che verrà usata durante l'esecuzione per memorizzare il codice e i I dati del processo dati del processo. Codice Data (variabili globali) Heap (variabili allocate dinamicamente durante l'esecuzione) Spazio libero Stack (variabili locali, parametri funzioni, etc.)
const int PI_GRECO = 3.14; float perimetro_circonferenza (float r) { return 2 * r * PI_GRECO ; } int main() { int raggio, perimetro; cin >> raggio; cout << "Il perimetro della circonferenza è " << perimetro_circonferenza ( raggio) ; }
Viene massimizzato il tempo di utilizzo della CPU: infatti se un processo è in attesa di un evento esterno (ad esempio in attesa di un evento input/output, di una lettura/scrittura di file, etc.) è possibile assegnare la CPU ad un altro processo.
Il prezzo da pagare per questo vantaggio è il tempo per svolgere il cambio di contesto, che generalmente dura circa 1 millisecondo.
Per cambio di contesto (context switch) si intende l'insieme di operazioni tramite le quali il sistema operativo passa dall'esecuzione di un processo all'esecuzione di un altro processo.
Il modulo del SO che realizza il cambio di contesto è detto dispatcher.
Durante il cambio di contesto, la CPU è impegnata in queste operazioni e non può eseguire i processi: se i cambi di contesto sono molto frequenti possono essere fonte di overhead, quindi di un uso inefficiente della CPU. Perciò è importante minimizzare i cambi di contesto.
Il time sharing è una tecnica utilizzata dai sistemi operativi multitasking al fine di minimizzare i tempi di risposta per l'utente (interattività), dando all'utente l'illusione che i processi siano eseguiti in parallelo (anche in presenza di una sola CPU).
Consiste nell'assegnare a ogni processo, a turno, la CPU per una certa quantità di tempo, detto quanto di tempo, tipicamente tra i 10 e i 100 millisecondi.
New Terminated Assegnazione CPU Ready Running Revoca CPU (terminato il quanto di tempo) Attesa di un evento Evento avvenuto Waiting
Il Process Control Block (PCB) contiene tutte le informazioni utili al SO per gestire un determinato processo:
Lo scheduler della CPU il componente del SO che sceglie a quale tra i processi in stato di ready (che sono memorizzati nella ready list) assegnare l'uso della CPU.
La scelta del prossimo processo al quale assegnare la CPU dipende dalle politiche di scheduling adottate dal sistema operativo.
In generale, gli obiettivi principali delle politiche di scheduling sono:
Quali criteri sono più importanti?
I processi sono inseriti nella ready list seguendo un approccio FIFO (First In First Out). Lo scheduler assegna la CPU ai processi secondo l'ordine di arrivo.
Esempio: Simuliamo l'assegnazione della CPU a 3 processi Pa, Pb, Pc.
Pa Pb Pc t 0 32 36 43 T attesa medio =(0 + 32 + 36)/3 = 22,7
Il principale difetto di questo algoritmo sono gli alti tempi di attesa: se processi di breve durata vengono inseriti nella coda dopo processi di lunga durata, i primi dovranno attendere molto prima di poter vedersi assegnata la CPU. Esattamente il caso di Pb e Pc nella slide precedente.
Per ridurre i tempi di attesa medi rispetto all'algoritmo FCFS: per ogni processo nella ready list, viene stimato il tempo di utilizzo della CPU e lo scheduler assegna la CPU a quello che la occuperà per meno tempo.
Pb Pc Pa t 0 4 11 43