작업 개체

작업 개체를 사용하면 프로세스 그룹을 단위로 관리할 수 있습니다. 작업 개체는 연결된 프로세스의 특성을 제어하는 이름 지정 가능하고 보안이 가능한 공유 가능한 개체입니다. 작업 개체에서 수행된 작업은 작업 개체와 연결된 모든 프로세스에 영향을 줍니다. 예를 들어 작업 집합 크기 및 프로세스 우선 순위와 같은 제한을 적용하거나 작업과 연결된 모든 프로세스를 종료하는 것이 있습니다.

작업 만들기

작업 개체를 만들려면 CreateJobObject 함수를 사용합니다. 작업이 만들어지면 작업과 연결된 프로세스가 없습니다.

프로세스를 작업과 연결하려면 AssignProcessToJobObject 함수를 사용합니다. 프로세스가 작업과 연결되면 연결을 끊을 수 없습니다. 프로세스는 중첩된 작업의 계층 구조에서 둘 이상의 작업과 연결할 수 있습니다. 자세한 내용은 중첩 작업을 참조하세요.

Windows 7, Windows Server 2008 R2, WINDOWS XP SP3, Windows Server 2008, Windows Vista 및 Windows Server 2003: 프로세스는 하나의 작업에만 연결할 수 있습니다. 작업을 중첩할 수 없습니다. 작업을 중첩하는 기능이 Windows 8 및 Windows Server 2012 추가되었습니다.

CreateJobObject 함수를 호출할 때 작업 개체에 대한 보안 설명자를 지정할 수 있습니다. 자세한 내용은 작업 개체 보안 및 액세스 권한을 참조하세요.

작업에서 프로세스 관리

프로세스가 작업과 연결되면 기본적으로 CreateProcess 를 사용하여 만드는 자식 프로세스도 작업과 연결됩니다. (Win32_Process.Create를 사용하여 만든 자식 프로세스는 작업과 연결되지 않습니다.) 이 기본 동작은 작업에 대한 확장 제한 JOB_OBJECT_LIMIT_BREAKAWAY_OK 또는 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 설정하여 변경할 수 있습니다.

  • 작업에 확장된 제한 JOB_OBJECT_LIMIT_BREAKAWAY_OK 있고 부모 프로세스가 CREATE_BREAKAWAY_FROM_JOB 플래그를 사용하여 만들어진 경우 부모 프로세스의 자식 프로세스가 작업과 연결되지 않습니다.
  • 작업에 확장된 제한 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 있는 경우 작업과 연결된 부모 프로세스의 자식 프로세스는 작업과 연결되지 않습니다. CREATE_BREAKAWAY_FROM_JOB 플래그를 사용하여 부모 프로세스를 만들 필요는 없습니다.

작업이 중첩된 경우 계층 구조의 부모 작업의 중단 설정은 자식 프로세스가 계층 구조의 다른 작업과 연결되어 있는지 여부에 영향을 미칩니다. 자세한 내용은 중첩 작업을 참조하세요.

프로세스가 작업에서 실행 중인지 확인하려면 IsProcessInJob 함수를 사용합니다.

현재 작업 개체와 연결된 모든 프로세스를 종료하려면 TerminateJobObject 함수를 사용합니다.

작업 제한 및 알림

작업은 작업과 연결된 각 프로세스에 작업 집합 크기, 프로세스 우선 순위 및 작업 종료 시간 제한과 같은 제한을 적용할 수 있습니다. 작업과 연결된 프로세스가 작업에서 설정한 제한에서 작업 집합 크기 또는 프로세스 우선 순위를 늘리려고 하면 함수 호출이 성공하지만 자동으로 무시됩니다. 작업이 초과될 때 알림을 트리거하지만 작업을 계속 실행할 수 있도록 하는 제한을 설정할 수도 있습니다.

작업에 대한 제한을 설정하려면 SetInformationJobObject 함수를 사용합니다. 작업에 대해 설정할 수 있는 가능한 제한 목록은 다음 topics 참조하세요.

작업 개체와 연결된 각 프로세스에 대해 보안 제한을 개별적으로 설정해야 합니다. 자세한 내용은 프로세스 보안 및 액세스 권한을 참조하세요.

WINDOWS XP SP3 및 Windows Server 2003:SetInformationJobObject 함수를 사용하여 작업 개체와 연결된 모든 프로세스에 대한 보안 제한을 설정할 수 있습니다. Windows Vista부터 작업 개체와 연결된 각 프로세스에 대해 보안 제한을 개별적으로 설정해야 합니다.

작업이 중첩된 경우 계층 구조의 부모 작업은 작업에 적용되는 제한에 영향을 미칩니다. 자세한 내용은 중첩 작업을 참조하세요.

작업에 연결된 I/O 완료 포트가 있는 경우 특정 작업 제한을 초과하면 알림을 받을 수 있습니다. 한도가 초과되거나 특정 다른 이벤트가 발생할 때 시스템은 완료 포트로 메시지를 보냅니다. 완료 포트를 작업과 연결하려면 SetInformationJobObject 함수를 작업 개체 정보 클래스 JobObjectAssociateCompletionPortInformationJOBOBJECT_ASSOCIATE_COMPLETION_PORT 구조체에 대한 포인터와 함께 사용합니다. 작업이 비활성 상태일 때 완료 포트 연결 중에 상태가 변경되는 프로세스에 대한 알림이 누락될 가능성을 줄이는 것이 가장 좋습니다.

