Les jobs sous windows
Posted: Sun Jan 18, 2026 8:18 pm
# Les Job Objects sous Windows
Aujourd’hui nous allons voir un mécanisme avancé mais fondamental du dev système :
**les Job Objects**.
Beaucoup de développeurs utilisent CreateProcess sans jamais vraiment contrôler ce que deviennent les processus enfants.
Les Job Objects existent précisément pour ça.
Ici on va voir **ce qu’est un Job Object**, comment Windows les gère, et comment les utiliser proprement en Win32.
---
# 1) C’est quoi un Job Object
Un **Job Object** est un conteneur noyau de **processus**.
Il permet de :
* regrouper plusieurs processus
* appliquer des règles globales
* limiter les ressources
* contrôler la durée de vie
* tuer tout un groupe proprement
Un Job Object :
* ne contient **PAS** de threads
* ne s’applique **PAS** à la mémoire globale du système
* agit uniquement sur les processus qui lui sont assignés
---
# 2) À quoi sert un Job Object
Sans Job Object :
* chaque processus est indépendant
* aucun contrôle global
* nettoyage manuel compliqué
Avec Job Object :
* contrôle centralisé
* confinement simple
* supervision
* nettoyage automatique
C’est très utilisé par :
* navigateurs
* services Windows
* sandbox
* antivirus
* outils de test
---
# 3) Créer un Job Object
Pour créer un Job Object :
À savoir :
* le nom est optionnel
* retourne un handle noyau
* le job est vide au départ
---
# 4) Un Job Object ne fait rien tout seul
Créer un Job Object **ne change rien**.
Un Job Object devient actif uniquement quand **un processus y est assigné**.
Sans processus assigné :
* aucune limite
* aucun contrôle
* aucun effet
---
# 5) Assigner un processus à un Job
Pour assigner un processus :
Important :
* le processus doit avoir les bons droits
* un processus ne peut appartenir qu’à **un seul job**
* une fois assigné, il ne peut plus en sortir
---
# 6) Définir des limites sur un Job
La structure de base est :
**JOBOBJECT_BASIC_LIMIT_INFORMATION**
Quelques flags importants :
* JOB_OBJECT_LIMIT_ACTIVE_PROCESS
* JOB_OBJECT_LIMIT_PROCESS_TIME
* JOB_OBJECT_LIMIT_JOB_TIME
* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
* JOB_OBJECT_LIMIT_WORKINGSET
---
# 7) Appliquer les limites au Job
Les limites sont appliquées avec :
Bonne pratique :
* configurer le job
* puis assigner les processus
---
# 8) Limiter la mémoire d’un processus
Pour la mémoire, on utilise :
**JOBOBJECT_EXTENDED_LIMIT_INFORMATION**
Puis :
---
# 9) Tuer tous les processus automatiquement
Le flag le plus important :
Effet :
* quand le handle du job est fermé
* tous les processus du job sont terminés
Avantages :
* pas de fuite
* pas de zombie
* cleanup garanti
---
# 10) Exemple complet minimal
---
# 11) Surveiller un Job Object
Pour interroger un job :
Cela permet d’obtenir :
* nombre de processus actifs
* consommation CPU
* consommation mémoire
* violations de limites
---
# 12) Job Object et hiérarchie
Sous Windows :
* un job n’est pas un parent
* un job n’est pas une hiérarchie
* c’est un lien de contrôle
Tout est explicite.
---
# 13) Erreurs classiques
* confondre job et thread
* essayer d’assigner un thread
* oublier KILL_ON_JOB_CLOSE
* fermer le job trop tôt
* penser qu’un processus peut changer de job
---
# À retenir
Un Job Object est un conteneur de processus.
Il permet de contrôler ressources et durée de vie.
Il ne gère jamais les threads.
Un processus ne peut appartenir qu’à un seul job.
KILL_ON_JOB_CLOSE est essentiel.
Comprendre les Job Objects, c’est comprendre comment Windows gère des groupes de processus.
Aujourd’hui nous allons voir un mécanisme avancé mais fondamental du dev système :
**les Job Objects**.
Beaucoup de développeurs utilisent CreateProcess sans jamais vraiment contrôler ce que deviennent les processus enfants.
Les Job Objects existent précisément pour ça.
Ici on va voir **ce qu’est un Job Object**, comment Windows les gère, et comment les utiliser proprement en Win32.
---
# 1) C’est quoi un Job Object
Un **Job Object** est un conteneur noyau de **processus**.
Il permet de :
* regrouper plusieurs processus
* appliquer des règles globales
* limiter les ressources
* contrôler la durée de vie
* tuer tout un groupe proprement
Un Job Object :
* ne contient **PAS** de threads
* ne s’applique **PAS** à la mémoire globale du système
* agit uniquement sur les processus qui lui sont assignés
---
# 2) À quoi sert un Job Object
Sans Job Object :
* chaque processus est indépendant
* aucun contrôle global
* nettoyage manuel compliqué
Avec Job Object :
* contrôle centralisé
* confinement simple
* supervision
* nettoyage automatique
C’est très utilisé par :
* navigateurs
* services Windows
* sandbox
* antivirus
* outils de test
---
# 3) Créer un Job Object
Pour créer un Job Object :
Code: Select all
HANDLE hJob = CreateJobObjectW(NULL, L"MyJob");
* le nom est optionnel
* retourne un handle noyau
* le job est vide au départ
---
# 4) Un Job Object ne fait rien tout seul
Créer un Job Object **ne change rien**.
Un Job Object devient actif uniquement quand **un processus y est assigné**.
Sans processus assigné :
* aucune limite
* aucun contrôle
* aucun effet
---
# 5) Assigner un processus à un Job
Pour assigner un processus :
Code: Select all
AssignProcessToJobObject(hJob, hProcess);
* le processus doit avoir les bons droits
* un processus ne peut appartenir qu’à **un seul job**
* une fois assigné, il ne peut plus en sortir
---
# 6) Définir des limites sur un Job
La structure de base est :
**JOBOBJECT_BASIC_LIMIT_INFORMATION**
Code: Select all
JOBOBJECT_BASIC_LIMIT_INFORMATION info = {0};
info.LimitFlags = JOB_OBJECT_LIMIT_ACTIVE_PROCESS;
info.ActiveProcessLimit = 2;
* JOB_OBJECT_LIMIT_ACTIVE_PROCESS
* JOB_OBJECT_LIMIT_PROCESS_TIME
* JOB_OBJECT_LIMIT_JOB_TIME
* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
* JOB_OBJECT_LIMIT_WORKINGSET
---
# 7) Appliquer les limites au Job
Les limites sont appliquées avec :
Code: Select all
SetInformationJobObject(
hJob,
JobObjectBasicLimitInformation,
&info,
sizeof(info)
);
* configurer le job
* puis assigner les processus
---
# 8) Limiter la mémoire d’un processus
Pour la mémoire, on utilise :
**JOBOBJECT_EXTENDED_LIMIT_INFORMATION**
Code: Select all
JOBOBJECT_EXTENDED_LIMIT_INFORMATION ext = {0};
ext.BasicLimitInformation.LimitFlags =
JOB_OBJECT_LIMIT_PROCESS_MEMORY |
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
ext.ProcessMemoryLimit = 50 * 1024 * 1024;
Code: Select all
SetInformationJobObject(
hJob,
JobObjectExtendedLimitInformation,
&ext,
sizeof(ext)
);
# 9) Tuer tous les processus automatiquement
Le flag le plus important :
Code: Select all
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
* quand le handle du job est fermé
* tous les processus du job sont terminés
Avantages :
* pas de fuite
* pas de zombie
* cleanup garanti
---
# 10) Exemple complet minimal
Code: Select all
STARTUPINFOW si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
CreateProcessW(
L"C:\Windows\System32\notepad.exe",
NULL,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi
);
HANDLE hJob = CreateJobObjectW(NULL, NULL);
JOBOBJECT_BASIC_LIMIT_INFORMATION info = {0};
info.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
SetInformationJobObject(
hJob,
JobObjectBasicLimitInformation,
&info,
sizeof(info)
);
AssignProcessToJobObject(hJob, pi.hProcess);
ResumeThread(pi.hThread);
# 11) Surveiller un Job Object
Pour interroger un job :
Code: Select all
QueryInformationJobObject(...);
* nombre de processus actifs
* consommation CPU
* consommation mémoire
* violations de limites
---
# 12) Job Object et hiérarchie
Sous Windows :
* un job n’est pas un parent
* un job n’est pas une hiérarchie
* c’est un lien de contrôle
Tout est explicite.
---
# 13) Erreurs classiques
* confondre job et thread
* essayer d’assigner un thread
* oublier KILL_ON_JOB_CLOSE
* fermer le job trop tôt
* penser qu’un processus peut changer de job
---
# À retenir
Un Job Object est un conteneur de processus.
Il permet de contrôler ressources et durée de vie.
Il ne gère jamais les threads.
Un processus ne peut appartenir qu’à un seul job.
KILL_ON_JOB_CLOSE est essentiel.
Comprendre les Job Objects, c’est comprendre comment Windows gère des groupes de processus.