LISTORY
[윈도우즈 시스템 프로그래밍] 2부 정리 (3) 본문
커널 오브젝트와 핸들
⊙ 커널 오브젝트란?
커널에 의해 관리되는 리소스 정보를 담고있는 데이터 블록이다.
리소스란 운영체제에 의해 생성 및 소멸되는 것을 말한다.
리소스는 프로그램에 의해 생성 및 소멸되기도 하지만, 운영체제에 의해 그렇게 되는 것도 존재한다.
이러한 리소스를 관리해 주는 것이 커널 오브젝트이다.
만일 우리가 리소스에 대한 요구사항(삭제, 생성 등)이 있을 경우, 이 요구 사항을 들어주는 것이 커널이다.
요구 사항을 들어주기 위해서는 리소스를 컨트롤 할 수 잇는 정보들(접근 정보, 파일을 어디까지 읽었는지에 대한 정보)을 가지고 있어야 하는데, 이러한 정보를 담은 데이터 블록을 커널 오브젝트라 한다.
윈도우즈에 의해 관리되는 모든 리소스는 커널 오브젝트의 생성을 동반한다.
⊙ 프로세스 기반 커널 오브젝트
프로세스 생성 함수 호출을 하면, 그 요청은 운영체제에 전달된다.
운영체제는 요청과 함께 전달받은 데이터들로 프로세스와 프로세스 커널 오브젝트를 동시에 생성한다.
커널 프로세스는 프로그래머가 접근할 수 없고 오직 운영체제에 의해서만 조작되는 영역이다.
만일, 개발자가 특정 이유로 커널 프로세스에 접근해야만 때가 있다. 이러한 경우르르 대비하여 나온 것이 핸들 정보이다.
프로세스가 생성될 때, 프로세스 커널 오브젝트가 같이 생성되고 운영체제는 이를 구분하기 위해 번호를 매긴다.
이 번호를 핸들이라고 한다.
즉, 커널 오브젝트에 직접 접근하지 못하지만, 핸들을 통해 요청을 보낼 수 있다.
⊙ 커널 오브젝트와 핸들의 종속관계
커널 오브젝트와 핸들의 관계
프로세스가 생성되면 프로세스의 커널 오브젝트와 핸들 테이블이 생성된다.
이때 프로세스에 접근 가능한 사용자의 수를 UC라고 한다.
프로세스가 생성되면 생성된 프로세스에 의해 자기 자신의 커널 오브젝트에 접근이 가능하므로,
프로세스가 생성되었을 때 UC는 1이다.
만일 어떤 프로세스가 자식 프로세스를 생성한다면, 자식프로세스의 UC는 2이다.
부모에서 접근 가능하기 때문이다.
앞서 말했듯이, 프로세스 커널 오브젝트가 생성될 때 운영체제는 이를 구분하기 위해 핸들을 만든다.
하지만 핸들 값이라는 것은 프로세스에 종속적이다. (프로세스 내부에서만 의미를 가진다.)
프로세스간 통신(IPC)
프로세스간 통신
- 둘 이상의 프로세스 간에 데이터를 송수신 하는 것(메모리 공유)
프로세스간 통신은 프로세스가 데이터를 주고 받기 위해 어떠한 공간을 만들어 두고, 그 공간을 통해 데이터를 공유하는 것을 말한다.
프로세스의 메모리 영역은 완전히 분리되어 있어 다른 프로세스의 공간을 알 수 없다.
그래서 공유할 데이터를 저장할 곳을 OS가 따로 제공해준다.
이것을 IPC 기법이라고 한다.
⊙ 메일 슬롯
두 개의 프로세스가 있다. 하나는 Sender, 하나는 Receiver라고 해보자
Sender는 Receiver에게 데이터를 보내는데, 이를 위해 OS가 Receiver에게 메일 슬롯을 생성해준다.
Sender는 이 메일슬롯의 주소를 알면 여기에 데이터를 보낼 수 있다.
Receiver는 메일슬롯에서 데이터를 가져온다.
이는 단방향 통신이다.
⊙ Signaled vs Non-Signaled
커널 오브젝트의 상태
커널 오브젝트?
- 커널의 리소스 정보를 담고 있는 데이터 블록
커널 오브젝트의 멤버 중엔, 커널 오브젝트의 상태를 반영하기 위한 boolean형 멤버가 존재한다.
이멤버의 값에 따른 커널 오브젝트의 상태는 다음과 같다.
TRUE : SIGNALED 상태
FALSE : NON-SIGNALED 상태
리소스를 생성하면 커널 오브젝트가 생성되고, 커널 오브젝트는 생성과 동시에 Non-Signaled 상태가 된다.
즉, 프로세스가 실행 중일 때와 종료되었을 때로 나뉘며, 이때 상태는 각각 Non-signaled, Signaled 상태가 된다.
이렇게 가지고 있는 이유는 커널 오브젝트의 핸들을 가지고 있는 프로세스가 커널 오브젝트 프로세스의 현재 상태를 알 수 있게 하기 위해서 이다.
부모 프로세스는 이를 통해 자식 프로세스의 생사 여부를 확인할 수 있는데,
이를 알려주는 함수가 WaitForSingleObject()이다.
이 함수를 호출하면 상태에 따라 반응이 다르다.
1. Signaled : 바로 반환
2. Non-Signaled : blocking. 함수가 빠져나오지 않고 멈춘다 / 또는 바로 반환
즉, 이 함수는 오브젝트의 상태값을 반환하는 것이 아니라, 해당 오브젝트가 signaled 상태가 될 때까지 기다리는 함수이다.
'IT > 윈도우 프로그래밍' 카테고리의 다른 글
[윈도우즈 시스템 프로그래밍] 쓰레드 동기화 기법1 (0) | 2018.09.03 |
---|---|
[윈도우즈 시스템 프로그래밍] 2부 정리 (4) (0) | 2018.09.02 |
[윈도우즈 시스템 프로그래밍] 2부 정리(2) (0) | 2018.09.01 |
[윈도우즈 시스템 프로그래밍] 2부 복습 (1) (0) | 2018.08.30 |
[윈도우즈 시스템 프로그래밍] 1부 정리(3) (0) | 2018.08.19 |