Kapslade jobb
Ett program kan använda kapslade jobb för att hantera delmängder av processer. Kapslade jobb aktiverar också ett program som använder jobb som värd för andra program som också använder jobb.
Windows 7, Windows Server 2008 R2, Windows XP med SP3, Windows Server 2008, Windows Vista och Windows Server 2003: En process kan bara associeras med ett enda jobb. Kapslade jobb introducerades i Windows 8 och Windows Server 2012.
Det här avsnittet innehåller en översikt över jobbkapsling och beteende för kapslade jobb:
- kapslade jobbhierarkier
- Skapa en kapslad jobbhierarki
- jobbbegränsningar och meddelanden för kapslade jobb
- Resursredovisning för kapslade jobb
- avslutning av kapslade jobb
Allmän information om jobb och jobbobjekt finns i Jobbobjekt.
Kapslade jobbhierarkier
Kapslade jobb har en överordnad-underordnad relation där varje underordnat jobb innehåller en delmängd av processerna i det överordnade jobbet. Om en process som redan finns i ett jobb läggs till i ett annat jobb kapslas jobben som standard om systemet kan bilda en giltig jobbhierarki och inget av jobben anger användargränssnittsgränser (SetInformationJobObject med JobObjectBasicUIRestrictions).
Bild 1 visar en jobbhierarki som innehåller ett träd med processer märktA P0 till P7. Jobb 1 är det överordnade jobbet för jobb 2 och jobb 4, och det är en överordnad för jobb 3. Jobb 2 är överordnade för jobb 3. Jobb 3 är det omedelbara underordnade för jobb 2. Jobb 1, 2 och 3 utgör en jobbkedja där jobb 1 och 2 är den överordnade jobbkedjan för jobb 3. Slutjobbet i en jobbkedja är det omedelbara jobbet av processerna i det jobbet. I bild 1 är jobb 3 det omedelbara jobbet för processerna P2, P3 och P4.
Kapslade jobb kan också användas för att hantera grupper av peer-processer. I jobbhierarkin som visas i bild 2 är jobb 1 det överordnade jobbet för jobb 2. Observera att en jobbhierarki bara kan innehålla en del av ett processträd. I bild 2 finns P0 inte i hierarkin, men dess underordnade processer P1 till P5 är det.
Skapa en kapslad jobbhierarki
Processer i en jobbhierarki är antingen uttryckligen associerade med ett jobbobjekt med hjälp av AssignProcessToJobObject funktion eller implicit associerad under processskapandet, samma som för fristående jobb. I vilken ordning jobb skapas och processer tilldelas avgörs om en hierarki kan skapas.
Om du vill skapa en jobbhierarki med explicit association måste alla jobbobjekt skapas med CreateJobObjectoch sedan AssignProcessToJobObject måste anropas flera gånger för varje process för att associera processen med varje jobb som den ska tillhöra. För att säkerställa att jobbhierarkin är giltig tilldelar du först alla processer till jobbet i hierarkins rot och tilldelar sedan en delmängd processer till det omedelbara underordnade jobbobjektet och så vidare. Om processer tilldelas till jobb i den här ordningen har ett underordnat jobb alltid en delmängd processer i det överordnade jobbet medan hierarkin skapas, vilket krävs för kapsling. Om processer tilldelas till jobb i slumpmässig ordning kommer ett underordnat jobb någon gång att ha processer som inte finns i det överordnade jobbet. Detta tillåts inte genom kapsling och gör att AssignProcessToJobObject misslyckas.
När processer implicit associeras med ett jobb när processen skapas associeras en underordnad process med varje jobb i jobbkedjan för den överordnade processen. Om det omedelbara jobbobjektet tillåter utbrytning bryter den underordnade processen bort från det omedelbara jobbobjektet och från varje jobb i den överordnade jobbkedjan och flyttar upp hierarkin tills den når ett jobb som inte tillåter utbrytning. Om det omedelbara jobbobjektet inte tillåter utbrytning bryts inte den underordnade processen bort även om jobben i den överordnade jobbkedjan tillåter det.
Jobbbegränsningar och meddelanden för kapslade jobb
För vissa resursgränser fastställer den gräns som angetts för jobb i en överordnad jobbkedja den gällande gränsen som tillämpas för ett underordnat jobb. Den effektiva gränsen för underordnat jobb kan vara mer restriktiv än gränsen för det överordnade jobbet, men det kan inte vara mindre restriktivt. Om till exempel ett underordnat jobbs prioritetsklass är ABOVE_NORMAL_PRIORITY_CLASS och det överordnade jobbets prioritetsklass är NORMAL_PRIORITY_CLASS är den effektiva gränsen för processer i det underordnade jobbet NORMAL_PRIORITY_CLASS. Men om det underordnade jobbets prioritetsklass är BELOW_NORMAL_PRIORITY_CLASS är den effektiva gränsen för processer i det underordnade jobbet BELOW_NORMAL_PRIORITY_CLASS. Gällande gränser tillämpas för prioritetsklass, tillhörighet, incheckningsavgift, tidsgräns för körning per process, schemaläggning av klassgräns och lägsta och högsta arbetsuppsättning. Mer information om specifika resursgränser finns i SetInformationJobObject.
När vissa händelser inträffar, till exempel skapande av ny process eller resursgränsöverträdelse, skickas ett meddelande till I/O-slutförandeporten som är associerad med ett jobb. Ett jobb kan också registrera sig för att ta emot meddelanden när vissa gränser överskrids. För ett icke-kapslat jobb skickas meddelandet till I/O-slutförandeporten som är associerad med jobbet. För ett kapslat jobb skickas meddelandet till varje I/O-slutförandeport som är associerad med ett jobb i den överordnade jobbkedjan för jobbet som utlöste meddelandet. Ett underordnat jobb behöver inte ha en associerad I/O-slutförandeport för meddelanden som utlöses för att skickas till I/O-slutförandeportarna för överordnade jobb högre i jobbkedjan. Mer information om specifika meddelanden finns i JOBOBJECT_ASSOCIATE_COMPLETION_PORT.
Resursredovisning för kapslade jobb
Resursredovisningsinformation för ett kapslat jobb beskriver användningen av varje process som är associerad med jobbet, inklusive processer i underordnade jobb. Varje jobb i en jobbkedja representerar därför de aggregerade resurser som används av sina egna processer och processerna för varje underordnat jobb under det i jobbkedjan.
Avslutning av kapslade jobb
När ett jobb i en jobbhierarki avslutas avslutar systemet processer i det jobbet och alla dess underordnade jobb, med början i det underordnade jobbet längst ned i hierarkin. Utestående resurser som används av varje avslutad process debiteras det överordnade jobbet.
Jobbhandtaget måste ha JOB_OBJECT_TERMINATE åtkomsträtt, samma som för fristående jobb.