LISTORY

[윈도우 시스템즈 프로그]커널 오브젝트에 대한 이해 본문

IT/윈도우 프로그래밍

[윈도우 시스템즈 프로그]커널 오브젝트에 대한 이해

LiStoryTeller 2018. 6. 10. 17:12

뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.


이번 강의는 커널 오브젝트에 대한 이해 부분이다.


⊙ YouTube 강의 ⊙ ☞ 커널 오브젝트에 대한 이해



커널 오브젝트에 대한 이해


⊙커널오브젝트

- 커널에 의해 관리되는 리소스 정보를 담고있는 데이터 블록


커널이란 무엇일까? 예전에는 커널과 운영체제는 동일한 의미로 사용되었다.


하지만 이제 운영체제가 하는 일이 다양하고 많아지면서 커널과의 의미와 분리되었다.


하지만 운영체제의 기능이 추가되었을 뿐, 그 핵심이 변한 것은 아닌데 여기서 핵심이 바로 커널이다.



⊙ 커널 오브젝트 


그렇다면 커널 오브젝트란 무엇일까?


운영체제에 의해 생성 및 소멸되는 것을 리소스라고 한다.


예를 들면 우리가 프로그래밍을 하며 배열을 생성하고 조작하며 소멸시킨다. 이 또한 리소스이다.


하지만 이렇게 프로그램에 의해 생성 및 소멸되는 것이 아니라, 운영체제에 의해 생성 및 소멸되는 리소스가 있는데,


이러한 리소스를 관리해 주는 것이 커널 오브젝트이다.


예를들어 파일을 설명해보겠다.


파일은 우리가 프로그램에서 명령어로 생성할 수 있다. 파일을 생성할 때 READ, WRITE 등 여러 권한도 부여할 수 있다.


그럼 물리적인 영역에 파일이 생성된다.


이제 프로그램 상에서 생성된 파일에 접근하기 위한 시도를 하는데, 이때 중간에 운영체제가 가로막고 있다. 여기서 운영체제란 커널을 뜻한다.


예를 들어 파일이 read 모드로 열려져 있는데 write를 하려고 할 경우에 혀용이 되지 않는다.


이렇게 허용 여부를 결정할 수 있는 것은 os에 의해서 관리되기 때문이다.


우리가 파일을 생성 시, 운영체제에 명령어로 파일을 만들어 달라는 요청을 보낸다. 


운영체제는 우리의 요구에 맞게 파일을 생성하고, 합리적이지 못한 접근을 할 경우에는 막는다.


파일 삭제도 마찬가지이다. 우리는 요구만 보내고 운영체제가 파일을 지운다.


이 과정을 살펴보면 os는 파일에 대한 접근 정보를 알고있어야 하고


뿐만 아니라 파일을 어디까지 읽었는지에 대한 정보도 갖고있어야한다.


이 과정을 간단히 설명하자면, 우리가 리소스 등에 대한 요구사항이 있다.


이 요구사항을 들어주는 것이 커널이다.


요구사항을 들어주기 위해서는 리소스를 컨트롤할 수 있는 정보들(접근정보, 파일을 어디까지 읽었는지에 대한 정보)을 가지고 있어야 하는데 이런 정보를 담은 데이터 블록을 커널 오브젝트라 부른다.


생성 소멸이 윈도우즈에 대해 결정되어 지는 리소스는 운영체제가 이를 관리하기 위한 데이터 블록을 내부적으로 저장해둔다.


윈도우즈에 의해 관리되는 리소스 중에 커널 오브젝트의 생성을 동반하지 않는 것이 없다.


프로세스 생성 시에는 프로세스커널 오브젝트 생기고 쓰레드 생성 시에는 쓰레드 커널 오브젝트가 생성된다.


리소스마다 관리되어야 하는 데이터는 다르므로 어떤 오브젝트냐에 따라 구성이 다르다.




⊙ 프로세스 기반 커널 오브젝트


프로세스 생성(CreateProcess) 함수 호출을 하면, 그 요청이 윈도우즈 운영체제에 전달된다.


운영체제는 요청과 함께 전달받은 데이터들로 Process와 커널 오브젝트를 동시에 생성한다.


이 커널 오브젝트는 이 프로세스에 대한 정보들로 채워진다.


이미 프로세스 관리 구조체가 정의되어 있고, 이를 통해 커널 오브젝트 객체가 생성된다.


커널 오브젝트는 프로그래머가 접근할 수 없고, 오직 운영체제에 의해서만 조작되는 영역이다.



프로세스의 커널 객체에는 우선순위 정보가 있다.


프로세스 생성 시, 프로세스 커널 오브젝트가 생성되는데, 우선순위를 높이고 싶을 때가 있다.


그럼 커널 오브젝트에 접근해야 하는데 앞서 말했듯이 커널 오브젝트에 개발자가 직접 접근할 수 없다.


이를 해결하기 위해서 운영체제는 해당 기능을 제공하는 시스템 함수를 제공해준다.


이런 시스템 함수를 호출해서 우선순위를 높여주어야 하는데, 생각보다 그리 간단치 않다.


우선순위를 높여주는 시스템 함수를 UP이라고 해보자


현재 존재하는 프로세스는 여러개가 있을 수 있다.


프로세스 A,  B, C가 있다고 가정해보자


우리는 그중 B의 우선순위를 높이고 싶다.


시스템 함수를 써서 B의 우선순위를 높이려면, 프로세스를 구분하기 위해 B 커널 오브젝트 정보를 전달해줘야한다. 


하지만 커널 오브젝트에 직접 접근할 수 없다. 이를 해결하기 위해 나온 것이 핸들 정보를 추가로 전달해주는 것이다.


프로세스가 생성될 때, 프로세스커널 오브젝트가 같이 생성된다.


운영체제는 이 프로세스 커널 오브젝트를 구분하기 위해 번호를 매긴다. 이 번호를 핸들이라고 한다.


그러므로 우선순위를 높이기 위해 up을 호출하면서 B에 대한 핸들을 넘긴다.


즉, 커널 오브젝트에 직접 접근을 못하지만 핸들을 통해 요청을 보낼 수 있다.





Comments