Discussione Ufficiale Debian Ubuntu Processi *nix like: cosa sono, e come funzionano.

Una Discussione Ufficiale punta a raccogliere tutte le informazioni su un argomento o un fatto di attualità, con costanti aggiornamenti da parte del creatore e dei partecipanti.

haxo

Helper
8 Maggio 2020
389
31
263
265
Nel mondo dei sistemi operativi UNIX (*nix like), la gestione dei processi è un aspetto fondamentale. Oggi vedremo come questi sistemi avviano, gestiscono e fanno comunicare i processi tra loro. Dalla creazione di nuovi processi con la fork(), al destino dei processi orfani e zombie, fino alla comunicazione tramite pipe.




1    Come funzionano


I sistemi operativi Windows e quelli basati su UNIX/Linux adottano approcci distinti per la gestione dei processi. Nel contesto di Windows, quando si avvia un nuovo processo, viene specificato il file eseguibile. Questo nuovo processo di solito è separato da quello che lo ha chiamato. D'altra parte, nei sistemi UNIX/Linux, l'inizio di un nuovo processo avviene attraverso la funzione fork(). Questo metodo comporta la duplicazione del processo corrente, creando così un nuovo processo. In particolare, in Linux e in altre varianti di UNIX-like, ogni processo può generare ulteriori processi noti come processi figli. Questo meccanismo organizza i processi del sistema in una struttura gerarchica, in cui ogni processo, tranne quello di partenza chiamato init, ha un padre e zero o più figli.



1.1    Come lavorano


Nei sistemi *nix like i processi:

1. lavorano sullo stesso codice
2. i dati del padre vengono duplicati



La funzione fork() restituisce un numero intero, che:

1) Uguale a 0 indica il processo
2 ) Maggiore di 0 indica processo padre
3) Minore di 0 significa che qualcosa è andato storto



1711797165549.png



2    Attesa di un processo


Caso 1: Quando il processo padre termina prima del processo figlio, si verifica una situazione in cui il processo figlio rimane senza genitore, diventando quindi un "orfano". In questa circostanza, il processo orfano viene adottato dal processo init, che è il genitore predefinito di tutti i processi nel sistema operativo. Questa è una situazione comune nei programmi noti come "demoni", che restano attivi in memoria ma perdono il collegamento con il genitore che li ha avviati.

Caso 2: Quando il processo figlio termina, ma il processo padre non ne rileva il termine, il figlio rimane in uno stato noto come "zombie". Questo stato persiste finché il padre non rileva la terminazione del figlio o fino a quando il padre stesso termina. Quando il padre termina, il processo zombie viene ereditato dal processo init, che quindi rileva e gestisce la sua terminazione.

Per eliminare un processo zombie, è necessario eliminare il suo processo padre inviando un segnale di tipo "kill". In questo modo, il processo zombie diventa un processo orfano, che viene quindi adottato da init e gestito correttamente.


1711797188705.png



3    Comunicazione fra processi


Ogni processo opera all'interno di uno spazio di indirizzamento completamente locale e non condiviso, caratterizzando così un modello di interazione noto come "Ambiente Locale".

Le pipe rappresentano una delle forme più antiche di comunicazione tra processi nei sistemi UNIX. Il termine "pipe" deriva dall'inglese "pipeline", che tra i suoi significati include anche quello di "tubatura". In campo informatico, una pipe è un flusso di dati che collega due processi, sia che siano strettamente correlati sia che non abbiano una radice comune. Questo implica che l'output prodotto da un programma diventi l'input per un altro programma.

Le pipe consentono l'invio di dati da un'estremità e la ricezione dall'altra. Inoltre, costituiscono un meccanismo di sincronizzazione tra il processo produttore e quello consumatore. Ad esempio:

1) Un processo che legge da una pipe si bloccherà se la pipe è vuota.
2) Un processo che scrive su una pipe si bloccherà se la pipe è piena.


Nella sintassi, il carattere utilizzato è la barra verticale: "|", comunemente nota come "pipe". Questa barra verticale viene inserita tra le invocazioni di due o più programmi per informare la shell che l'output del programma precedente deve essere instradato come input per il programma successivo, utilizzando una pipe.


Codice:
Comando-1 | Comando-2 | ...| Comando-N
 
  • Mi piace
Reazioni: DjCanigia