잡(Job)은 간단하게 설명드리면 여러 개의 프로세스들을 하나로 묶은 그룹입니다.
잡이 필요한 이유
- Windows는 프로세스의 부모/자식 관계를 항상 유지하지는 않습니다. (실행되고 종료됨에 따라 프로세스 트리는 끊어질 수 있습니다.)
- 특정 프로세스가 수행되는데에 여러 개의 프로세스를 거쳐서 수행되었다고 가정했을 때, 앞서 수행된 특정 프로세스가 종료됨으로 인해 이전에 수행된 여러 개의 프로세스들이 모두 종료되어야 한다고 하면, 이 프로세스들을 모두 관리하기 위함입니다.
- 여러 개의 프로세스의 데이터들(클라이언트)을 종합해 수행되는 프로세스(서버)라고 가정한다면, 특정 프로세스(클라이언트)가 과도하게 리소스를 점유하지 못하도록 제어할 필요도 있습니다. (이럴 땐 잡을 이용해 최대 CPU 점유 시간 제한, 최대/최소 워킹셋 제한, 보안 제한 등의 방법이 있습니다.)
이런 이유들 때문에 Windows는 잡 커널 오브젝트를 이용해 프로세스들을 하나의 그룹으로 묶어서 관리합니다.
HANDLE hProcJob = CreateJobObject(NULL, TEXT("wonjaykJOB"));
- 요런 식으로 잡 객체를 생성 할 수 있습니다.
- LPSECURITY_ATTRIBUTES lpJobAttributes : 새로 생성 할 잡 객체에 대한 Security Information을 전달
- LPCTSTR lpName : 생성될 잡 객체의 이름
- 리턴으로는 잡 객체의 핸들을 전달합니다.
첫 번째 인자인 LPSECURITY_ATTRIBUTES를 위 예제처럼 NULL로 세팅한다면 기본 Security Information으로 설정된 잡 객체가 생성됩니다.
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 : 잡 객체와 연관된 모든 프로세스를 종료하는 함수 |
'Windows > Windows Programming' 카테고리의 다른 글
잡 (Job) - 프로세스 제약사항 설정 2 (1) | 2016.05.28 |
---|---|
잡 (Job) - 프로세스 제약사항 설정 1 (0) | 2016.05.21 |
프로세스 권한 상승 - ShellExecuteEx() (0) | 2016.04.16 |
자식 프로세스 (0) | 2016.04.09 |
프로세스의 종료 (0) | 2016.04.02 |