예전엔 RTOS라는 말을 많이 사용했던 것 같은데, 요즘은 Kernel이라는 말이 또 많이 사용되는 것 같네요. 도대체 Kernel이란 건 뭘까?요. OS라는 게 뭘 하는 녀석인지 보자면, 예전에 OS라는 게 없을 때는 User가 모든 기능을 Software가 처리 가능하도록 처음부터 끝까지 작성을 했는데, 이러다 보니 너무 까다로운 작업에 Software를 하려는 사람들이 죽을 맛이었겠죠.
사람이라는 게 언제나 편한 걸 추구하다 보니, 모든 기능을 처리 하도록 만들기가 불편하니까, 이런 Software를 Hardware에 자동으로 Loading해 주고 실행해 주는 Monitoring 환경을 만들었는데, 그게 바로 OS의 시초라고 봐도 무방할 것 같아요. 원래 Software라는걸 한번에 한가지만 실행할 수 있는 환경에서, 여러 가지 Software에 대해서 실행만 하면 자동으로 Memory에 Loading 해주는 그런 시스템이었던 거죠. 그게 비스므리한 예가 DOS라고 보시면 될 것 같네요.
OS라고 부르기에는 뭣 한 그런 거였는데, 한참 쓰다 보니까 모든 Software에는 공통점이 있더라 하는 걸 간파 한 거죠. 그게 뭐냐면 I/O가 부분이었어요. 모든 Software는 Input을 받고 Output을 해주는 Architecture를 많이 사용했는데, 뭐 예를 들면, 키보드나, 모니터는 항상 공통적으로 사용하더란 말이죠. 그래서 이 부분을 Monitoring 환경에 아예 집어 넣고 사용하기 시작했는데, 이 것이 바로 OS의 시작이에요. Operating System. 아하~ 요것도 DOS랑 비슷하죠.
그러니까 태초의 Operating System은 DOS형태로서 실행만 해주면 자동으로 Memory에 올려서 실행 가능하게 만들어 주고, 특별하게 뭘 안 해줘도 I/O를 사용할 수 있도록 해 주는 형태였던 게에요.
OS라는 건 뭐 그런 거죠. RTOS라는 것도 마찬가지 인 거에요. Embedded System에서 사용되는 OS인데, Embedded System이라는 게 범용적인 System이 아니고 특정한 목적을 위한 작은 System이다 보니 Real Time 이라는 말이 붙어서 RTOS라고 부르긴 하지만, 어쨌거나 기본적으로 Multi tasking과 Interrupt 처리 기능을 가지고 있는 작은 OS라고 보시면 맞는 거죠. 제 개인적인 의견으로는 RTOS라고 부르기 보다는 Embedded OS라고 부르는 게 더 혼란을 적게 가져오지 않을 까 생각하는데.. 잘 모르겠사옵니다.
이때, RTOS도 하는 일이 많으니까, RTOS중에 중요한 부분들만 따로 떼어서 Kernel이라고 부르는 부분들이 생겨 나고 있는데요. Kernel 이라고 함은 Context Switching, Scheduling, Memory Management, ISR Management 등을 담당하는 부분을 따로 떼어서 Kernel이라고도 부르게 된 거죠. 그런데, 제 생각으로는 Kernel 이라는 게 별거냐 하는 생각이 들어요.
제일 중요한 부분은 Kernel이라는 게 대단한게 아닙니다요. 혼자서 돌아가면서 전체적인 System을 관리하는 Software가 아니에요. 혼자 살아 움직이는 뭐 그런 녀석이 아니고요, 어쨌든 간에 Kernel의 API중 어느 것이라도 불려야 동작하는 System을 관리할 수 있는 Software 인 거에요. Kernel 혼자서 살아 움직이는 건 아니고요. 그러니까 Kernel이 활성화 되려면, Application이나, Task, Process등이 Kernel에게 Service를 받기 위해서 Kernel API를 부르던가, Interrupt가 걸려서 Interrupt 처리할 때 Interrupt 처리 routine의 끝에 Kernel의 API가 불리던가 하는 등의 뭐 그런 식인 거지요. 이 부분을 이해 못하면 Kernel은 혼자 살아 움직이는 괴물로 뭉글뭉글 머릿속에 자리 잡을 수도 있으니 조심하세요~.
또, Kernel에 대한 용어에 관련한 싸움에 관련해서 Comment하자면, 위키 백과에 Kernel의 정의와 Micro Kernel과 Monolithic Kernel간의 싸움이
http://ko.wikipedia.org/wiki/%EC%BB%A4%EB%84%90_(%EC%9A%B4%EC%98%81_%EC%B2%B4%EC%A0%9C) - 여기 끝에 괄호까지 붙이셔야 제대로 가요. T.T
자세하게 나와 있습니다만, 저 나름대로의 정의를 막 내릴 테니, 한번 들어보셔요. RTOS의 경우에는 Compact하고 작으니까, RTOS 자체를 Kernel이라고 불러도 무방할 듯 하긴 한데요,
문제는 L4 같은 Micro Kernel이나, Linux 같은 Monolithic Kernel이 Kernel이라는 이름을 마구 가져다 쓰다 보니까,
도대체 Kernel이 OS랑 뭐가 다르냐! 하고 헷갈릴 수 있어요. 전 엄청 헷갈렸다구요.
그러나, 여전히 Kernel은 핵심 기능을 하는 부분을 OS의 Kernel이라고 부르면 될 것 같고요.
그러니까, OS의 이름으로서는 Linux, L4, uC OS, REX, 뉴클리어스.. 이런 것들이 OS의 이름인 거구요.
쩝.
Micro Kernel은 진짜 중요한 부분만 Kernel이라고 부르는 거고, (나머지는 Server라는 Process로 떨어져 나가 있어요)
Monolithic Kernel은 Kernel에 다른 큰 부분들까지 같이 엮여서 부르는 거라고 보시면 될 것 같아요.
이렇게 해도 헷갈리니까 진짜 예를 들면,
Linux는 Monolithic Kernel의 형태이므로 Linux 자체 = Kernel = OS라고 보시면 될 것 같고요,
L4같은 녀석은 Micro Kernel의 형태이므로 진짜 중요한 Core만 Kernel이고, 나머지 Service들은 Server라는 Process 형태로 따로 존재한다고 보시면 될 것 같아요. - 진짜 중요한 Core란 앞에서 말한 Scheduling, Context Switching, Memory관리, Resource 관리, ISR 관리등을 처리하는 부분이요 -
Linux에서 사용하는 Kernel이라는 이름의 정의와 L4같은 녀석이 사용하는 Kernel의 정의가 틀린 거니까, 그걸 이해 하셔야 해요.
아 헷갈린다. 횡설수설. 토사구팽~. 뭐, 저는 이제부터 OS라는 용어나 RTOS라는 용어 보다는 Kernel이라는 용어를 즐겨 쓸 거니까, 그렇게 생각해 주시면 된다구요. 그냥 그렇다구요~
이 글은 많은 리플을 낳을 수 있는 글이므로, 마음 껏 자신의 의견을 달아주세요. 달려라 달려!
참고) Window는 Monolithic Kernel일까요, Micro Kernel일까요? - 답은, Micro Kernel 캬캬. (이거 헷갈리죠?)
댓글