커널과 인터페이스
커널(Kernel)은 프로세스, 메모리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 담당한다. 자동차에 비유하면 자동차 성능을 좌우하는 엔진과 같다.
그리고 자동차가 움직이는 데에 엔진은 물론이고 사람이 조작할 수 있는 핸들과 브레이크가 필요하다. 또한, 현재 시속, 기어 상태 등을 알려주는 계기판이 있어야 하는데 이를 인터페이스라고 한다. 운영체제에서는 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할을 한다.
정리하자면 사용자와 응용 프로그램에 인접하여 커널에 명령을 전달하고 실행 결과를 사용자와 응용 프로그램에게 돌려주는 인터페이스와 운영체제의 핵심 기능을 모아놓은 커널이 운영체제를 담당한다.
또한, 같은 커널을 사용하더라도 다른 인터페이스를 사용하면 다른 운영체제처럼 보인다. 유닉스의 사용자 인터페이스를 셸이라고 하는데 C셸, T셸, 배시셸 등 다양하다. 이처럼 유닉스는 명령어 기반이기 때문에 일반인이 사용하기 불편하다. 하지만, 편리한 인터페이스를 자랑하는 MAC OS X도 유닉스 계얼의 커널을 이용해 만든 것이다. 이처럼 사용자 입장에서는 커널보다 인터페이스가 먼저 보이기 때문에 좋은 커널보다는 좋은 인터페이스의 컴퓨터를 사용하려는 경향이 있다.
시스템 호출과 디바이스 드라이버
시스템 호출(System Call)은 커널이 자기 자신을 보호하기 위해 만든 인터페이스이다. 커널은 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 저원에 직접 접근하는 것을 차단한다. 따라서, 자원을 이용하려면 시스템 호출이라는 인터페이스를 이용하여 접근해야 한다.
그렇다면 직접 접근하는 것과 시스템 호출을 통한 접근은 무엇이 다를까? 어떤 응용 프로그램은 dog를 다른 응용 프로그램은 cat을 하드디스크에 저장한다고 가정해보면
- 직접 접근: 두 응용 프로그램이 자기 마음에 드는 위치에 데이터를 저장할 것이다. 하지만, 다른 사람의 데이터를 지우고 덮어쓸 수 있고 반대로 내 데이터가 다른 사람에 의해 지워질 수 있다.
- 시스템 호출을 통한 접근: 커널이 제공하는 write() 함수를 사용하여 데이터를 저장해달라고 요청하면 응용 프로그램은 데이터가 하드디스크의 어느 위치에 어떤 방식으로 저장되는지 알 수 없다. 데이터를 찾고 싶다면 read() 함수로 시스템 호출을 통해 접근한다. 이 때에는 커널이 데이터를 저장하는 것에 전적으로 책임지기 때문에 컴퓨터 자원을 관리하기 수월하다.
응용 프로그램과 커널의 인터페이스가 시스템 호출이라면 커널과 하드웨어의 인터페이스는 드라이버(Driver)가 담당한다. 컴퓨터 하드웨어는 종류가 다양한데 운영체제가 많은 하드웨어를 사용할 수 있는 환경을 제공하려면 각 하드웨어에 맞는 프로그램을 직접 개발해야 한다. 하지만, 현실적으로 커널이 각각의 인터페이스를 다 개발하기에는 어려울 뿐더러 각 하드웨어의 특성은 하드웨어 제작자가 가장 잘 알기에 하드웨어 제작자가 관련 소프트웨어를 만드는 것이 더 유리하다.
따라서, 커널은 입출력의 기본적인 부분만 제작하고 하드웨어의 특성을 반영한 소프트웨어를 하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 한다. 이 때, 이 소프트웨어를 디바이스 드라이버라고 부른다.
정리하면 시스템 호출은 커널이 제공하는 시스템 자원의 사용과 관련된 함수이고 응용 프로그램이 하드웨어 자원에 접근하거나 운영체제가 제공하는 서비스를 이용할 때에는 시스템 호출을 통해 이용해야 한다. 드라이브는 커널이 제공하는 드라이버도 있고 하드웨어 제작자가 제공하는 드라이버도 존재한다. 따라서, 하드웨어는 커널과 직접 연결되기도 하고 제작자가 제공하는 드라이버를 통해 연결되기도 한다.
커널의 구성
운영체제의 핵심 기능인 커널은 다음과 같은 역할을 한다.
또한, 커널은 위의 기능들을 어떻게 구현하는지에 따라 단일형, 계층형, 마이크로 구조형 커널로 구분된다.
단일형 구조 커널은 초창기의 운영체제 구조로 커널의 핵심 기능을 구현하는 모듈들이 구분 없이 하나로 구성되어 있는 것이다. 초기 운영체제는 기능을 구현하는데에 초점을 두었기 때문에 모듈을 분리하여 구현할 만한 여력이 없었다. 비유하자면 함수를 거의 사용하지 않고 main()에 모든 기능을 구현한 형태와 같다.
모듈 간 통신 비용이 준다는 장점이 있지만 모듈이 하나로 묶여 있기에 버그나 오류를 처리하기 어렵고 기능상의 작은 결함이 시스템 전체로 확산될 수 있다.
계층형 구조 커널은 비슷한 기능을 가진 모듈을 묶어서 하나의 계층을 만들고 계층 간의 통신을 통해 운영체제를 구현하는 방식이다. 단일형 구조 커널보다는 버그나 오류를 쉽게 처리할 수 있고 해당 계층만 수정하면 되기에 디버깅이 쉽다. 오늘날의 운영체제는 대부분 이 구조로 되어 있다.
마이크로 구조 커널은 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공한다. 다른 커널에 비해 운영체제의 많은 부분이 사용자 영역에 구현되어 있다. 마이크로 구조에서 각 모듈은 독립적으로 작동하기 때문에 하나의 모듈이 실패하더라도 전체 운영체제가 멈추지 않는다. 또한, 다른 컴퓨터에 이식하기 쉽고 가벼워 CPU 용량이 작은 시스템에도 적용이 가능하다.
가상머신
C 언어는 어셈블리어 같은 저급 언어의 기능을 가져 시스템 프로그래밍 언어로 적합하고 대표적인 운영체제는 유닉스이다. 하지만, C 언어는 다른 커널을 가진 운영체제와 호환성이 떨어진다. 여기서 호환성이 떨어진다는 것은 한 쪽에서 만든 소스코드가 다른 운영체제에서는 작동하지 않는다는 것을 말한다. 예를 들어, 유닉스에서 C언어로 만든 코드가 윈도우 운영체제에서 작동하지 않는 것이 그 예에 해당한다.
이러한 호환성 문제를 해결한 언어가 자바(Java)인데 자바로 프로그래밍을 하면 대부분의 운영체제에서 작동한다. 자바가 작동하는 원리는 운영체제 위에 가상머신(Virtual Machine)을 만들고 그 위에서 응용 프로그램이 작동하는 것이다. 즉, 가상머신은 서로 다른 운영체제에서 하나의 응용 프로그램으로도 작동할 수 있도록 만든 시스템이다.
가상머신을 설치하면 응용 프로그램이 모두 동일한 환경에서 작동하는 것처럼 보인다. 따라서, 개발자가 하나의 코드만 만들면 여러 운영체제에서 똑같이 실행할 수 있다. 자바에서 가상머신을 만들어 배포한 것을 자바 가상머신(Java Virtual Machine, JVM)이라고 한다.
만약 하나의 컴퓨터에 두 가지 운영체제를 설치하기가 부담스러울 경우 가상머신을 설치하면 해결된다. 가상머신을 사용하면 호환성이 높아지지만 응용 프로그램이 가상머신을 통해서만 작동하기 때문에 느리다는 단점이 있다.
'운영체제 > 기초' 카테고리의 다른 글
6. CPU와 메모리(2) (0) | 2020.10.14 |
---|---|
5. CPU와 메모리(1) (0) | 2020.10.06 |
4. 하드웨어의 기본 구성 (0) | 2020.10.05 |
2. 운영체제의 역사 (0) | 2020.09.28 |
1. 운영체제 (0) | 2020.09.28 |