커널 & 컴파일

1. 커널

운영체제만을 연구하는 학문에서는 커널을 여러가지면에서 살펴보고 다양하게 정의 내리고 있다. 그러나 그런 내용들은 너무나 전문적이고 또한 내용이 너무 이론적이다. 여기서는 좀더 쉬운 접근 방법으로 커널에 대한 이야기를 하도록 하겠다.

커널은 운영체제를 움직이는 핵심이다. 자동차에 여러 부속들이 있어도 우리가 자동차라고 부르는 것은 엔진과 조향장치등 자동차를 생각함에 있어서 빼어 놓을 수 없는 것들이 있을 것이다. 이것은 자동차의 커널이 될 것이다. 전체 운영체제에서 커널만을 따로 떼어내어 구분 짓는 것은 약간의 무리가 따르는 일이지만 꼭 구분하자면 그렇다는 것이다. 사실 리눅스를 사용하면서 ls라는 유틸리티가 없다면 무척이나 답답하겠지만 어떤 파일이 있는지 알지 못하면서도 리눅스는 운영될 것이다. 자동차에서도 헤드라이트가 없다면 답답하겠지만 자동차는 달려갈 수 있는 것과 마찬가지 이다.

어떤 운영체제는 커널과 사용자가 사용하는 쉘등의 겉모습이 밀접하게 연결되어 있어 따로 분리해 내기가 어렵기도 하고 또 다른 운영체제는 커널을 어느정도는 따로 떼어내 볼 수 있다. 리눅스의 경우는 후자 쪽에 가깝다고 할 수 있겠다.


커널의 역할


전형적인 유닉스의 커널과 비슷한 역할을 하는 리눅스의 커널은 기본적으로 사용자가 작동시키는 응용프로그램과 하드웨어간의 조정자 역할을 맡는다. 동시에 수행되는 여러 응용프로그램들(엄밀히 말하자면 프로세스들과 쓰레드들이다.)을 위해 메모리관리를 해 주며 컴퓨터 자원을 배분하는 역할을 해 준다.


2. 컴파일


컴파일이란 컴파일러를 이용하여 프로그램 소스로부터 수행가능한 바이너리 코드를 만드는 과정을 말한다. 리눅스 소스는 거의 대부분 C 언어로 작성되었으며 약간의 어셈블리 코딩을 가지고 있다.


 리눅스 커널 컴파일


리눅스는 커널의 소스를 완전 공개한 운영체제여서 커널의 소스를 사용자가 직접 컴파일 할 수 있다. 그렇다면 제작사에서 만들어내서 제공되는 커널과 사용자가 커널을 직접 컴파일 할 수 있다는 것의 차이는 어떤 것이있을까? 커널 소스가 단 한가지 방법으로만 컴파일이 된다면 제작사에서 아예 컴파일을 해서 주는 것이 좋을 것이다. 그러나 사용자에게 커널 컴파일을 맡겼다는 것은 커널을 컴파일하는데 여러가지 옵션을 제공한다는 것이다. 우리는 이 여러 옵션을 잘 조정해서 커널을 우리 입맛에 딱 맞게 만들 수 있는 것이다. 다시 자동차 이야기로 돌아가보자. 우리가 차를 개조할 수 있다고 생각해 보자. 물론 씨디 플레이어등을 새로 설치하는 것은 자동차의 커널을 개조하는 것이 아니다. 씨디 플레이어등은 유틸리티일 뿐이다. 헛갈리지 말자. 자. 자동차의 커널 수준이라면 엔진을 개조하는 것이다. 기름값이 비싸지니까 엔진을 800cc 경차엔진으로 바꾸자. 그런것이 과연 가능한가? 물론 실제에서는 불가능할 것이다. 그러나 상상을 해 보자. 기름값이 비싸지면 경차엔진으로 바꾸고 힘이 딸리면 3000cc 대형 엔진으로 바꾸고, 별 필요는 없지만 괜히 멋으로 4500cc V6엔진으로도 바꾸어보고 마음대로 바꿀 수 있다면 사용자들의 입맛에 딱 맞출 수 있을 것이다. 리눅스 커널은 이와 같이 자신의 요구와 편의에 따라 쉽게 커널을 바꿀 수 있다.

또한 상용 운영체제에서 제공하는 커널은 여러 사용자들의 요구를 두루두루 맞추어 줘야 하기 때문에 덩치가 커질 수 있지만 리눅스의 커널은 자신의 시스템에 필요한 것만을 사용하기 때문에 좀 더 작고 가볍게 구성할 수 있다. 물론 이런 것들은 시스템의 속도를 빠르게 하는 또 하나의 장점이 될 수 있다. 혹 여러 기능이 많은 커널이 더 좋지 않느냐는 의문을 가질 지도 모르겠다. 다음과 같은 경우를 생각해 보자. 현재 리눅스를 쓰고 있고 프린터가 없다면 아마 프린터 포트는 쓸일이 없을 것이다. 그럼 프린터를 구입할 때까지는 프린터 포트 지원을 하지 않음으로 좀 더 가벼운 커널을 사용하고 나중에 프린터가 생기면 프린터 포트를 지원하게 컴파일 하면 되는 것이다. 프린터가 없을 때도 내부적으로 프린터를 지원하게 해 놓으며 컴퓨터의 자원을 낭비할 필요가 없다는 것이다.

답글 남기기