오다기리 박의 알고리즘 노트

6장. 커널 오브젝트와 오브젝트 핸들 본문

운영체제

6장. 커널 오브젝트와 오브젝트 핸들

오다기리 박 2018. 8. 8. 23:18

6장. 커널 오브젝트와 오브젝트 핸들

1. 커널 오브젝트


커널이란 컴퓨터를 운영하는 데 있어서 중심이 되는 운영체제 핵심 부분

커널 오브젝트란 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록


  • 커널 오브젝트의 이해

    • 프로세스를 생성, 관리하는 주체는 운영체제

    • 프로세스가 생성될 때마다 ‘프로세스 관리 구조체’ 변수가 하나씩 생성되고 새롭게 생성된 프로세스 정보들로 초기화된다. -> 커널 오브젝트!!

    • 프로그래머가 직접조작 불가

  • 그 이외의 커널 오브젝트들

    • 프로세스 내에서 프로그램 흐름을 구성하는 쓰레드를 생성할 때, IPC(Inter Process Communication)를 위해 사용되는 파이프나 메일슬롯을 생성할 때에도 커널 오브젝트 생성.

    • Windows에서는 파일을 생성할 때에도 커널 오브젝트 생성. (파일조차도 Windows 커널에 의한 관리 대상이므로)

    • 커널 오브젝트의 종류에 따라서 서로 다른 구조체를 기반으로 생성된다.

    • Windows 운영체제는 프로세스, 쓰레드 혹은 파일과 같은 리소스들을 원활히 관리하기 위해 필요한 정보를 저장해야 한다. 이때 데이터를 저장하는 메모리 블록이 커널 오브젝트이다.



  • 오브젝트 핸들을 이용한 커널 오브젝트의 조작

    • Windows에서 관리하는 리소스의  특성을 변경 시키려면 시스템 함수를 이용하여 커널 오브젝트를 간접적으로 조작해야한다.

    • ex) 프로세스의 우선순위 변경


      • BOOL SetPriorityClass(
        HANDLE hProcess, -> 우선순위를 변경할 프로세스의 핸들
        DWORD dwPriorityClass  -> 새롭게 적용할 우선순위 정보를 전달
        );
        이 함수로 hProcess가 가리키는 프로세스의 우선순위를 dwPriorityClass로 변경시킨다.


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


  • 커널 오브젝트의 종속 관계

    • 커널 오브젝트는 프로세스에 종속적인 것이 아니라, Windows 운영체제에 종속적이다.

      • CreateProcess호출은 프로세스 생성에 대한 요청이며 운영체제가 커널 오브젝트를 생성하는 것이다.

    • 커널 오브젝트의 소멸시점은 운영체제에 의해서 결정된다.

    • 커널 오브젝트는 여러 프로세스에 의해서 접근이 가능하다. (함수 호출을 통한 간접 접근)

  • 핸들의 종속 관계

    • 핸들(핸들 테이블)은 운영체제에 종속적이지 않고 프로세스에 종속적이다.

  • 예)

    • “A 프로세스가 B 프로세스를 생성한다. 그러자 B 프로세스는 자신의 우선순위를 높인다. 잠시 후 열받은 A 프로세스는 B 프로세스의 우선순위를 원래대로 돌려 놓는다.”
      -> A 프로세스가 B 프로세스 우선순위를 변경시킨다는 것은, B 프로세스의 커널 오브젝트에 A 프로세스가 접근 가능하다는 뜻이 된다. 이는 하나의 커널 오브젝트에 둘 이상의 프로세스가 접근 가능하다는 결론으로 이어진다.


3. 커널 오브젝트와 Usage Count


  • CloseHandle 함수

    • A 프로세스 생성하면 A 프로세스를 위한 커널 오브젝트 생성
      A 프로세스 소멸하면 A 프로세스를 위한 커널 오브젝트 소멸될 수도, 안될 수도.

    • CloseHandle(B) : B 프로세스에 대해서 더 이상 관여할 바 아니니 핸들을 반환하면서 커널 오브젝트의 Usage Count - 1

  • 커널 오브젝트와 Usage Count

    • 자식 프로세스의 종료코드는 자식 프로세스의 커널 오브젝트에 저장된다.

    • 때문에 프로세스가 종료되었다고 해서 커널 오브젝트까지 동시에 소멸시키지는 않는다.

    • Windows는 커널 오브젝트를 참조하는 대상이 하나도 없을 때(커널 오브젝트의 Usage Count (참조 횟수)=0일 때)  커널 오브젝트를 소멸시킨다.

    • 프로세스는 생성과 동시에 Usage Count =1

    • 커널 오브젝트에 접근 가능한 대상(핸들)이 늘어날 때마다 Usage Count +1

    • 프로세스(or쓰레드) 종료시  Usage Count - 1

    • 자식 프로세스 생성이 완료되면 부모 프로세스가 CreateProcess 호출 과정에서 PROCESS_INFORMATION 구조체를 통해 자식 프로세스의 핸들을 얻기 때문에 실제로 Usage Count는 2가된다.  (프로세스와 쓰레드만 해당)

  • Usage Count와 CloseHandle

    • 프로세스 종료

    • CloseHandle

    • 부모 프로세스는 자식 프로세스 생성후, CloseHandle로 핸들을 반환해줘야 Usage Count=1이 되어 자식 프로세스 종료시에 커널 오브젝트가 소멸 될 수 있다.