Taakobjecten
Met een taakobject kunnen groepen processen als een eenheid worden beheerd. Taakobjecten zijn naambare, beveiligbare, deelbare objecten die kenmerken beheren van de processen die eraan zijn gekoppeld. Bewerkingen die worden uitgevoerd op een taakobject zijn van invloed op alle processen die zijn gekoppeld aan het taakobject. Voorbeelden hiervan zijn het afdwingen van limieten zoals de grootte van de werkset en de procesprioriteit of het beëindigen van alle processen die aan een taak zijn gekoppeld.
- Taken maken
- processen beheren in taken
- taaklimieten en meldingen
- Resource Accounting voor taken
- taakobjecten beheren
- een processtructuur beheren die gebruikmaakt van taakobjecten
Taken maken
Als u een taakobject wilt maken, gebruikt u de functie CreateJobObject. Wanneer de taak wordt gemaakt, worden er geen processen aan de taak gekoppeld.
Als u een proces aan een taak wilt koppelen, gebruikt u de functie AssignProcessToJobObject. Nadat een proces aan een taak is gekoppeld, kan de koppeling niet worden verbroken. Een proces kan worden gekoppeld aan meer dan één taak in een hiërarchie van geneste taken. Zie Geneste takenvoor meer informatie.
Windows 7, Windows Server 2008 R2, Windows XP met SP3, Windows Server 2008, Windows Vista en Windows Server 2003: Een proces kan worden gekoppeld aan slechts één taak. Taken kunnen niet worden genest. De mogelijkheid om taken te nesten is toegevoegd in Windows 8 en Windows Server 2012.
U kunt een beveiligingsdescriptor voor een taakobject opgeven wanneer u de functie CreateJobObject aanroept. Zie Taakobjectbeveiliging en -toegangsrechtenvoor meer informatie.
Processen beheren in taken
Nadat een proces aan een taak is gekoppeld, worden standaard onderliggende processen gemaakt met behulp van CreateProcess ook aan de taak gekoppeld. (Onderliggende processen die zijn gemaakt met Win32_Process.Create zijn niet gekoppeld aan de taak.) Dit standaardgedrag kan worden gewijzigd door de uitgebreide limiet in te stellen JOB_OBJECT_LIMIT_BREAKAWAY_OK of JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK voor de taak.
- Als de taak de uitgebreide limiet heeft JOB_OBJECT_LIMIT_BREAKAWAY_OK en het bovenliggende proces is gemaakt met de vlag CREATE_BREAKAWAY_FROM_JOB, worden onderliggende processen van het bovenliggende proces niet gekoppeld aan de taak.
- Als de taak de uitgebreide limiet heeft JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, worden onderliggende processen van een bovenliggend proces dat aan de taak is gekoppeld, niet gekoppeld aan de taak. Het is niet nodig om bovenliggende processen te maken met de vlag CREATE_BREAKAWAY_FROM_JOB.
Als de taak is genest, hebben de instellingen van bovenliggende taken in de hiërarchie invloed op het feit of onderliggende processen zijn gekoppeld aan een andere taak in de hiërarchie. Zie Geneste takenvoor meer informatie.
Als u wilt bepalen of een proces in een taak wordt uitgevoerd, gebruikt u de functie IsProcessInJob.
Als u alle processen wilt beëindigen die momenteel aan een taakobject zijn gekoppeld, gebruikt u de functie TerminateJobObject.
Taaklimieten en meldingen
Een taak kan limieten afdwingen, zoals de grootte van de werkset, de procesprioriteit en de tijdslimiet voor het einde van de taak voor elk proces dat aan de taak is gekoppeld. Als een proces dat is gekoppeld aan een taak, probeert de werksetgrootte of procesprioriteit te verhogen van de limiet die door de taak is ingesteld, worden de functie-aanroepen voltooid, maar worden ze op de achtergrond genegeerd. Een taak kan ook limieten instellen die een melding activeren wanneer deze worden overschreden, maar de taak toestaan om door te gaan.
Als u limieten voor een taak wilt instellen, gebruikt u de functie SetInformationJobObject. Zie de volgende onderwerpen voor een lijst met mogelijke limieten die voor een taak kunnen worden ingesteld:
- JOBOBJECT_BASIC_LIMIT_INFORMATION
- JOBOBJECT_BASIC_UI_RESTRICTIONS
- JOBOBJECT_CPU_RATE_CONTROL_INFORMATION
- JOBOBJECT_EXTENDED_LIMIT_INFORMATION
- JOBOBJECT_NOTIFICATION_LIMIT_INFORMATION
Beveiligingslimieten moeten afzonderlijk worden ingesteld voor elk proces dat is gekoppeld aan een taakobject. Zie procesbeveiligings- en toegangsrechtenvoor meer informatie.
Windows XP met SP3 en Windows Server 2003: De functie SetInformationJobObject kan worden gebruikt om beveiligingsbeperkingen in te stellen voor alle processen die zijn gekoppeld aan een taakobject. Vanaf Windows Vista moeten beveiligingslimieten afzonderlijk worden ingesteld voor elk proces dat is gekoppeld aan een taakobject.
Als de taak is genest, beïnvloeden bovenliggende taken in de hiërarchie de limiet die wordt afgedwongen voor de taak. Zie Geneste takenvoor meer informatie.
Als de taak een gekoppelde I/O-voltooiingspoort heeft, kan deze meldingen ontvangen wanneer bepaalde taaklimieten worden overschreden. Het systeem verzendt berichten naar de voltooiingspoort wanneer een limiet wordt overschreden of bepaalde andere gebeurtenissen optreden. Als u een voltooiingspoort wilt koppelen aan een taak, gebruikt u de functie SetInformationJobObject functie met de taakobjectinformatieklasse JobObjectAssociateCompletionPortInformation en een aanwijzer naar een JOBOBJECT_ASSOCIATE_COMPLETION_PORT structuur. U kunt dit het beste doen wanneer de taak inactief is, om de kans op ontbrekende meldingen te verminderen voor processen waarvan de statussen veranderen tijdens de koppeling van de voltooiingspoort.
Alle berichten worden rechtstreeks vanuit de taak verzonden alsof de taak de functie PostQueuedCompletionStatus heeft aangeroepen. Een thread moet de voltooiingspoort bewaken met behulp van de functie GetQueuedCompletionStatus om de berichten op te halen. Houd er rekening mee dat, met uitzondering van de limieten die zijn ingesteld met de JobObjectNotificationLimitInformation informatieklasse, de levering van berichten aan de voltooiingspoort niet is gegarandeerd; als een bericht niet binnenkomt, betekent dit niet per se dat de gebeurtenis niet heeft plaatsgevonden. Meldingen voor limieten die zijn ingesteld met JobObjectNotificationLimitInformation zijn gegarandeerd bij de voltooiingspoort. Zie JOBOBJECT_ASSOCIATE_COMPLETION_PORTvoor een lijst met mogelijke berichten.
Resource accounting voor taken
Het taakobject registreert basisboekhoudingsgegevens voor alle bijbehorende processen, inclusief de processen die zijn beëindigd. Als u deze boekhoudgegevens wilt ophalen, gebruikt u de functie QueryInformationJobObject. Zie de volgende onderwerpen voor een lijst met de boekhoudgegevens die voor een taak worden onderhouden:
Als het taakobject is genest, worden de boekhoudgegevens voor elke onderliggende taak samengevoegd in de bovenliggende taak. Zie Geneste takenvoor meer informatie.
Taakobjecten beheren
De status van een taakobject wordt ingesteld op signalering wanneer alle processen worden beëindigd omdat de opgegeven tijdslimiet voor het einde van de taak is overschreden. Gebruik WaitForSingleObject of WaitForSingleObjectEx om het taakobject voor deze gebeurtenis te controleren.
Als u een ingang voor een bestaand taakobject wilt verkrijgen, gebruikt u de functie OpenJobObject en geeft u de naam op die aan het object is opgegeven toen het werd gemaakt. Alleen benoemde taakobjecten kunnen worden geopend.
Als u een taakobjectgreep wilt sluiten, gebruikt u de functie CloseHandle. De taak wordt vernietigd wanneer de laatste ingang is gesloten en alle bijbehorende processen zijn beëindigd. Als de taak echter de JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE vlag heeft opgegeven, beëindigt het sluiten van de laatste taakobjectingang alle bijbehorende processen en vernietigt het taakobject zelf. Als voor een geneste taak de JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE vlag is opgegeven, beëindigt het sluiten van de laatste taakobjecting alle processen die zijn gekoppeld aan de taak en de onderliggende taken in de hiërarchie.
Een processtructuur beheren die gebruikmaakt van taakobjecten
Vanaf Windows 8 en Windows Server 2012 kan een toepassing gebruikmaken van geneste taken om een processtructuur te beheren die meer dan één taakobject gebruikt. Een toepassing die moet worden uitgevoerd op Windows 7, Windows Server 2008 R2 of eerdere versies van Windows die geen ondersteuning bieden voor geneste taken, moet de processtructuur echter op andere manieren beheren.
Als een hulpprogramma een processtructuur moet beheren die gebruikmaakt van taakobjecten en het niet mogelijk is geneste taken te gebruiken, moeten zowel het hulpprogramma als de leden van de processtructuur samenwerken. Gebruik een van de volgende opties:
Gebruik de limiet voor JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Als het hulpprogramma deze limiet gebruikt, kan er geen volledige processtructuur worden bewaakt. Het hulpprogramma kan alleen de processen bewaken die worden toegevoegd aan de taak. Als deze processen onderliggende processen maken, zijn ze niet gekoppeld aan de taak. In deze optie kunnen onderliggende processen worden gekoppeld aan andere taakobjecten.
Gebruik de JOB_OBJECT_LIMIT_BREAKAWAY_OK limiet. Als het hulpprogramma deze limiet gebruikt, kan het de hele processtructuur bewaken, met uitzondering van de processen die elk lid van de boom expliciet van de structuur afbreekt. Een lid van de structuur kan een onderliggend proces maken in een nieuw taakobject door de functie CreateProcess aan te roepen met de vlag CREATE_BREAKAWAY_FROM_JOB en vervolgens de functie AssignProcessToJobObject aan te roepen. Anders moet het lid zaken afhandelen waarin AssignProcessToJobObject mislukt.
De vlag CREATE_BREAKAWAY_FROM_JOB heeft geen effect als de boomstructuur niet wordt bewaakt door het hulpprogramma. Daarom is dit de voorkeursoptie, maar hiervoor is vooraf kennis nodig van de processen die worden bewaakt.
Voorkom onderbrekingen van welke aard dan ook door noch de JOB_OBJECT_LIMIT_BREAKAWAY_OK noch de JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK limiet in te stellen. In deze optie kan het hulpprogramma de hele processtructuur bewaken. Als een onderliggend proces echter probeert zichzelf of een ander onderliggend proces aan een taak te koppelen door AssignProcessToJobObjectaan te roepen, mislukt de aanroep. Als het proces is ontworpen om te worden gekoppeld aan een specifieke taak, kan deze fout verhinderen dat het proces correct werkt.