Delen via


Geneste taken

Een toepassing kan geneste taken gebruiken om subsets van processen te beheren. Geneste taken maken ook een toepassing mogelijk die gebruikmaakt van taken om andere toepassingen te hosten die ook taken gebruiken.

Windows 7, Windows Server 2008 R2, Windows XP met SP3, Windows Server 2008, Windows Vista en Windows Server 2003: Een proces kan slechts aan één taak worden gekoppeld. Geneste taken zijn geïntroduceerd in Windows 8 en Windows Server 2012.

In dit onderwerp vindt u een overzicht van het nesten van taken en het gedrag van geneste taken:

Zie Taakobjectenvoor algemene informatie over taken en jobobjecten.

Geneste taakhiërarchieën

Geneste taken hebben een relatie tussen bovenliggende en onderliggende taken waarin elke onderliggende taak een subset van de processen in de bovenliggende taak bevat. Als een proces dat zich al in een taak bevindt, wordt toegevoegd aan een andere taak, worden de taken standaard genest als het systeem een geldige taakhiërarchie kan vormen en geen van beide taken gebruikersinterfacelimieten instelt (SetInformationJobObject met JobObjectBasicUIRestrictions).

In afbeelding 1 ziet u een taakhiërarchie met een structuur met processen met het label P0 tot en met P7. Job 1 is de bovenliggende taak job 2 en job 4, en het is een bovenliggende van Job 3. Taak 2 is de directe bovenliggende taak 3; Job 3 is het onmiddellijke kind van Job 2. Taken 1, 2 en 3 vormen een jobketen waarin Jobs 1 en 2 de bovenliggende taakketen zijn van Job 3. De eindtaak in een jobketen is de onmiddellijke taak van de processen in die taak. In afbeelding 1 is Taak 3 de directe taak van processen P2, P3 en P4.

figuur 1. een geneste taakhiërarchie die een processtructuur bevat

Geneste taken kunnen ook worden gebruikt om groepen peerprocessen te beheren. In de taakhiërarchie die wordt weergegeven in afbeelding 2, is Taak 1 de bovenliggende taak van Taak 2. Houd er rekening mee dat een taakhiërarchie mogelijk slechts een deel van een processtructuur bevat. In afbeelding 2 bevindt P0 zich niet in de hiërarchie, maar de onderliggende processen P1 tot en met P5 zijn.

afbeelding 2. een geneste taakhiërarchie die peerprocessen bevat

Een geneste taakhiërarchie maken

Processen in een taakhiërarchie worden expliciet gekoppeld aan een taakobject met behulp van de AssignProcessToJobObject functie of impliciet gekoppeld tijdens het maken van processen, hetzelfde als voor zelfstandige taken. De volgorde waarin taken worden gemaakt en processen worden toegewezen, bepaalt of een hiërarchie kan worden gemaakt.

Als u een taakhiërarchie wilt maken met behulp van expliciete koppeling, moeten alle taakobjecten worden gemaakt met behulp van CreateJobObject. Vervolgens moet AssignProcessToJobObject meerdere keren worden aangeroepen voor elk proces om het proces te koppelen aan elke taak waartoe het behoort. Om ervoor te zorgen dat de taakhiërarchie geldig is, wijst u eerst alle processen toe aan de taak in de hoofdmap van de hiërarchie en wijst u vervolgens een subset van processen toe aan het onderliggende taakobject, enzovoort. Als processen in deze volgorde worden toegewezen aan taken, heeft een onderliggende taak altijd een subset van processen in de bovenliggende taak terwijl de hiërarchie wordt gemaakt, wat vereist is voor nesten. Als processen in willekeurige volgorde aan taken worden toegewezen, heeft een onderliggende taak op een bepaald moment processen die zich niet in de bovenliggende taak bevinden. Dit is niet toegestaan door nesten en dit zorgt ervoor dat AssignProcessToJobObject mislukt.

