삽질의 현장/- 윈도우 시스템

#017_WIndow_System_리소스

shovelman 2015. 9. 21. 23:17


안녕하세요 삽잡이입니다.

이번 시간에는 리소스에 관해서 생각해보는 시간을 가져보도록 하겠습니다.


프로세스는 우리가 더블클릭해서 실행될 수 있지만, 다른 프로세스에 의해 실행될 수 있습니다.

이와 같은 경우는 커널 오브젝트에서는 쓰레드와 프로세스가 있습니다.

create 함수에 의해 생성될 수 있지만, 

프로세스와 쓰레드는 다른 프로세스에 의해 실행 될 수도 있다는 것입니다.


프로세스는 쓰레드와 함께 리소스가 사라져도 

해당 프로세스나 쓰레드의 정보를 받아가기 위한 정보가 존재하는 특징을 가지고 있습니다.

다른 놈들은 이벤트가 제거되면 더 이상 이벤트를 사용할 놈이 없기 때문에 필요 없습니다.

즉, 리소스가 없어지는 순간 커널 오브젝트의 의미가 없어진다는 것입니다.


하지만, 프로세스나 쓰레드는 리소스가 없어도 정보를 가져야합니다.

이 프로세스가 죽었는지 살았는지에 대한 판단을 원하는 놈들이 많고,

프로세스가 죽었다면 마지막에 죽인 값 즉, 종료 코드를 확인하고자 하는 놈들이 존재하기 때문입니다.


다른 놈들은 커널 오브젝트와 커널 리소스가 같이 생성되고 같이 사라지는데,

프로세스와 쓰레드는 별개라는 것입니다. 특별한 놈이라는 것입니다.


거기다가, 프로세스나 쓰레드는 자기 스스로 생성됬다가 자기 스스로 사라질 수 있습니다.

자기 스스로라는 뜻은, 예를 들어 메모장이 다른 프로세스에 의해 실행되는 것이 아니라

스스로 실행되고 종료될 수 있다는 것입니다.

더블 클릭하면 메모장이 생성되고 x 아이콘을 누르면 사라지지 않습니까...


메인 프로세스라는 가정하에,

프로세스가 딱 메모리상에 올라오면 커널 오브젝트가 만들어집니다.

동시에 쓰레드의 커널 오브젝트도 만들어지죠...


그렇게 되면 커널 오브젝트에 usage count는 자동으로 2가 됩니다.

왜 2일까요? 커널 리소스가 죽어도 커널 오브젝트의 정보가 유지되어야 되기 때문입니다.

즉, 누가 됬던지 나를 사용하고자 하는 핸들이 분명히 존재하게 되어있으니

usage count가 2가 되는 것입니다.


정리하자면

외부에서 커널 오브젝트를 참조할 놈이 있기 때문에 1,

내 프로세스가 커널 오브젝트와 독립적으로 살아있거나 죽을 수 있기 때문에 1,

그래서 usage count가 초기에 2가 되는 것입니다.


커널 오브젝트와 쓰레드에는 exit code라고 담을 수 있는 공간이 있습니다.

모든 커널 오브젝트에는 신호/비신호, ID, usage count에 대한 정보가 있는데,

프로세스, 쓰레드에는 exit code를 담을 수 있는 방이 따로 더 있습니다.


프로세스 본인 말고도 커널 오브젝트의 생사여부에 관심 있는 놈들이 있을 수 있기 때문에

커널 리소스를 죽여도 커널 오브젝트는 존재할 수 있어야한다는 것입니다.

프로세스의 ID를 가지고 얼마든지 커널 오브젝트를 받아갈 수 있습니다.


프로세스와 쓰레드 커널 리소스는 외부에서 얼마나 사용하는지 알 수 없습니다.

따라서 이와 같은 방법을 사용하는 것입니다.

그래서 프로세스와 쓰레드는 특별한 커널 오브젝트입니다.



정말로... 헷갈릴 수 있으니 

지난 시간 내용을 포함하여 마지막으로 정리를 해보도록 하겠습니다.


프로세스의 핸들 테이블은 상속 될 수 있습니다.

커널 오브젝트들은 각각의 상속 여부를 결정할 수 있습니다.

커널 오브젝트와 리소스는 분류되어 나눠질 수 있습니다.

다른 것들은 몰라도 프로세스와 쓰레드는 분류되어 다뤄야합니다!

프로세스와 쓰레드는 usage count를 초기에 2로 갖습니다.

왜냐하면, 외부(쉘)에서 내가 각각 usage count를 1씩 증가시켰기 때문이죠...


이상 삽잡이였습니다!