💡
tecnologie3
  • Tecnologie
  • Codifica numeri
    • Conversione dei numeri con parte frazionaria
    • Esercizi numeri
  • Numeri interi e linguaggio C
  • La rappresentazione dei simboli alfanumerici
  • Funzione di conversione da alfanumerici a numerici - esempi in C
  • Codifica immagini e unità misura
  • Segnali, dall'analogico al digitale
  • Rappresentazione dei suoni
  • Rappresentazioni delle informazioni complesse
  • Riepilogo codifiche
  • ARCHITETTURA COMPUTER
    • Architettura generale
    • Memoria principale
    • Il processore
    • La memoria secondaria (di massa)
    • Periferiche (dispositivi) e loro controllo/1
    • Periferiche (dispositivi) e loro controllo/2
    • Esempio di Architettura Computer - Macchina von Neumann
    • I concetti chiave
    • Esercizi
  • Sistema Operativo
    • Il sistema operativo
    • Gestione dei processi
    • Gestione della memoria
    • I Gestori di Periferiche
    • Il modello di sicurezza di Unix/Linux
  • Esercitazione gestione processi
  • Esercitazione memoria
    • Svolgimento
    • Progetto calcolatore indirizzi fisici
  • Corso Linux base
    • Lavorare con testo: more, grep
    • Utilizzo pipe
    • Lavorare con il comando find
  • Tecnologie 2
  • Operating Systems: Three Easy Pieces
  • Computing for the Socio-Techno Web
  • Software libero ed istruzione
Powered by GitBook
On this page

Was this helpful?

Tecnologie

Teoria ed esercitazioni su corso Tecnologie e Progettazione 3° - docente Massimo Cappellano presso ISIS "Andrea Ponti" di Gallarate - massimocappellano72 [at] gmail [dot] com

NextCodifica numeri

Last updated 6 months ago

Was this helpful?

Processi

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;

AREA DATI DINAMICI

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.

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

ESERCIZI PER VISUALIZZARE I SEGMENTI DI MEMORIA

> ps

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:

> ps -fe

Visualizza in output:

UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 10:08 ?        00:00:05 /sbin/init splash
root         2     0  0 10:08 ?        00:00:00 [kthreadd]
root         3     2  0 10:08 ?        00:00:00 [kworker/0:0]
root         4     2  0 10:08 ?        00:00:00 [kworker/0:0H]
root         5     2  0 10:08 ?        00:00:00 [kworker/u2:0]
root         6     2  0 10:08 ?        00:00:00 [mm_percpu_wq]
root         7     2  0 10:08 ?        00:00:00 [ksoftirqd/0]
root         8     2  0 10:08 ?        00:00:00 [rcu_sched]
root         9     2  0 10:08 ?        00:00:00 [rcu_bh]
root        10     2  0 10:08 ?        00:00:00 [migration/0]
root        11     2  0 10:08 ?        00:00:00 [watchdog/0]
root        12     2  0 10:08 ?        00:00:00 [cpuhp/0]
root        13     2  0 10:08 ?        00:00:00 [kdevtmpfs]
root        14     2  0 10:08 ?        00:00:00 [netns]
massimo   3528  3518  0 10:13 pts/0    00:00:00 bash
massimo   3581  2906  0 10:13 tty2     00:00:00 zeitgeist-datahub
massimo   3589  2876  0 10:13 ?        00:00:00 /usr/bin/zeitgeist-daemon
massimo   3596  2876  0 10:13 ?        00:00:00 /usr/lib/zeitgeist/zeitgeist/zeitgeist-fts
massimo   3641     1  6 10:14 tty2     00:00:16 /opt/google/chrome/chrome

Mentre con

cat /proc/<pid>/maps

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:

cat /proc/3528/maps

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.

Esempio con le chiamata ricorsive di calcolo del fattoriale:

Lo stesso problema poteva essere risolto in modo iterativo:

https://www.programiz.com/c-programming/examples/factorial-recursion
https://www.programiz.com/c-programming/examples/factorial
469KB
hic3_stack.pdf
pdf
Stack e memory management
Processo in memoria