학교에서 리눅스 시스템 프로그래밍에 대해서는 수강하였으나 윈도우 시스템 프로그래밍은
따로 배우지 않아서 자료를 찾다보면 윈도우에서 사용하는 시스템 용어들이 나오면 당황스러울 때가 많았다.
그중에서 꼭 알아야 한다고 생각하는 것은 커널 오브젝트라는 용어 였다고 생각하였다.
https://ko.wikipedia.org/wiki/%EC%BB%A4%EB%84%90_(%EC%BB%B4%ED%93%A8%ED%8C%85)
커널 (컴퓨팅) - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org

우선 커널이란 용어가 상당히 포괄적인 단어라고 생각한다. 저번 학기 시스템 프로그래밍 교수님께서
커널과 운영체제를 구분지어서 보는 경우도 있지만 대부분의 경우에 커널을 운영체제라 생각해도 무방하다!
라고 언급을 하셨던게 아직도 기억이 난다. 지금이야 커널이 운영체제의 아랫단에서 하드웨어를 직접적으로 통제하고 개발자가 그런 부분들을 건드릴 필요 없게 하는 역할을 한다는 것을 어렴풋이 알게 되었지만 다시 생각해 보아도 굳이 구분을 지을 필요는 없다고 생각한다.
어찌되었던 커널은 그림과 같이 컴퓨터의 하드웨어적인 부분을 직접 관리하여 개발자로 하여금 보안과 안정성을 책임지는 역할을 한다. 예를 들어 어떤 변수가 메모리의 어느 위치에 저장되는 지는 운영체제의 커널에서 관리를 하기 때문에 개발자 입장에서는 변수를 선언하고 저장을 할 뿐, 위치에 대해서는 신경 쓰지 않아도 되는 이유가 운영체제의 커널 덕분이다.
- 커널 오브젝트
커널 오브젝트란 말 그대로 커널이 관리하는 오브젝트이다. 예를 들어 쓰레드, 프로세스, 소켓, 이벤트, 뮤텍스, 세마포어 등등 모두 커널에서 관리되는 데이터들이다.
이들은 개발자가 필요에 의해 생성시 운영체제에 의해 커널에서 생성, 관리된다. 개발자는 윈도우에서 제공하는 API를 통해 이 커널 오브젝트를 제어할 수 있고, 커널 오브젝트를 직접적으로 접근하는 것은 커널이기 때문에 개발자가 커널 오브젝트를 직접 조작하는 것은 불가능하다.
이는 객체지향 프로그래밍에서 언급되는 캡슐화(encapsulation)와 비슷하다. 사용자 입장에서는 내부의 구조를 파악할 필요가 없으며 인터페이스만 제공이 되는 것과 같은 이치라고 생각한다. 특히나 하드웨어적인 부분은 개발자가 잘못 건드렸다가 잘못되는 경우가 있을 수도 있기때문에 보안이나 안정성면에서 봤을 때, 커널 오브젝트에 직접 접근하지 못하게 디자인되어 있다고 한다.
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE,NULL);
커널 오브젝트는 생성시 핸들(handle)을 반환하여 이 핸들을 통해 커널 오브젝트를 제어할 수 있다. 사실 이 부분은 리눅스 시스템 프로그래밍에서 배웠던 파일 디스크립터와 유사한 개념이다. 리눅스에서는 모든 것을 파일로 취급하기 때문에 따로 핸들을 사용하지 않을 뿐, 핸들은 윈도우에서보면 커널 오브젝트에 한정되는 디스크립터이다.
커널 오브젝트또한 사용 후에는 핸들을 통해 반환해야 하는데 이 또한 CloseHandle이라는 API를 이용하여 가능하다.
'시스템' 카테고리의 다른 글
[시스템 프로그래밍] 프로그램과 프로세스 (0) | 2024.08.03 |
---|---|
[시스템 프로그래밍] - Linux / 파일 시스템 (0) | 2022.07.14 |