I processi nei sistemi operativi: allocazione memoria e multitasking

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à.

Mostra di più

44 pagine

I processi
Introduzione e ripasso
2

Visualizza gratis il Pdf completo

Registrati per accedere all’intero documento e trasformarlo con l’AI.

Anteprima

Introduzione e ripasso

I processiIntroduzione e ripasso

Sistema operativo

Il sistema operativo (SO) è un software di base i cui compiti principali sono:

  • gestire le risorse hardware (CPU, memoria, periferiche) che vengono usate dai programmi applicativi;
  • fare da interfaccia tra l'hardware e il software applicativo.

Kernel

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.

System call: esempio

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.

Interfaccia utente

Anche l'utente può interagire direttamente con il sistema operativo, tramite l'interfaccia utente. Esistono due tipi di interfacce utente:

  • Command Line Interface (CLI): interfacce testuali a linea di comando;
  • Graphical User Interface (GUI) , interfacce grafiche con icone, finestre, etc.

Domande sul kernel

Domande per il pubblico sul kernel

Programmi e processi

Definizione di programmi e processi

  • Un programma è un insieme di istruzioni ed è memorizzato sulla memoria di massa (entità statica)
  • Un processo è un programma in esecuzione, quindi presente nella memoria RAM (entità dinamica). Un processo è un'entità attiva, in evoluzione: evolve mentre le sue istruzioni sono eseguite dalla CPU.

Task manager

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

Processo in memoria

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.)

Esempio: aree di salvataggio variabili e costanti

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) ; }

Esempio: variabili e costanti

  • PI GRECO => data
  • le variabili raggio e perimetro della funzione main => stack
  • la variabile r della funzione perimetro circonferenza => stack E heap? In molti linguaggi di programmazione (anche in C++) è possibile allocare strutture dati dinamicamente, cioè creare variabili e array al bisogno e rimuoverli dalla memoria, quando non servono più, durante l'esecuzione del programma.

Multitasking, context switch e time sharing

Monotasking e multitasking

  • I sistemi operativi monotasking consentono l'esecuzione di un solo task (processo) alla volta: mentre un programma è in esecuzione la CPU non può essere usata da altri processi.
  • I sistemi operativi multitasking consentono di gestire l'esecuzione di più task (processi) simultaneamente, anche in presenza di una sola CPU con un solo core: la CPU viene assegnata a turno ai diversi processi in esecuzione.

Vantaggio dei sistemi multitasking

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.

Cambio di contesto

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.

Funzionamento del cambio di contesto

  • Lo stato del processo attualmente in esecuzione (Program Counter, registri della CPU) viene salvato in RAM (nel suo PCB, vedremo dopo): in questo modo quando a questo processo verrà riassegnata la CPU potrà ripartire esattamente da dove si era fermato;
  • Lo stato del processo a cui è stata assegnata la CPU viene caricata dal suo PCB alla CPU (per inizializzare i registri), per preparare la CPU all'esecuzione del secondo processo.

Cambio di contesto e overhead

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.

Time sharing

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.

Trade-off del time sharing

  • se il quanto di tempo scelto è troppo breve, il sistema è meno efficiente perché si impegna molto la CPU per i cambi di contesto
  • se il quanto è troppo lungo, in presenza di numerosi processi essi dovranno attendere di più per avere a disposizione la CPU: in sistemi interattivi questo può essere deleterio per gli utenti aumentando i tempi di risposta.

Stato dei processi e PCB

Stato dei processi

New Terminated Assegnazione CPU Ready Running Revoca CPU (terminato il quanto di tempo) Attesa di un evento Evento avvenuto Waiting

Descrizione degli stati dei processi

  • New (nuovo): il processo viene creato (ad esempio quando l'utente avvia l'applicazione)
  • Ready (pronto): il processo è pronto per l'esecuzione ed è in attesa della CPU
  • Running (esecuzione): il processo è in esecuzione e sta utilizzando la CPU
  • Waiting (sospeso): il processo è in attesa che si verifichi un evento (ad esempio in attesa di una risorsa hardware, input dell'utente, etc.)
  • Terminated (terminato): il processo ha terminato l'esecuzione e il sistema operativo può rilasciare le risorse che il processo utilizzava

Process Control Block (PCB)

Il Process Control Block (PCB) contiene tutte le informazioni utili al SO per gestire un determinato processo:

  • ID del processo (PID)
  • stato del processo (ready, waiting, etc.)
  • program counter (contiene l'indirizzo della prossima istruzione da eseguire)
  • registri
  • puntatori alla memoria del processo
  • eventuali altre informazioni quali priorità, lista dei file aperti, tempo CPU, etc.

Scheduler della CPU

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.

Criteri di scheduling

In generale, gli obiettivi principali delle politiche di scheduling sono:

  • massimizzare l'utilizzo della CPU (minimizzando i cambi di contesto)
  • massimizzare il numero di processi completati per unità di tempo (throughput)
  • minimizzare i tempi di risposta delle richieste dell'utente (latenza)
  • minimizzare il tempo totale trascorso nella ready list (tempo di attesa)
  • minimizzare l'intervallo di tempo tra la creazione del task e il suo completamento (turnaround o tempo di completamento)

Criteri di scheduling: importanza

Quali criteri sono più importanti?

Algoritmi di scheduling

  • First-Come-First-Served (FCFS)
  • Shortest Job First (SJF)
  • Round Robin
  • Scheduling con priorità Gli scheduler dei moderni sistemi operativi generalmente combinano diversi approcci, compensando i limiti di ognuno di questi algoritmi.

First-Come-First-Served (FCFS)

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

First-Come-First-Served (FCFS): limiti

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.

Shortest Job First (SJF)

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

Non hai trovato quello che cercavi?

Esplora altri argomenti nella Algor library o crea direttamente i tuoi materiali con l’AI.