Author Topic: Gestione dei processi in Linux - Pt. 1  (Read 1994 times)

Offline CrashTest

Gestione dei processi in Linux - Pt. 1
« on: November 18, 2016, 07:54:43 PM »
Gestione dei processi in Linux

1. Cosa è un processo

Un processo è un programma in esecuzione, viene elaborato da un processore sotto la supervisione del Sistema Operativo. La loro gestione è affidata allo scheduler che tramite algoritmi di scheduling ne pianifica l'esecuzione stabilendo un ordine temporale e privilegiando alcune richieste (che rispettano determinati criteri) stabilendo code di priorità. Questa pratica si chiama politica di scheduling. Non scriverò ulteriormente su questo, magari farò un altro thread parlando dei processi in generale :)


1.2. Creazione di un processo

Ora che abbiamo rivisto cosa è un processo vediamo come questo viene creato.
Gli eventi più comuni,a seconda di quello che sceglie il programmatore o scelte fatte dal sistema operativo, che possono dar luogo ad un processo sono:
  • Inizializzazione del sistema
  • Avvio di nuovi batch
  • Avvio di un nuovo processo da parte dell'utente
Condivisione delle risorse:
  • Padre e figlio condividono tutte le risorse
  • Padre e figlio condividono alcune risorse
  • Padre e figlio non condividono alcuna risorsa
Esecuzione/sincronizzazione:
  • Il padre e figlio procedono in modo concorrente
  • Il padre attende il completamento dell’esecuzione del figlio
1.3. Processi in Linux

Ora che conosciamo le varie modalità di creazione di un processo vediamo come questi funzionano su sistemi Unix/Linux.
Iniziamo col dire che un processo su Linux è caratterizzato dalla sua immagine.

L'immagine di un processo consiste di:

  • Immagine di memoria (virtual address space)
  • valore dei registri (CPU status)
  • tabella dei file (file descriptor table)
  • directory di lavoro
Quando un processo viene creato a questo e? assegnato uno spazio virtuale degli indirizzi (virtual address space). Questo spazio è usato dal processo durante tutta la sua esecuzione.
Le informazioni di sistema relative ad un processo sono invece mantenute in due aree: l' user space e la process table.
L' user space di un processo e? localizzato al termine della parte superiore dell’address space del processo ma, tranne in alcune eccezioni (monitor mode) questo non è accessibile. Contiene:

  • Puntatore al processo nella process table
  • Tabella dei file
  • Directory di lavoro corrente
Ci tengo inoltre a sottolineare che questa area può essere sottoposta a swap.

La process table contiene le principali informazioni mantenute dal sistema operativo rispetto ad ogni processo. È situata nella memoria del kernel del sistema operativo e non puo? essere sottoposta a swap. Ogni ingresso (entry) della tabella contiene:

  • PID del processo
  • PID del processo padre (PPID)
  • ID utente (user ID)
  • Stato
  • Descrittore di evento (ad esempio, un processo in stato di sleeping, indica l’evento per cui il processo e? in attesa)
  • Posizione nella user area
  • Priorita?
Nei sistemi Unix/Linux per vedere le informazioni contenute nella process table e nell' user space è possibile usare il comando: ps.

1.4. Struttura della memoria

Lo spazio di indirizzi virtuale di un processo e? diviso in segmenti, cioe? un insieme di indirizzi virtuali ai quali il processo puo? accedere. Se tenta di accedere in zone di memoria che non gli competono questo processo vai in SegFaul (Segmentation Fault). Solitamente un programma (parlerò di quelli scritti in linguaggio C) viene suddiviso nei seguenti segmenti:
  • Il segmento di testo (text segment). Contiene il codice del programma le funzioni di libreria da esso utilizzate e le costanti. Questo spazio è condiviso fra tutti i processi che eseguono lo stesso programma ed è impostato in sola lettura per evitare sovrascritture che modifichino le istruzioni. Viene allocato dalla funzione exec() all’avvio del programma e resta invariato per tutto il tempo di esecuzione del processo;
  • Il segmento dei dati (data segment). Contiene le variabili globali (cioè quelle definite al di fuori di tutte le funzioni che compongono il programma) e le variabili statiche. Questo segment è diviso a sua volta in due parti: variabili inizializzate e variabili non inizializzate. Non scriverò altro su questo per non allungare troppo il brodo, magari farò un nuovo thread;
  • Lo heap. Qui che avviene l’allocazione dinamica della memoria; puo? essere ridimensionato allocando e deallocando la memoria dinamica con le apposite funzioni malloc(), calloc(), free(), etc. (funzioni che si appoggiano su chiamate di sistema. In realtà è il sistema operativo che alloca la memoria).
  • Lo stack, che contiene, appunto lo stack del programma. Tutte le volte che si effettua una chiamata ad una funzione e? qui che viene salvato l’indirizzo di ritorno ed altre informazioni ausiliare. La funzione chiamata alloca qui lo spazio per le sue variabili locali: grazie a questo spazio le funzioni possono essere chiamate ricorsivamente. Al ritorno dalla funzione, lo spazio e? automaticamente rilasciato e ripulito. La pulizia in C e C++ viene fatta dal chiamante in quanto non sono dotati di garbage collector. La dimensione di questo segmento aumenta seguendo la crescita dello stack del programma, ma non viene ridotta quando quest’ultimo si restringe. Questo potrebbe causare problemi di frammentazione.
Su questo ci sarebbe molto molto altro da dire in quanto al di là di spazi di memoria sono anche strutture dati, magari potremmo discuterne

P.S.: Mi scuso per eventuali errori e differenze tra i caratteri ma con questo editor è molto difficile scrivere un testo formattato. Sto riportando il tutto in un documento LaTex, magari se vi interessa, al termine pubblicherò un pdf.
P.P.S.:Nella prossima parte vedremo le syscall utilizzate per gestire i processi. Attendo commenti per capire se un argomento del genere possa interessare al forum
« Last Edit: November 19, 2016, 09:35:08 AM by CrashTest »
Email: [email protected]
Website: You are not allowed to view links. Register or Login
 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:Gestione dei processi in Linux - Pt. 1
« Reply #1 on: November 19, 2016, 12:02:07 AM »
sisi sono tutti argomenti interessanti per chi non li conosce, popoliamo il forum di contenuti utili come questo, complimenti :)
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

Offline NebulasIT

Re:Gestione dei processi in Linux - Pt. 1
« Reply #2 on: November 19, 2016, 08:48:25 AM »
Si interessa, complimenti  ;D
Website:  You are not allowed to view links. Register or Login
Email: [email protected]
 

Offline lynx

Re:Gestione dei processi in Linux - Pt. 1
« Reply #3 on: November 19, 2016, 11:59:36 AM »
Interessa,
se vuoi finalizzarla su un pdf o simili fai bene a farla controllare anche ad altri.. se no ti tocca fare le release :)
 

Offline CrashTest

Re:Gestione dei processi in Linux - Pt. 1
« Reply #4 on: November 19, 2016, 05:17:54 PM »
You are not allowed to view links. Register or Login
Interessa,
se vuoi finalizzarla su un pdf o simili fai bene a farla controllare anche ad altri.. se no ti tocca fare le release :)
Certo che la farò controllare xD Penso di postarla anche qui non appena arriverà ad un buon punto :D Grazie a tutti
« Last Edit: November 22, 2016, 09:49:37 AM by CrashTest »
Email: [email protected]
Website: You are not allowed to view links. Register or Login
 

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40