본문 바로가기

서버운영 (TA, ADMIN)/리눅스

[리눅스] 커널이란?

컴퓨터의 커널은 운영체제의 핵심입니다. 운영체제의 다른 모든 부분에 여러 기본적인 서비스를 제공합니다. 시스템 자원은 제한되어있지만 프로그램은 많기 때문에 커널은 프로그램의 수행상태인 프로세스 간의 보안 접근을 책임지는 소프트웨어입니다. 커널이 이러한 프로세스마다 얼마만큼의 자원을 사용해야 하는지 결정해야하는데 이것을 스케줄링이라고 합니다. 


같은 종류의 컴포넌트에 대해 하드웨어는 다양하게 디자인 되어질 수 있습니다. 따라서 하드웨어에 직접 접근하는 것은 매우 복잡할 수 있습니다. 일반적으로 커널은 운영체제의 복잡한 내부를 감추고 깔끔하고 일관성 있는 인터페이스를 하드웨어에 제공하기 위해 추상화를 지원합니다. 이러한 하드웨어 추상화는 프로그래머가 하드웨어의 복잡한 접근을 고민할 필요없이 쉽게 개발하는 것을 돕습니다. 하드웨어 추상화 계층(HAL)은 제조사의 장비 명세에 대한 특정한 명령어를 제공하는 소프트웨어 드라이버에 의지합니다.


이렇듯 커널은 운영체제에서 핵심적인 기능을 담당하지만 수행에 필수적인 것만은 아닙니다. 프로그램은 하드웨어 추상화나 운영체제 지원없이 컴퓨터만으로 읽어 들여져 수행될 수 있기 때문입니다. 이러한 방법은 초기 컴퓨터의 운영 방법이었고 다른 프로그램을 실행하고 싶을 때는 컴퓨터는 다시 켜고 다시 읽어들어야 했습니다. 그 결과 로더와 디버거 같은 작은 프로그램들이 프로그램을 수행시키는 작업을 해야했고 이것이 초기 운영체제 커널의 기초가 되었습니다.


이렇게 커널은 크게 4가지로 구분할 수가 있습니다.

- 모놀리식커널(Monolithic Kernel)

- 마이크로커널(Micro Kernel)

- 하이브리드커널(Hybrid Kernel)

- 엑소커널(Exo Kernel)



모놀리식 커널


모놀리식 커널은 하드웨어 위에 고수준의 가상 층을 가지고 있습니다. 고수준의 가상층은 기본 연산 집합과 관리자모드에서 작동하는 프로세스관리, 동시성, 메모리관리 등의 운영체제 서비스 구현을 위한 시스템콜(System Call)로 되어 있습니다.


이러한 연산들을 제공하는 모듈은 같은 주소 공간에서 실행되기 때문에 코드의 집적도는 매우 조밀하고 수정하기 어렵고 한 모듈이 버그는 전체 시스템을 멈추게 할 수도 있습니다. 그러나 구현이 신뢰할 정도로 완성되면 컴포넌트의 내부 집적이 내부의 시스템 이용을 효과적이게 하여 높은 효율을 보입니다. 



모놀리식 커널의 지지자들은 코드가 부정확한지 그런 코드가 커널에 포함되어 있는지 확인할 수 있고 그것은 마이크로 커널에 비해 미세한 우위에 있다고 주장합니다.


리눅스, FreeBSD, 솔라리스와 같은 모놀리식커널은 실행 모듈을 실시간으로 읽어들일 수 있습니다. 실시간으로 실행 모듈을 읽는 특징은 커널이 허용하는 범위 내에서 손쉽게 확장 가능하도록 커널 공간의 코드의 양을 최소한으로 유지시켜줍니다. 


마이크로소프트 윈도우즈 NT(NT, 2000, XP, 2003 등)는 초창기에는 하이브리드커널이었으나 후기버전은 모놀리식커널로 변경되었습니다. 윈도우즈 NT 시리즈는 상위의 서비스들을 NT executive라는 서버로 구현하였습니다. Win32 특성은 처음에는 사용자 모드의 서버 형태로 구현되었으나, 최근 버전에서는 관리자 주소 영역으로 이동하였습니다. 다양한 서버들이 로컬 프로시저 콜(LPC; Local Procedure Call)이라 불리는 주소 영역간 매커니즘을 통해 통신하며, 성능 최적화를 위해 공유메모리를 이용합니다.


모놀리식 커널을 사용한 운영체제는 다음과 같습니다.

- BSD 커널과 같은 전통적인 유닉스 커널

- 리눅스 커널

- 솔라리스 커널

- 윈도우즈 NT 커널

- 벨로나2 커널

- AIX 커널

- AGINX와 같은 교육용 커널



마이크로 커널


