Win System Programming
커널 = 운영체제에서 꼭 필요한 부분
프로세스를 생성하면 프로세스 정보(우선순위 등)를 가지고 있는 프로세스 커널 오브젝트를 생성한다. 직접 접근할 수는 없고 프로세스, 파일, 파이프 등등을 만들 때마다 커널 각각의 커널 오브젝트가 생성되는데. 각각에 순서에 맞게 번호를 붙인다. 그것을 핸들이라고 한다(자료형은 Handle이지만 int형이다.) 핸들을 통해 간접적으로 커널 오브젝트에 접근할 수 있다.
sleep( ) 함수는 프로세스를 blocked 상태로 보낸다.
프로세스마다 핸들 테이블이 있는데 핸들테이블의 핸들 값은 프로세스 or 파일 종속 적이어서 같은 커널 오브젝트를 가리키고 있어도 프로세스마다 핸들 값이 다를 수 있다.
프로세스 A 가 프로세스 B를 생성할 때 A는 B의 핸들 값을 반환받는다 그럼 프로세스 B의 커널 오브젝트에 접근할 수 있는 핸들이 2개 이므로 B의 커널 오브젝트의 UC(usage count?)는 2이다. A 또한 탐색기 등의 부모 프로세스에서 실행되었으므로 2이다. 0이 되면 운영체제에서 종료시킨다. 파일의 커널 오브젝트를 삭제한다고 해서 파일이 없어지는 것은 아니다.
또 자식의 프로세스B 가 종료된다 해도 B의 커널 오브젝트를 바로 안 없애는 이유는 B의 종료 정보를 가지고 있기 때문이다. 부모 프로세스 A가 B가 어떻게 종료되었는지 B의 커널 오브젝트를 보고 알 수 있기 때문이다.
프로세스 A 자기자신의 핸들 테이블에 자신의 핸들 값은 없다 왜냐면 getcurrentprocess 함수를 사용할 때 반환하는 값은 아마도 -1 고유의 값인데 그 값을 통해 컴퓨터는 자기 자신의 우선순위를 말하는 거구나 를 알 수 있다. 그러므로 자신의 커널 오브젝트는 고유값으로 접근할 수 있으니 uc가 2가 된다.
int _tmain(int argc, TCHAR* argv[])
{
STARTUPINFO si = {,0};
PROCESS_INFORMATION pi;
CreatProcess( ~, ~ , &si, &pi ); //
SetPriorityClass(pi.hProcess, NORMAL_PRIORITY_CLASS);
}
프로세스 생성 함수가 대충 이런 식으로 있을 때 생성한 프로세스의 핸들 정보는 pi.hProcess에 저장된다.
만약 자식 프로세스가 종료되고 부모는 계속 살아서 자식 프로세스를 생성하는데 자식 프로세스의 커널 오브젝트에서 종료 코드도 보았다면 구지 자원낭비로 자신의 핸들테이블에 자식 프로세스의 커널오브젝트 핸들을 가지고 있을 필요가 없다.
CloseHandle(pi.hProcess);