35
Windows via C++ 5장잡(Job) 아키텍트를 꿈꾸는 사람들 (http://cafe.naver.com/archtect1) 전효성 [email protected] 1

windows via c++ Ch 5. Job

Embed Size (px)

DESCRIPTION

cafe.naver.com/architect1 Windows via c++ ch 5

Citation preview

Page 1: windows via c++ Ch 5. Job

Windows via C++

5장 잡(Job)

아키텍트를 꿈꾸는 사람들

(http://cafe.naver.com/archtect1)

전효성

[email protected]

Page 2: windows via c++ Ch 5. Job

어디서 사용할까?

구글링을 해봤습니다.

키워드는 “OpenJobObject”

2

Page 3: windows via c++ Ch 5. Job

검색 결과

3

Page 4: windows via c++ Ch 5. Job

4

Page 5: windows via c++ Ch 5. Job

사용 사례

• 웹 브라우저 – 구글 크롬

• 서버 프로그램

• Virtual machine

5

Page 6: windows via c++ Ch 5. Job

사용 용도

• 여러 개의 Process를 하나의 그룹으로 묶

어서 관리하고 싶을 경우

• Process가 돌아가는 환경에 제약을 걸고

싶을 경우

– 메모리 제한

– CPU 사용시간 제한

6

Page 7: windows via c++ Ch 5. Job

주요 용어 설명

• Sandbox

– 제약이 심한 환경기반 시스템이나 데이터

보호 목적

– 사용 사례

• 구글 크롬

• 백신

• Virtual machine

7

Page 8: windows via c++ Ch 5. Job

코드를 살펴 봅시다.

8

Page 9: windows via c++ Ch 5. Job

9

Page 10: windows via c++ Ch 5. Job

프로세스 종료 전에

Job핸들을 제거해도 될까요?

10

Page 11: windows via c++ Ch 5. Job

P1 P2 P3

Job object

프로세스가 모두 종료될 때

Job object가 소멸됩니다.

11

Page 12: windows via c++ Ch 5. Job

오늘 배울 것들

1. 잡 내의 프로세스에 대한 제한사항 설정

2. 잡 내에 프로세스 배치하기

3. 잡 내의 모든 프로세스 종료하기

4. 잡 통지

5. 잡 실습 어플리케이션

12

Page 13: windows via c++ Ch 5. Job

1. 잡 내의 프로세스에 대한 제한사항 설정

• 제한합니다.

– 시스템 리소스

– UI의 일부 기능들 ( 강제 종료, 로그 아웃, … )

– 보안 사항의 접근( 파일, 레지스트리 서브키 )

• How?

– SetInformationJobObject()함수를 통해서

13

Page 14: windows via c++ Ch 5. Job

SetInformationJobObject function

• 제한 사항 형태

– 기본 제한사항

– 확장 제한사항

– 기본 UI제한사항

– 보안 제한사항

BOOL WINAPI SetInformationJobObject(

__in HANDLE hJob,

__in JOBOBJECTINFOCLASS JobObjectInfoClass,

__in LPVOID lpJobObjectInfo,

__in DWORD cbJobObjectInfoLength

);

14

Page 15: windows via c++ Ch 5. Job

사용 방법

BOOL WINAPI SetInformationJobObject(

__in HANDLE hJob,

__in JOBOBJECTINFOCLASS JobObjectInfoClass,

__in LPVOID lpJobObjectInfo,

__in DWORD cbJobObjectInfoLength

);

15

Page 16: windows via c++ Ch 5. Job

기본 제한 사항 설정

1. 프로세스별 user 모드시간 제한

2. Job별 user 모드 시간 제한

3. Limit flag

4~5 : 최대/최소 working set지정

6. 동시 수행 가능한 프로세스 수

7. 프로세스별 제한사항 설정

8. 모든 프로세스 우선순위 설정

9. 잡 내의 프로세스의 우선순위 설정

( 0 : 시간 점유 낮다 ~ 9 : 시간점유 높다 )

16

Page 17: windows via c++ Ch 5. Job

확장 제한 사항 설정

1. 기본 제한 사항 설정 객체

2. IO카운터

3. 프로세스 당 커밋 가능한 최대 메모리

크기

4. Job에서 커밋 가능한 최대 메모리 크

5. 잡 내에 프로세스당 커밋된 최대 메모

리 사용량 조회

6. 잡 전체의 커밋된 메모리 사용량 조회

예외 창이 안떠요..

17

Page 18: windows via c++ Ch 5. Job

UI 제한 사항 설정

1. 제한사항 없음

2. 잡 외부에서 생성한 핸들 사용 금지

3. 클립보드 읽기 금지

4. 클립보드 쓰기 금지

5. 시스템 파라메터 변경 금지

6. 디스플레이 설정 변경 금지

7. 잡 내의 프로세스들이 전역 아톰 테이

블에만 접근

8. 새로운 데스크탑 생성 / 교체 금지

9. 윈도우 종료 금지

10.모두 금지

18

Page 19: windows via c++ Ch 5. Job

잡 내부와 외부의 프로세스간 통신

잡 외부 프로세스

잡 내부 프로세스

핸들 사용 가능

핸들 사용 불가

BOOL WINAPI UserHandleGrantAccess(

__in HANDLE hUserHandle,

__in HANDLE hJob,

__in BOOL bGrant

);

19

Page 20: windows via c++ Ch 5. Job

보안 제한 사항 설정

20

Page 21: windows via c++ Ch 5. Job

Job에 걸려있는 제한 정보 조회

BOOL WINAPI QueryInformationJobObject(

__in_opt HANDLE hJob,

__in JOBOBJECTINFOCLASS JobObjectInfoClass,

__out LPVOID lpJobObjectInfo,

__in DWORD cbJobObjectInfoLength,

__out_opt LPDWORD lpReturnLength

);

SetInformationJobObject 함수와 동일한 방식으로 값 얻어올 수 있음

• Handle

• 어떤 구조체 사용하는지 구조체 종류

• 구조체 포인터

• 구조체 크기

• 받아올 값

21

Page 22: windows via c++ Ch 5. Job

2. 잡 내에 프로세스 배치하기

• 생성 요청한 Process가 Job에 속해있는 경우

• 생성 요청한 Process가 Job에 속해있지 않은 경

– CreateProcess시 CREATE_SUSPEND 플래그로 생성

– AssignProcessToJobObject(hJob, hProcess)로 생성

한 process를 Job에 배치

– ResumeThread로 thread흐름 재개

22

Page 23: windows via c++ Ch 5. Job

23

Page 24: windows via c++ Ch 5. Job

3. 잡 내의 모든 프로세스 종료하기

• 잡 내의 모든 프로세스 종료하기

– TerminateJobObject( jobHandle, exitCode )

• 잡의 통계 정보 조회

– QueryInformationJobObject()• BASIC_ACCOUNTING_INFORMATION

• IO_COUNTERS

– Read or Write 횟수

– Read or Write 데이터의 크기

• 현재 수행중인 Job 내의 프로세스 조회

• 잡에 속하지 않은 IO_COUNTER조회

– GetProcessIoCounters()사용

24

Page 25: windows via c++ Ch 5. Job

BASIC_ACCOUNTING_INFORMATION

BOOL WINAPI QueryInformationJobObject(

__in_opt HANDLE hJob,

__in JOBOBJECTINFOCLASS JobObjectInfoClass,

__out LPVOID lpJobObjectInfo,

__in DWORD cbJobObjectInfoLength,

__out_opt LPDWORD lpReturnLength

);

25

Page 26: windows via c++ Ch 5. Job

간단하게 사용할 거면…

• Tool을 사용 합시다.

• Process explorer

– 프로세스가 Job 내부에서 수행되면 갈색으로 변함

26

Page 27: windows via c++ Ch 5. Job

4. 잡 통지

• 잡 통지를 받는 두가지 방법

– WaitForSingleObject()를 이용

– IOCP( Input/Ouptput Completion Port )를 이용

27

Page 28: windows via c++ Ch 5. Job

CPU 시간 소모 통지

• WaitForSingleObject나

WaitForMultiObjects를 이

용하여 통지를 기다림

• CPU시간을 모두 사용하면

wait아래 코드 수행

28

Page 29: windows via c++ Ch 5. Job

IOCP를 이용하는 통지 방법 종류

1. Job이 주어진 CPU시간 모두 소모, Process종료는 안함

2. 프로세스가 주어진 CPU시간을 모두소모, 프로세스 종료, 프로세스 id를넘겨줌

3. 현재 수행중인 프로세스 수의 제한을넘김

4. 현재 수행중인 프로세스가 없음

5. 새로운 프로세스가 생성됨( id전달 )

6. 프로세스가 종료됨( id전달 )

7. Unhandled exception으로 인한 프로세스 종료 통지( id전달 )

8. 프로세스가 최대 메모리 사용량을 넘어선 할당을 요청함 ( id전달 )

9. Job에서 사용가능한 최대 메모리 사용량을 넘는 메모리 할당 요청이 들어옴

29

Page 30: windows via c++ Ch 5. Job

IOCP를 이용한 job notify 처리

Job notify를 처리할 thread생성

잡과 IOCP의 연결

SetInformationJobObject()

IOCP포트 하나 생성

Job notify thread의 종료까지 wait

Job notify thread functionApplication thread

30

Page 31: windows via c++ Ch 5. Job

주의사항

• 잡 오브젝트의 CPU시간 모두사용종료

• CPU 시간 모두 사용 통지만 받으려면?

– JOBOBJECT_END_OF_JOB_TIME_INFORMATION

구조체 생성 후 SetInformationJobObject()함수로 설정

31

Page 32: windows via c++ Ch 5. Job

32

Page 33: windows via c++ Ch 5. Job

5. 잡 실습 어플리케이션

• http://www.hanb.co.kr/exam/1621/

33

Page 34: windows via c++ Ch 5. Job

주의사항

• Console에서 실행 할 것

• Visual studio나 탐색기에서 실행하면 아래

와 같은 그림을 볼 수 있다.

– 탐색기를 통하여 실행된 파일은 자동적으로

“PCA”라는 Job에 할당 된다.

34

Page 35: windows via c++ Ch 5. Job

발표는 여기까지…

35