10.커널오브젝트와 핸들의 종속관계

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

 

“커널 오브젝트는 os에 종속적이다.”

 

 

커널 오브젝트는 프로세스에 종속적인것이 아니라, 운영체제에 종속적인 관계로 커널 오브젝트의 소멸 시점은 운영체제에 의해 결정된다. 

 

 

 

 

프로세스 A가 생성되면 프로세스 A의 커널 오브젝트(핸들값 3)가 생성되고 프로세스 A만의 핸들 테이블이 생성된다.

 

이 핸들 테이블에는 핸들값 3이 등록된다. 이 핸들값 3은 A의 커널 오브젝트를 가리킨다. 그리고 커널 오브젝트의 UC(접근가능한 카운터)는 1이 증가된다.

 

프로세스 A가 프로세스 B를 생성한다. 프로세스 B의 커널 오브젝트가 생성되고 핸들값 3이 생성된다. 이때 UC는 2가 된다. 

프로세스 A에 의해 B가 생성되었기 때문에 프로세스 A 도 프로세스 B에 접근가능하다. 내부적으로는 프로세스 A의 핸들 테이블에는프로세스 B의 핸들 값이 7로 기입된다.  왜냐면 프로세스 A 핸들테이블에 3이라는 값이 있기 때문이다. (핸들값, 핸들 테이블은 프로세스에 종속적이다. )

 

 

만약 프로세스 B가 소멸되었다면 프로세스 B의 커널 오브젝트도 소멸될까? 아니다. 프로세스 A가 아직 참조하고 있기 때문에, 운영체제가 프로세스 B의 커널 오브젝트를 소멸시키지는 않는다. 대신 프로세스 B의 UC를 1 감소시킨다. 이후 프로세스 A가 프로세스 B 의 커널 오브젝트 참조가 종료되면 프로세스 B의 UC 가 0 이 되고 이때 운영체제가 프로세스 B의 커널 오브젝트를 종료 시킨다.

 

 

 

 

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

 

 

참고 : 실제 위의 내용에서 프로세스 A가 생성될때, 프로세스 A의 핸들 테이블에 A의 핸들값은 기록이 되지 않는다. 

 

그럼 어떻게 프로세스 A의 핸들값을 알 수 있나?

 

 

 

 

위의 함수에서 GetCurrentProcess() 함수를 호출했을때, 프로세스 A이건, 프로세스 B이건, 시스템 내부적으로 -1의 상수값을 리턴한다.

 

이때 -1은 자기 자신의 프로세스값이라고 SetCurentProcessClass가 인식을 한다.

 

그래서 프로세스 A의 커널 오브젝터 값은 2이다. 프로세스 A를 생성한 부모 프로세스가 접근을 할 수 있고(1),

 

또 GetCurrentProcess를 통해서 접근이 가능(1) 하기 때문이다.

 

즉, 핸들테이블에 등록되어서 UC 카운터가 1이 증가되는것이 아니라는 걸 알 수 있다.

 

그리고 main 함수에서 return 0 이나 -1을 해주는데 이것의 의미는?

 

부모프로세스가 자식 프로세스를 생성하는데, 자식프로세스가 제대로 종료되었는지, 부모 프로세스에게 알리기 위해서다.

 

이때 이 값은 자식 프로세스의 커널 오브젝트에 들어가서 1이면 정상 종료라고 알려주고 -1이면 비정상종료라고 알려준다.

왜냐면 부모프로세스는 아직 자식프로세스의 커널오브젝트를 참조하고 있기 때문에, 이런 정보를 알 수 있어야 한다.

(이미 자식 프로세스가 종료되어 버린상황에서 자식프로세스의 정보를 알수 있는 곳이 없기때문이다.)

 

그래서 커널오브젝트의 UC 카운터가 아직 0이 아닌 것들은 다른곳에서 참조하고 있기 때문에 운영체제가 남겨두는것이다.

 

exit(1), exit(3) 등도 마찬가지다. 

 

예제

 

 

참고 

뇌를 자극하는 윈도우즈 시스템 프로그래밍 정리 - 한빛출판네트워크

 

 

 

 

'컴퓨터 기초 > 운영체제 이론' 카테고리의 다른 글

12.프로세스 환경 변수  (0) 2021.01.20
11.프로세스간 통신 IPC  (0) 2021.01.20
9.커널 오브젝트  (0) 2021.01.19
7.Direct 모드와 Indirect 모드  (0) 2021.01.19
6.Load * Store 명령어 디자인  (0) 2021.01.18