잡(Job)은 간단하게 설명드리면 여러 개의 프로세스들을 하나로 묶은 그룹입니다.


잡이 필요한 이유

- Windows는 프로세스의 부모/자식 관계를 항상 유지하지는 않습니다. (실행되고 종료됨에 따라 프로세스 트리는 끊어질 수 있습니다.)

- 특정 프로세스가 수행되는데에 여러 개의 프로세스를 거쳐서 수행되었다고 가정했을 때, 앞서 수행된 특정 프로세스가 종료됨으로 인해 이전에 수행된 여러 개의 프로세스들이 모두 종료되어야 한다고 하면, 이 프로세스들을 모두 관리하기 위함입니다.

- 여러 개의 프로세스의 데이터들(클라이언트)을 종합해 수행되는 프로세스(서버)라고 가정한다면, 특정 프로세스(클라이언트)가 과도하게 리소스를 점유하지 못하도록 제어할 필요도 있습니다. (이럴 땐 잡을 이용해 최대 CPU 점유 시간 제한, 최대/최소 워킹셋 제한, 보안 제한 등의 방법이 있습니다.)


이런 이유들 때문에 Windows는 잡 커널 오브젝트를 이용해 프로세스들을 하나의 그룹으로 묶어서 관리합니다.




HANDLE hProcJob = CreateJobObject(NULL, TEXT("wonjaykJOB"));

- 요런 식으로 잡 객체를 생성 할 수 있습니다.

- LPSECURITY_ATTRIBUTES lpJobAttributes : 새로 생성 할 잡 객체에 대한 Security Information을 전달

- LPCTSTR lpName : 생성될 잡 객체의 이름

- 리턴으로는 잡 객체의 핸들을 전달합니다.

첫 번째 인자인 LPSECURITY_ATTRIBUTES를 위 예제처럼 NULL로 세팅한다면 기본 Security Information으로 설정된 잡 객체가 생성됩니다.

잡 객체의 이름을 설정해두면 OpenJobObject 함수를 이용해 같은 잡 객체를 사용 할 수 있습니다.



BOOL bInJob = FALSE;

IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);

- 요런 식으로 현재 프로세스가 잡 객체에 속해있는지 확인 할 수 있습니다.

- HANDLE ProcessHandle : 잡 객체에 속해있는지 확인 해 볼 프로세스의 핸들

- HANDLE JobHandle : 특정 잡 객체의 핸들

- PBOOL Result : 첫 번째 인자로 받았던 프로세스가 잡에 속해있는지 여부를 TRUE or FALSE로 리턴

두 번째 인자인 JobHandle을 NULL로 세팅한다면 첫 번째 인자로 받은 프로세스가 현재 생성된 전체 잡 객체 중 어디에라도 속해있다면 세 번째 인자인 BOOL에 TRUE를 리턴하게 됩니다. 반대라면 FALSE겠죠?



HANDLE hOpenJob = OpenJobObject(JOB_OBJECT_ALL_ACCESS, TRUE, TEXT("wonjaykJOB"));

- 요런 식으로 이미 생성된 잡 객체를 사용할 수 있습니다.

- DWORD dwDesiredAccess : 잡 객체 접근 권한 (아래 표로 설명)

- BOOL bInheritHandles : 현재 프로세스로부터 생성된 새로운 프로세스들에게 Open할 잡의 핸들을 상속할 지 여부

- LPCTSTR lpName : 사용하고자 하는 잡 객체의 이름


잡 객체 접근 권한

 접근 권한

내용 

 JOB_OBJECT_ALL_ACCESS

잡 객체에 대한 모든 접근 권한 부여 

 JOB_OBJECT_ASSIGN_PROCESS

현재 프로세스에서 AssignProcessToJobObject 함수를 사용할 수 있도록 권한 부여

 - AssignProcessToJobObject : 잡 내에 프로세스 배치 함수

 JOB_OBJECT_QUERY

현재 프로세스에서 잡 객체를 조회해 볼 수 있는 권한 부여 (어떤 프로세스가 속해있는지, IsProcessInJob 사용 가능....)

 JOB_OBJECT_SET_ATTRIBUTES

현재 프로세스에서 SetInformationJobObject 함수를 사용할 수 있도록 권한 부여

 - SetInformationJobObject : 잡 객체에 대한 제약사항 설정

 - 다음 포스팅에서 기록하도록 하겠습니다~

 JOB_OBJECT_SET_SECURITY_ATTRIBUTES

Windows Vista 이후 운영체제에서는 삭제된 권한

Windows XP : 현재 프로세스에서 보안 정보 수정 권한 부여

 JOB_OBJECT_TERMINATE

현재 프로세스에서 TerminateJobObject 함수를 사용할 수 있도록 권한 부여

 - TerminateJobObject : 잡 객체와 연관된 모든 프로세스를 종료하는 함수


Posted by 긍정왕오킹