마이크로 커널은 모놀리식 커널과 달리 하드웨어 위에 매우 간결한 추상화만을 제공합니다. 기본 연산 집합과 운영체제 서비스를 구현한 쓰레드 관리, 주소 공간, 프로세스간 통신의 작은 시스템 콜로 구성됩니다. 일반적으로 커널이 제공하는 네트워킹 같은 다른 서비스들은 사용자 공간 프로그램인 서버로 구현합니다.


운영체제는 서버를 다른 일반적인 프로그램처럼 간단히 시작하고 끌 수 있습니다. 예를 들어 네트워킹 지원이 필요없는 작은 시스템에서는 간단히 켜지 않으면 됩니다. 이론적으로 마이크로커널에서 시스템은 더 안정적입니다. 서버가 중단될 때 커널의 충돌이 아니기 때문에 단 하나의 프로그ㅐㄻ만 내려버리면 됩니다.


일반적으로 마이크로 커널은 전통적인 디자인의 수행을 잘하지 못할 수도 있습니다. 서버와의 자료교환을 위해 커널을 출입하는 문맥전환 때문입니다. 주의 깊은 조율이 오버헤드를 극적으로 줄여줄 것으로 믿어져왔으나 90년대 중반부터 대부분의 연구자들을 시도를 포기했습니다. 최근에 새 마이크로 커널은 성능을 최우선으로 설계하며 이 문제를 넓은 부분에서 다루었씁니다. 그러나 현재 운영체제 시장은 자기 몸사리며 마이크로 커널 설계에 소극적입니다. 


마이크로 커널에 기반한 운영체제는 다음과 같습니다.

 - AmigaOS

 - Amoeba

 - ChorusOS

 - EROS

 - Haiku

 - K42

 - LSE/OS

 - KeyKOS

 - L4 마이크로커널

 - Mach

 - MERT

 - Minix

 - MorphOS

 - NewOS

 - QNX

 - Phoenix-RTOS

 - RadiOS

 - Spring operating system

 - VSTa

 - Symbian OS



하이브리드 커널


하이브리드 커널은 본질적으로 마이크로 커널을 따르나, 사용자 레벨에서 수행될 때 느린 코드들을 커널 레벨에서 수행하도록 수정한 것을 말합니다.


이는 다양한 운영체제 개발자들이 마이크로커널 기반의 설계를 받아들이던 시점에 순수한 마이크로커널의 성능상 한계를 극복해보고자 생각해낸 내용입니다.




예를 들어, 맥 오에스 텐의 커널인 XNU는 Mach 커널 3.0 마이크로 커널에 기반을 두고 있지만, 전통적인 마이크로 커널 설계의 지연 현상을 줄이기 위해 BSD 커널의 일부 코드들을 들여와 동일한 주소 영역에서 실행하고 있습니다.


하이브리드 커널로는 다음과 같은 것들도 포함됩니다.

 - ReactOS

 - BeOS 커널

 - Netware 커널


하이브리드 커널은 모놀리식 커널과 마이크로 커널 설계 양쪽의 구조적 개념과 작동방법에 대한 것으로 어떤 것은 사용자 공간에 들어가는 반면 어떤 코드는 성능의 이유로 커널 공간에 포함해야 하는지에 대한 선택의 문제입니다.



엑소 커널


엑소커널은 운영체제 설계에 대한 급진적인 신개념으로 수직 구조의 운영체제입니다.


엑소커널의 구상은 개발자에게 강제적인 추상화를 줄여 하드웨어 추상화에 대한 선택의 폭을 넓혀줍니다. 엑소커널은 여러 개의 가상화를 실행하는데 각 가상화는 하드웨어 추상화 계층을 통하지 않고 하드웨어 구역에 직접 접근합니다. 응용소프트에어와 추상화는 특정 메모리 주소와 디스크 블록 등을 요구하는데 커널은 단지 자원이 비어있는지만 확인하고 응용소프트웨어에게 접근을 허용합니다.



이러한 저수주누의 하드웨어 접근은 프로그래머가 개별적인 추상화를 만드는 것을 허용하여 불필요한 부분을 제거할 수 있게 하고 일반적으로 프로그램의 성능을 향상시킵니다.


엑소커널은 추상화를 제공하는 라이브러리 운영체제(libOSes)를 이용합니다. 라이브러리 운영체제는 응용소프트웨어 프로그래머에게 고수준, 전통적인 운영체제 추상화, 맞춤 추상화 구현 등의 더 유동적인 방법을 제공합니다. 이론적으로 엑소커널의 체제는 하나의 엑소커널 아래 윈도우즈나 유닉스와 같은 다양한 운영체제를 구동할 수 있습니다.


엑소커널의 개념은 1994년에 나왔으며 현재까지 여전히 학계에서 연구 중이며 대규모의 상용 운영체제는 아직까지 없습니다.