2. 1. 잡 내의 프로세스에 대한 제한사항 설정
• 제한 사항
- 시스템 리소스
- UI의 기능들
- 보안 요소 접근
3. 1. 잡 내의 프로세스에 대한 제한사항 설정
제한사항 형태 두 번째 매개변수의 값 세 번재 매개변수의 구조체
기본 제한사항 JobObjectBasicLimitInformation JOBOBJECT _BASIC_LlMIT _INFORMATION
확정 제한사항 JobObjectExtendedLimitlnformation JOBOJECT_EXTENDED_LIMIT_INFORMATION
기본 UI 제한사항 JobObjectBasicUIRestrictions OBOBJECT _BASIC_UI_RESTRICTIONS
보안 제한사항 JobObjectSecurityLimitlnformation JOBOBJECT _SECURITY _LIMIT _lNFORMATION
제한사항을 설정 할 수 있는
함수.
4. 1. 잡 내의 프로세스에 대한 제한사항 설정
3번째 파라미터인 JobObjectInfoClass에 들어갈 수 있는 값.
(기본제한설정)
5. 1. 잡 내의 프로세스에 대한 제한사항 설정
파라미터 설명
PerProcessUserTimeLimit 각 프로세스별로 사용 가능한 최대 유저 모드 시간을 설정
PerJobUserTimeLimit 잡 내의 모든 프로세스가 얼마나 많은 시간을 사용할 수 있는지를 지
정
LimitFlags 제한사항 비트 플래그
MinimumWorkingSetSize
MaximumWorkingSetSize
* 프로세스별 최대, 최소 워킹셋 지정
ActiveProcessLimit 잡 내에서 동시에 수행될 수 있는 프로세스의 최대 개수
Affinity 잡 내의 프로세스들을 수행할 수 있는 CPU의 부분집합 설정
PriorityClass 잡 내의 모든 프로세스들에 대해 우선순위 클래스를 지정
SchedulingClass 잡의 퀀텀시간 설정
LimitFlags - http://msdn.microsoft.com/en-us/library/ms684147%28v=VS.85%29.aspx
7. 1. 잡 내의 프로세스에 대한 제한사항 설정
파라미터 설명
BasicLimitInformation JOBOBJECT_BASIC_LIMIT_INFORMATION 구조체를 포함하고 있는 슈
퍼셋(superset)이다.
IoInfo 예약되어 있음(접근은 지양하자)
PeakProcessMemoryUsed 읽기 전용. 잡 내의 프로세스당 커밋된 최대 메모리 사용량
PeakJobMemoryUsed 잡 전체의 커밋된 메모리 사용량
ProcessMemoryLimit 프로세스당 커밋될 수 있는 최대 메모리 크기
JobMemoryLimit 잡 전체에서 커밋될 수 있는 최대 메모리 크기
8. 1. 잡 내의 프로세스에 대한 제한사항 설정
UI 제한설정
• 프로세스가 CreateDesktop, SwitchDestop등의 함수를 사용하지 못하게 함.
• 프로세스가 ChangeDisplaySettings 함수를 이용하여 디스플레이 설정을 변경하지 못하도록 한다.
• 프로세스가 ExitWindowsEx 함수를 이용하여 로그오프, 셧다운, 리부팅, 시스템 파워오프를 하지
못하도록한다.
• 잡 내의 프로세스가 잡 외부의 프로세스에 의해 생성된 유저 오브젝트(hwnd와 같은)를 사용하지
못하도록 한다
• 프로세스가 클립보드의 내용을 읽지 못하도록 한다.
• 프로세스가 SystemParameterInfo 함수를 이용하여 시스템 파라미터들을 변경하지 못하도록 한다.
10. 1. 잡 내의 프로세스에 대한 제한사항 설정
파라미터 설명
SecurityLimitFlags 관리자의 접근을 거부하거나 필터되지 않은 토큰의 접근을 거부하거
나 특정 액세스 토큰을 강제로 요구하거 특정 SID나 권한을 사용하지
못하도록 설정하는 플래그.
JobToken 잡 내의 모든 프로세스가 사용할 수 있는 액세스 토큰을 지정한다.
SidsToDisable 액세스 확인을 수행하지 못하도록 하는 SID
PrivilegesToDelete 액세스 토큰으로부터 어떤 권한을 제거할지를 나타낸다
RestrictedSids 액세스 토큰에 추가할 접근 거부 SID 목록을 지정한다
MSDN - http://msdn.microsoft.com/en-us/library/ms684159%28v=VS.85%29.aspx
11. 1. 잡 내의 프로세스에 대한 제한사항 설정
설정되어 있는 제한사항을 보는 함수
파라미터 설명
hJob 질문되어질 정보를 가지고 있는 잡의 핸들
JobObjectInfoClass 쿼리되어진(질문되어진) 제한사항에 대한 정보 클래스
lpJobObjectInfo 제한 또는 잡의 상태에 대한 정보. 이 데이터의 포맷
은 JobObjectInfoClass 파라미터의 값에 의존한다
cbJobObjectInfoLength 쿼리되어진 잡 정보에 대한 크기(바이트단위)
lpReturnLength lpJobObjectInfo 파라미터가 위치한 구조체에 저장된 데이터데 길이를
받는 변수 포인터.
12. 2. 잡 내에 프로세스 배치하기
잡 내에 배치시켜주는 함수
책 예제소스에 있는 StartRestrictedProcess함수 내부의 CreateProcess
13. 3. 잡 내의 모든 프로세스 종료하기
TerminateProcess 함수를 이용해서 프로세스를 종료할 수 있다.
TerminateJobObject 함수를 이용해서 잡 내의 프로세스들을 종료한다.
#2:가볍게 설명을 해보자면 원래 process는 부모자식간에 그룹단위로 관리를 할 수가 없다.
예를들면 부모프로세스를 종료해도 자식프로세스가 종료되지 않는다.
때문에 따로 그룹을 설정하여 관리할 수 있도록 해주는 기능을 하며 process가 돌아가는 환경에 대한 제약을 걸 때 사용한다.
주로 메모리제한이나 cpu 사용시간을 제한하는 경우을 예로 들수있다.
잡 오브젝트는 오브젝트 내의 모든 프로세스가 종료되면 제거된다.
#3:시스템 리소스에 대한 접근과 UI의 기능들(종료,로그아웃 등), 보안요소(레지스트리)에 대한 접근을 제한할 수 있다.
#4:● 기본 제한사항과 확장 제한사항은 잡 내의 프로세스가 시스템 리소스를 독점적으로 사용하지 못하도록 합니다.
● 기본 UI 제한사항은 잡 내의 프로세스가 사용자 인터페이스를 사용하지 못하도록 합니다.
● 보안 제한사항은 잡 내의 프로세스가 보안 자원에 접근하지 못하도록 한다.
#6:프로세스가 많이 참조하는 페이지 집합을 메모리 공간에 계속 상주시켜 빈번한 페이지 교체현상(스레싱)을 줄이는 방법
스레싱 - page fault가 빈번하게 발생하여 페이지교체(swap-in, swap-out)하는 시간이
많아지는 현상을 말한다.
워킹셋은 운영체제단에서 스레싱을 해결하는 방법중 하나이다.
퀀텀시간은 스케쥴링을 할때 한번 작업을 할때 얼만큼의 시간동안 작업을 하고 교체할건지를 뜻한다.
#11:사용자 계정은 처음 생성 할 때 자동으로 보안 식별자(SID)를 할당 받게 된다.이 보안 식별자는 계정을 식별하는 유일한 번호라고 생각 하면 된다.한번 설치 후 다시 재 설치 하더라도 다시 사용 하는 일은 절대 없다는 것을 알아 두어야 하며, 계정을 삭제 하게 된다면 기존에 SID 가 삭제 된다는 점도 알고 있어야 한다.
#12: 잡에 제한사항을 설정하기에 앞서 어떠한 제한사항
이 설정되어 있는지 알고 싶을 수 있다. 이 경우 QueryInforamtionJobObject 함수를 호출하면 된다.
#13:이제 StartRestrictedProcess 함수로 다시 돌아가 보자. 잡에 몇 가지 제한사항을 설정하고 CreateProcess 함수를 호출하여 잡 내에 배치할 프로세스를 생성한다. 실제 코드를 보면 CreateProcess 함수를 호출하여 새로운 로세스를 생성할 때 프로세스가 코드를 바로 수행하지는 못하도 록 CREATE SUSPEND 플래그를 사용하고 있다. 왜냐하면 Sta rtRestrictedProcess를 호출한 프로 세스는 잡 내에 포함된 프로세스가 아니므로 새로 차일드 프로세스를 생성하였을 경우 자동적으로 잡 내에 배치되지 않는다. 따라서 차일드 프로세스가 바로 코드를 수행하면 잡을 통해 부여한 제한사 항이 새로 생성한 프로세스에 적용되지 않게 된다. 따라서 새로 프로세스를 생성한 경우 코드를 수행 하기 전에 반드시 앞서 생성한 잡 내에 프로세스를 배치하여야 한다.
이 힘수를 호출하변 시스템은 잡 내부로 (hProcess 가 가리키는) 프로세스를 배치한다. 이 함수는 매개 변수로 전달한 프로세스가 다른 잡 내에 포함되어 있지 않은 경우에만 성공한다. 따라서 IsProcessIn]ob 함수를 이용하여 매개변수로 전달할 프로세스가 다른 잡 내에 포함되어 있는지를 먼저 확인해 야한다. 만일 이미 잡내에 매개변수로전달할프로세 가포함되어 있는경우라면 다른잡으로프로 세스를 옮기거나 잡과 연관성이 없도록 프로세스를 분리히는 것은 불가능하다.
StartRestrictedProcess 함수에서는 AssignProcessTo]obObject를 호출한 이후에야 비로소 새로 생성된 프로세스가 잡 내부로 배치된다. 이후 ResumeThread를 호출하여 프로세스의 레드가 잡 의 제한사항 내에서 코드를 수행할 수 있도록 한다.
#14: 잡 내의 모든 프로세스를 종료하기 위해서는 단순히 TerminateJobObject 함수를 호출해 주면 된다.
이 함수는 잡 내의 모든 프로세스에 대해 TerminateProcess를 호출히는 것과 유사하다. 프로세스의 모든 종료 코드는 uExitCode로 전달한 값으로 설정된다.
#15:잡 내의 모든 프로세가 종료되거나 허락된 CPU 시간을 모두 사용하였을 때 혹은 잡 내에서 새로운 프로세스가 생성되었음을 알고 싶거나, 잡 내 의 특정 프로세스가 종료되었는지의 여부를 전달받고 싶을때 통지박는 방식인데
이벤트 형식이라고 보면 될듯 하다.
잡 오브젝트는 잡 내의 프로세스가 허락된 CPU 시간을 모두 사용하지 않았을 경우 Non – Signal 상태를 유지한다. 하지만 CPU 시간이 모두 사용되는 순간 잡 내의 프로세스들을 강제로 종료함과 동시에 잡 오브젝트를 Signal 상태로 변경한다. 이러한 상태 변경 은 WaitForSingleObject 함수(혹은 이와 유사한 함수)를 호출하여 쉽게 확인할 수 있다. 잡 오브젝트 를 다시 논시그널 상태로 변경하려면 SetInformationJobObject 함수를 호출하여 추가로 CPU 시간을 사용할 수 있도록 해 주면 된다.
프로세스의 생성과 종료와 같은 “향상 된” 통지를 어떻게 다룰 수 있는지에 대해서는 아직 설명하지 않았다. 만일 이러한 향상된 통지가 필 요한 경우라면 애플리케이션에 부수적인 작업들을 수행해야 한다.
구체적으로 말하면, I/0 컴플리션 포트 커널 오브젝트를 생성하고 그것을 잡 오브젝트나 다른 오브젝트들과 연결해야 한다. 이후 하나 이상의 스레드를 새로 생성해서 잡 통지를 기다리고 있다가 잡 통지가 발생하면 앞서 생성해 둔 스레드 중 하나가 특정 작업을 수행하도록 해야 한다
새로 생성된 스레드는 I/0 컴플리션 포트로부터 정보를 가져오기 위해 GetQueuedCompletionStatus 함수를 호출해야 한다. 이 함수는 워커스레드에서 완료보고를 기다리기위해 사용된다.
CompletionPort
CP는 CreateIoCompletionPort(:12) 함수로 만든 CP 핸들.
lpNumberOfBytes
입출력 완료 연산의 결과로 전송된 데이터의 크기.
lpCompletionKey
lpOverlapped
중첩 연산의 정보를 가지고 있는 OVERLAPPED 구조체를 가리키는 포인터.
dwMilliseconds
입출력 완료 대기열에서 기다리는 시간.
dwMilliseconds시간동안 완료 보고가 없으면 FALSE를 반환한다. 시간을 초과한 경우 lpOverlapped는 NULL을 반환한다. 만약 INFINITE를 지정하면 완료 보고가 있을 때까지 영원히 기다린다
성공하면 0을 실패하면 다른값을 반환한다.
#17:마지막으로 주의해야 할 사항은 기본적으로 잡 오브젝트 내의 프로세스들이 허락된 CPU 시간을 모두 사용했을 경우 잡 내의 모든 프로세스는 자동적으로 종료되며, 이때 END_OF_JOB_TIME 통지는 전달되지 않는다는 것이다. 만일 잡 오브젝트가 프로세스들을 종료시키지 않 고 CPU 시간을 초과하였음을 알리는 통지만 받고 싶다면 다음과 같이 코드를 작성하면 된다.
#18:안정성 및 성능 모니터를 통해 잡 오브젝트의 성능을 확인할 수 있다. 또한 애플리케이션은 I/0 컴플리션 포트를 생성하고 잡 오브젝트와 연결하여 잡 오브젝트에서 발생한 이벤트를 창 하단의 리스트 박스에 출력해 준다.
예제코드에 주석이 달려있으니 참고하면 될듯하다.