작업이 PostQueuedCompletionStatus 함수를 호출한 것처럼 모든 메시지가 작업에서 직접 전송됩니다. 스레드는 GetQueuedCompletionStatus 함수를 사용하여 완료 포트를 모니터링하여 메시지를 선택해야 합니다. JobObjectNotificationLimitInformation 정보 클래스로 설정된 제한을 제외하고 완료 포트에 메시지 배달이 보장되지 않습니다. 메시지가 도착하지 않는다고 해서 반드시 이벤트가 발생하지 않았다는 의미는 아닙니다. JobObjectNotificationLimitInformation으로 설정된 제한에 대한 알림은 완료 포트에 도착하도록 보장됩니다. 가능한 메시지 목록은 JOBOBJECT_ASSOCIATE_COMPLETION_PORT 참조하세요.

작업에 대한 리소스 계정

작업 개체는 종료된 프로세스를 포함하여 관련된 모든 프로세스에 대한 기본 회계 정보를 기록합니다. 이 회계 정보를 검색하려면 QueryInformationJobObject 함수를 사용합니다. 작업에 대해 유지 관리되는 회계 정보 목록은 다음 topics 참조하세요.

작업 개체가 중첩되면 각 자식 작업에 대한 회계 정보가 부모 작업에서 집계됩니다. 자세한 내용은 중첩 작업을 참조하세요.

작업 개체 관리

지정된 작업 종료 시간 제한을 초과했기 때문에 모든 프로세스가 종료될 때 작업 개체의 상태가 신호로 설정됩니다. WaitForSingleObject 또는 WaitForSingleObjectEx를 사용하여 이 이벤트에 대한 작업 개체를 모니터링합니다.

기존 작업 개체에 대한 핸들을 가져오려면 OpenJobObject 함수를 사용하고 개체를 만들 때 지정된 이름을 지정합니다. 명명된 작업 개체만 열 수 있습니다.

작업 개체 핸들을 닫려면 CloseHandle 함수를 사용합니다. 마지막 핸들이 닫혀 있고 연결된 모든 프로세스가 종료되면 작업이 제거됩니다. 그러나 작업에 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 플래그가 지정된 경우 마지막 작업 개체 핸들을 닫으면 연결된 모든 프로세스가 종료된 다음 작업 개체 자체가 삭제됩니다. 중첩된 작업에 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 플래그가 지정된 경우 마지막 작업 개체 핸들을 닫으면 계층 구조에서 작업 및 해당 자식 작업과 연결된 모든 프로세스가 종료됩니다.

작업 개체를 사용하는 프로세스 트리 관리

Windows 8 및 Windows Server 2012 시작하여 애플리케이션은 중첩된 작업을 사용하여 둘 이상의 작업 개체를 사용하는 프로세스 트리를 관리할 수 있습니다. 그러나 중첩된 작업을 지원하지 않는 Windows 7, Windows Server 2008 R2 또는 이전 버전의 Windows에서 실행해야 하는 애플리케이션은 다른 방법으로 프로세스 트리를 관리해야 합니다.

도구가 작업 개체를 사용하는 프로세스 트리를 관리해야 하고 중첩된 작업을 사용할 수 없는 경우 도구와 프로세스 트리의 멤버가 모두 협력해야 합니다. 다음 옵션 중 하나를 사용합니다.

  • JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 제한을 사용합니다. 도구에서 이 제한을 사용하는 경우 전체 프로세스 트리를 모니터링할 수 없습니다. 도구는 작업에 추가하는 프로세스만 모니터링할 수 있습니다. 이러한 프로세스가 자식 프로세스를 만드는 경우 작업과 연결되지 않습니다. 이 옵션에서 자식 프로세스는 다른 작업 개체와 연결할 수 있습니다.

  • JOB_OBJECT_LIMIT_BREAKAWAY_OK 제한을 사용합니다. 도구에서 이 제한을 사용하는 경우 트리의 멤버가 트리에서 명시적으로 분리되는 프로세스를 제외하고 전체 프로세스 트리를 모니터링할 수 있습니다. 트리의 멤버는 CREATE_BREAKAWAY_FROM_JOB 플래그를 사용하여 CreateProcess 함수를 호출한 다음 AssignProcessToJobObject 함수를 호출하여 새 작업 개체에서 자식 프로세스를 만들 수 있습니다. 그렇지 않으면 멤버는 AssignProcessToJobObject 가 실패하는 경우를 처리해야 합니다.

    도구에서 트리를 모니터링하지 않으면 CREATE_BREAKAWAY_FROM_JOB 플래그가 적용되지 않습니다. 따라서 이 옵션을 사용하는 것이 좋지만 모니터링되는 프로세스에 대한 사전 지식이 필요합니다.

  • JOB_OBJECT_LIMIT_BREAKAWAY_OK 또는 JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 제한을 설정하지 않고 모든 종류의 중단을 방지합니다. 이 옵션에서 도구는 전체 프로세스 트리를 모니터링할 수 있습니다. 그러나 자식 프로세스가 AssignProcessToJobObject를 호출하여 자체 또는 다른 자식 프로세스를 작업에 연결하려고 하면 호출이 실패합니다. 프로세스가 특정 작업과 연결되도록 디자인된 경우 이 오류로 인해 프로세스가 제대로 작동하지 않을 수 있습니다.