Processi e Memoria

Gestione della Memoria

La RAM è gestita in due modalità diverse e separate.

Memoria

  • sys - contiene tutte le strutture di sistema, incluso il kernel e i suoi processi, le tabelle del kernel, i protocolli di rete, i device drivers, ecc.
  • usr - contiene i processi uente, i buffers di I/O dei processi utente, le cache, ecc.

Le due regioni non sono necessariamente contigue.

L'unico modo che gli elementi in system mode e in user mode hanno per comunicare tra loro sono le system calls.

La Memoria Virtuale

E' la memoria indirizzabile da un registro della CPU. Con 64 bit, gli indirizzi di memoria virtuale vanno da 0 a 2^64-1 (solitamente espressi in esadecimale per convenienza).

Segmenti

Lamemoria virtuale è suddivisa in regioni:

  • text - per il codice eseguibile dei programmi o librerie
  • data - per i dati statici, allocati durante la compilazione dei programmi
  • stack - per gli stack frames dei programmi; ogni funzione o blocco di codice si vede allocato uno stack frame
  • heap - per i dati allocati dinamicamente dai programmi a runtime

All'atto del caricamento (da parte del linker-loader), ogni eseguibile si vede allocato un certo numero di segmenti nelle varie regioni in memoria virtuale. Gli indirizzi dei segmenti di un eseguibile non sono in collisione con i segmenti di un altro eseguibile, tranne in due casi:

  • segmenti condivisi - shared memory per la comunicazione volontaria tra loro
  • librerie condivise - shared objects linkati dinamicamente. Le libreria dinamiche sono visibili allo stesso indirizzo in memoria virtuale di tutti i programmi che le hanno linkate.

L'insieme di tutti i segmenti di un processo è la memory map del processo.

A runtime, un processo non può accedere ad altri che i suoi segmenti o quelli condivisi. Il tentativo di farlo produrrebbe una condizione detta Segment Violation e la terminazione immediata del processo colpevole.

In particolare l'indirizzo zero di memoria virtuale non è mai nella mappa di nessun processo, così l'uso di un puntatore non inizializzato produce un segment violation.

A runtime, non vi è spazio, nella RAM fisica, per tutti i segmenti di tutti i processi in esecuzione. Vengono instanziati in RAM solo un certo numero di pagine (estensioni di 4 KB l'una) dei segmenti in uso in quel momento dal processo. Il meccanismo si chiama Demend Paging ed è gestito dal processo del kernel detto Memory Mapping Unit.

La dimensione in memoria virtuale dell'intera mappa di un processo si chiama VSZ (Virtual Size). La somma totale di occupazione RAM da parte di tutti i segmenti di un processo in un determinato istante si chiama RSS (Resident Set Size).

Evidentemente: VSZ >= RSS.

Solo i processi in user mode 'giocano' a Memoria Virtuale. I processi del Kernel, che sono in system mode sono sempre residenti in RAM. I processi del kernel non hanno VSZ e RSS.

Tabella dei processi

Il kernel mantiene una Process Table di tutti i processi attivi al momento. Ogni processo è decritto da un record (slot in gergo) di questa tabella. La chiave è il PID. I campi notevoli sono:

  • PID - Process IDentifier - numero intero univoco allocato al processo al suo caricamento
  • PPID - Parent PID - identificativo del processo che ha lanciato il processo corrente (Italiano: processo padre)
  • utente e gruppo possessori - con i cui permessi opera il processo
  • puntatore alla u_area - da cui reperire tutte le altre informazioni sul processo

tabella Processi

Ogni PID ha un PPID (un figlio ha sempre un padre), ma ogni PPID può avere più PID figli. L'intero insieme di processi in un determinato istante è stato generato al boot di sistema tramite vari files di configurazione, a partire dal primo processo utente, col PID numero 1, che è stato lanciato dal kernel stesso.

Il processo capostipite si chiamava init in Unix e nelle (non così) vecchie versioni di Linux, e si chiama systemd nelle ultime versioni di Linux.

Il comando 'ps'

Process Status (ps) permette di vedere le informazioni relative ai processi attivi.

Nota:

Il trattino indicativo di opzione è stato introdotto in Unix System V. Berkeley Unix non aveva questa convenzione; le opzioni (allora dette flags) esistevano comunque però, ma erano singole lettere senza trattino davanti.

Linux ha il comando ps che viene con un insieme di opzioni col trattino - e producono un output stile System V, e quelle senza trattino, che producono un output stile Berkeley.

Gli insiemi di opzioni sono completamente diversi e producono output diversi, anche se un paio (purtroppo) si assomigliano.

Dato che il kernel di Linux è molto più vicino come parentela a Berkeley che non a System V, sono da preferirsi le opzioni senza trattino.


Le opzioni principali di ps sono:

  • ps - Processi locali dell'utente
  • ps w - Formato 'largo' - più informazioni, incluso vettore di lancio completo
  • ps l - Formato 'lungo' – informazioni architettoniche
  • ps a - Tutti i processi associati a terminale – anche di altri utenti
  • ps ax - Anche i processi senza terminale di controllo
  • ps wax - Rapporto completo largo
  • ps lax - Rapporto completo lungo

Quest'ultimo produce praticamente tutte le informazioni disponibili su tutti i processi di sistema.

Terminale di controllo

Ogni procwsso che è stato eseguito poichè qualcuno ha digitato un comando da un terminale, ha quello come Terminale di Controllo.

Non è tanto il dare Ctrl-C o Ctrl-Z o altri tasti che contraddistinguono il terminale di controllo.

La verà proprietà è che al venir meno del terminale di controllo tutti i suoi processi sono terminati d'ufficio.

Ai bei tempi gli utenti si collegavano alla Unix Box del centro di calcolo tramite linee telefoniche insicure. Durante il collegamento avevano consumi RAM, disco e CPU, che gli venivano fatturati a fine mese. Se per caduta del collegamento telefonico, SIP o altri, il programma avesse continuato a girare, sarebbe stato un costo, e inoltre l'utente non avrebbe più visto l'output.

Vi sono innumerevoli processi utente che non hanno terminale di controllo, poichè non sono stati lanciati manualmente, ma tramite files di configurazione dai processi di boot. Per esempio i database server, i server di comunicazione, e tutti gli altri servizi.

Questi processi si chiamano demoni e NON sono processi di sistema, poichè comunque lavorano in user mode.

Un altro punto di terminologia. I demoni e i servizi non coincidono, solo al limite per i servizi più semplici. Normalmente un servizio è implementato da un certo numero di demoni cooperanti,cioè raccolti in un Cgroup.

L'organizzazione dei servizi Linux è completamente differente da Windows. In Windows (fino a 10), alcune cose di Linux come i containers, semplicemente non si possono fare perchè manca il supporto architettonico.