Processi annidati
Un'applicazione può usare processi annidati per gestire subset di processi. I processi annidati consentono anche a un'applicazione che usa processi per ospitare altre applicazioni che usano anche processi.
Windows 7, Windows Server 2008 R2, Windows XP con SP3, Windows Server 2008, Windows Vista e Windows Server 2003: Un processo può essere associato a un solo processo. I processi annidati sono stati introdotti in Windows 8 e Windows Server 2012.
In questo argomento viene fornita una panoramica dell'annidamento e del comportamento dei processi annidati:
- Gerarchie di processi annidati
- Creazione di una gerarchia di processi annidata
- Limiti e notifiche dei processi annidati
- Contabilità delle risorse per i processi annidati
- Terminazione dei processi annidati
Per informazioni generali sui processi e sugli oggetti processo, vedere Oggetti processo.
Gerarchie di processi annidati
I processi annidati hanno una relazione padre-figlio in cui ogni processo figlio contiene un subset dei processi nel processo padre. Se un processo già presente in un processo viene aggiunto a un altro processo, i processi vengono annidati per impostazione predefinita se il sistema può formare una gerarchia di processi valida e nessuno dei due processi imposta limiti dell'interfaccia utente (SetInformationJobObject con JobObjectBasicUIRestrictions).
La figura 1 mostra una gerarchia di processi che contiene un albero di processi etichettati da P0 a P7. Il processo 1 è il processo padre di Job 2 e Job 4 ed è un predecessore di Job 3. Il processo 2 è l'elemento padre immediato del processo 3; Il processo 3 è il figlio immediato del processo 2. I processi 1, 2 e 3 formano una catena di processi in cui i processi 1 e 2 sono la catena di processi padre di Job 3. Il processo finale in una catena di processi è il processo immediato dei processi in tale processo. Nella figura 1, il processo 3 è il processo immediato dei processi P2, P3 e P4.
I processi annidati possono essere usati anche per gestire gruppi di processi peer. Nella gerarchia dei processi illustrata nella figura 2, Job 1 è il processo padre di Job 2. Si noti che una gerarchia di processi può contenere solo parte di un albero di processi. Nella figura 2 P0 non si trova nella gerarchia, ma i processi figlio da P1 a P5 sono.
Creazione di una gerarchia di processi annidata
I processi in una gerarchia di processi sono associati in modo esplicito a un oggetto processo usando la funzione AssignProcessToJobObject o associati in modo implicito durante la creazione del processo, come per i processi autonomi. L'ordine in cui vengono creati i processi e i processi vengono assegnati determina se è possibile creare una gerarchia.
Per compilare una gerarchia di processi usando l'associazione esplicita, tutti gli oggetti processo devono essere creati usando CreateJobObject, quindi AssignProcessToJobObject deve essere chiamato più volte per ogni processo per associare il processo a ogni processo a cui deve appartenere. Per assicurarsi che la gerarchia di processi sia valida, assegnare prima tutti i processi al processo nella radice della gerarchia, quindi assegnare un subset di processi all'oggetto processo figlio immediato e così via. Se i processi vengono assegnati ai processi in questo ordine, un processo figlio avrà sempre un subset di processi nel processo padre durante la creazione della gerarchia, necessaria per l'annidamento. Se i processi vengono assegnati a processi in ordine casuale, a un certo punto un processo figlio avrà processi che non sono nel processo padre. Ciò non è consentito annidando e causerà l'esito negativo di AssignProcessToJobObject .
Quando i processi vengono associati in modo implicito a un processo durante la creazione del processo, un processo figlio viene associato a ogni processo nella catena di processi del processo padre. Se l'oggetto processo immediato consente l'interruzione, il processo figlio si interrompe dall'oggetto processo immediato e da ogni processo nella catena di processi padre, spostandosi verso l'alto nella gerarchia finché non raggiunge un processo che non consente l'interruzione. Se l'oggetto processo immediato non consente l'interruzione, il processo figlio non si interrompe anche se i processi nella catena di processi padre lo consentono.
Limiti e notifiche dei processi annidati
Per determinati limiti di risorse, il limite impostato per i processi in una catena di processi padre determina il limite effettivo applicato per un processo figlio. Il limite effettivo per il processo figlio può essere più restrittivo rispetto al limite del padre, ma non può essere meno restrittivo. Ad esempio, se la classe di priorità di un processo figlio è ABOVE_NORMAL_PRIORITY_CLASS e la classe di priorità del processo padre è NORMAL_PRIORITY_CLASS, il limite effettivo per i processi nel processo figlio è NORMAL_PRIORITY_CLASS. Tuttavia, se la classe di priorità del processo figlio è BELOW_NORMAL_PRIORITY_CLASS, il limite effettivo per i processi nel processo figlio è BELOW_NORMAL_PRIORITY_CLASS. I limiti effettivi vengono applicati per la classe di priorità, l'affinità, l'addebito di commit, il limite di tempo di esecuzione per processo, il limite di classi di pianificazione e il working set minimo e massimo. Per altre informazioni sui limiti specifici delle risorse, vedere SetInformationJobObject.
Quando si verificano determinati eventi, ad esempio la creazione di un nuovo processo o la violazione del limite di risorse, viene inviato un messaggio alla porta di completamento di I/O associata a un processo. Un processo può anche registrarsi per ricevere notifiche quando vengono superati determinati limiti. Per un processo non annidato, il messaggio viene inviato alla porta di completamento di I/O associata al processo. Per un processo annidato, il messaggio viene inviato a ogni porta di completamento di I/O associata a qualsiasi processo nella catena di processi padre del processo che ha attivato il messaggio. Un processo figlio non deve avere una porta di completamento I/O associata per i messaggi che attiva l'invio alle porte di completamento I/O dei processi padre superiori nella catena di processi. Per altre informazioni sui messaggi specifici, vedere JOBOBJECT_ASSOCIATE_COMPLETION_PORT.
Contabilità delle risorse per i processi annidati
Le informazioni di contabilità delle risorse per un processo annidato descrivono l'utilizzo di ogni processo associato a tale processo, inclusi i processi nei processi figlio. Ogni processo in una catena di processi rappresenta quindi le risorse aggregate usate dai propri processi e i processi di ogni processo figlio sottostante nella catena di processi.
Terminazione dei processi annidati
Quando un processo in una gerarchia di processi viene terminato, il sistema termina i processi in tale processo e tutti i processi figlio, a partire dal processo figlio nella parte inferiore della gerarchia. Le risorse in attesa usate da ogni processo terminato vengono addebitate al processo padre.
L'handle del processo deve avere il diritto di accesso JOB_OBJECT_TERMINATE, come per i processi autonomi.