Wanneer processen impliciet aan een taak worden gekoppeld tijdens het maken van het proces, wordt een onderliggend proces gekoppeld aan elke taak in de taakketen van het bovenliggende proces. Als het onmiddellijke taakobject breakaway toestaat, wordt het onderliggende proces verwijderd van het onmiddellijke taakobject en van elke taak in de bovenliggende taakketen, waarbij de hiërarchie omhoog wordt verplaatst totdat er een taak wordt bereikt die geen onderbreking toestaat. Als het onmiddellijke taakobject geen onderbreking toestaat, wordt het onderliggende proces niet verbroken, zelfs niet als taken in de bovenliggende taakketen dit toestaan.

Taaklimieten en meldingen voor geneste taken

Voor bepaalde resourcelimieten bepaalt de limiet die is ingesteld voor taken in een bovenliggende taakketen de effectieve limiet die wordt afgedwongen voor een onderliggende taak. De effectieve limiet voor onderliggende taken kan meer beperkend zijn dan de limiet van de bovenliggende taak, maar deze mag niet minder beperkend zijn. Als de prioriteitsklasse van een onderliggende taak bijvoorbeeld wordt ABOVE_NORMAL_PRIORITY_CLASS en de prioriteitsklasse van de bovenliggende taak NORMAL_PRIORITY_CLASS, wordt de effectieve limiet voor processen in de onderliggende taak NORMAL_PRIORITY_CLASS. Als de prioriteitsklasse van de onderliggende taak echter BELOW_NORMAL_PRIORITY_CLASS is, wordt de effectieve limiet voor processen in de onderliggende taak BELOW_NORMAL_PRIORITY_CLASS. Effectieve limieten worden afgedwongen voor prioriteitsklasse, affiniteit, doorvoerkosten, uitvoeringstijdslimiet per proces, planningsklasselimiet en werkset minimum en maximum. Zie SetInformationJobObject voor meer informatie over specifieke resourcelimieten.

Wanneer bepaalde gebeurtenissen optreden, zoals het maken van een nieuw proces of een schending van de resourcelimiet, wordt er een bericht verzonden naar de I/O-voltooiingspoort die is gekoppeld aan een taak. Een taak kan zich ook registreren om meldingen te ontvangen wanneer bepaalde limieten worden overschreden. Voor een niet-geneste taak wordt het bericht verzonden naar de I/O-voltooiingspoort die aan de taak is gekoppeld. Voor een geneste taak wordt het bericht verzonden naar elke I/O-voltooiingspoort die is gekoppeld aan een taak in de bovenliggende taakketen van de taak die het bericht heeft geactiveerd. Een onderliggende taak hoeft geen gekoppelde I/O-voltooiingspoort te hebben voor berichten die worden geactiveerd om te worden verzonden naar de I/O-voltooiingspoorten van bovenliggende taken hoger in de taakketen. Zie JOBOBJECT_ASSOCIATE_COMPLETION_PORTvoor meer informatie over specifieke berichten.

Resource accounting voor geneste taken

Resourceboekhoudingsgegevens voor een geneste taak beschrijven het gebruik van elk proces dat aan die taak is gekoppeld, inclusief processen in onderliggende taken. Elke taak in een jobketen vertegenwoordigt daarom de geaggregeerde resources die worden gebruikt door eigen processen en de processen van elke onderliggende taak eronder in de taakketen.

Beëindiging van geneste taken

Wanneer een taak in een taakhiërarchie wordt beëindigd, beëindigt het systeem processen in die taak en alle onderliggende taken, beginnend met de onderliggende taak onderaan de hiërarchie. Openstaande resources die door elk beëindigd proces worden gebruikt, worden in rekening gebracht voor de bovenliggende taak.

De taakgreep moet het JOB_OBJECT_TERMINATE toegangsrecht hebben, hetzelfde als voor zelfstandige taken.