2015년 11월 10일 화요일

windows programming 공부하면서..(8)

커널 노브젝트와 핸들의 종속관계


커널 오브젝트와 종속관계

종속적이다 : '독립적이지 못하다.'는 뜻

- 커널 오브젝트는 프로세스의 종속적인 것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸시점은 운영체제에 의해서 결정된다.
- 커널 오브젝트는 프로세스에 종속적인 것이 아니라, 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근 가능하다. (물론 함수 호출을 통한 간접 접근이다.)


핸들의 종속 관례

- 핸들(핸들 테이블)은 운영체제에 종속적이지 않고 프로세스에 종속적이다. 이 부분에 대해서는 뒤에 핸들부분을 공부할 때 좀 더 자세히 공부하도록 하며, 핸들은 OS가 아닌 프로세스 종속적이라는 사실만 짚고 넘어가자.

종속관계 예제

예제 : " A프로세스가 B프로세스를 생성한다. 그러자 B프로세스는 자신의 우선순위를 높인다. 잠시 후 자존심이 상한 A프로세스는 B프로세스의 우선순위를 원래대로 돌려 놓는다."

여기서 A프로세스가 B프로세스 우선순위를 변경시킨다는 것은, B프로세스의 커널 오브젝트에 A프로세스가 접근이 가능하다는 것이 된다.

A프로세스 : KerObjShare.exe
B프로세스 : Operation.exe



위 소스에서 구조체 변수인 pi의 멤버는 아래와 같은 구조를 가진 구조체이다.




위 프로그램의 프로세스에 대해 그림으로 표현하면 아래와 같이 그릴 수 있다.


여기서 또 알아둘 것은 Operation2.cpp와 KerObjShare.cpp에서 접근하는 커널 오브젝트는 동일하지만, 핸들을 얻는 방법은 다른 것을 확인할 수 있다. 곧, 상황에 따라서 다양한 방법으로 접근하는 방법이 있다는 것을 기억해 두어야 한다.

위 프로그램을 실행해 보면, 처음에 Operation2.exe가 주로 실행되다가 일정 시간이 지나서는 실행되는 비중이 많이 비슷해진다는 것을 확인할 수 있다. 여기서 중요한 것은 SetPriorityClass 함수 호출을 통해서 Operation2.exe의 우선순위가 KerObjShare.exe와 같아 졌다고 하더라도 실행시간의 배분에는 약간의 차이가 있다는 점이다.( 스케줄링 알고리즘과 관련된 부분)

여기서 우리가 실습 통해 확인할 수 있던 점을 확인하면 아래와 같다.

" 커널 오브젝트는 프로세스에 종속적인 것이 아니라 운영체제에 종속적인 관계로 여러 프로세스에 의해서 접근이(공유가) 가능하다. "



PROCESS_INFORMATION 구조체

위에 언급하지 않았던 PROCESS_INFORMATION 구조체의 두, 세, 네 번재 멤버들에 대해서 살펴 보도록 하겠다.




세 번째 멤버 'dwProcessId'는 새로 생성되는 프로세스 ID 정보로 채워지게 된다. 다시 프로세스의 핸들과 ID의 차이점을 정리하면 아래와 같다.

" 프로세스 핸들은 프로세스의 커널 오브젝트를 가리키기(구분짓기) 위한 것이고, 프로세스 ID는 커널 오브젝트가 아니라 프로세스 자체를 구분짓기 위한 것이다."

두 번째와 네 번째 멤버에 대해서 설명하기 전에, 우선 쓰레드에 대해서 간단하게 알아야 할 것이 있다. Windows 운영체제는 프로세스를 생성하면, 프로세스 내부적으로 쓰레드라는 개념의 '가벼운(Light Weight) 프로세스'를 생성해서 이를 통해 main 함수가 호출되게끔 디자인 되어 있다.
 쉽게 정리하면, CreateProcess 함수를 통해서 프로세스가 생성되면, 쓰레드라는 시스템 리소스도 함께 생성되는 것이다. 바로 이 쓰레드의 핸들과 ID 정보가 각각 두 번째, 네 번째 멤버에 채워지게 되는 것이다.

댓글 없음:

댓글 쓰기