Kernel

커널

커널은 프로세스관리, 메모리관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것이다.

자동차의 성능은 엔진이 좌우하는것처럼, 운영체제의 성능은 커널이 좌우한다.

운영체제의 인터페이스는 커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할을 한다.

운영체제는 사용자와 응용 프로그램에 인접하여 커널에 명령을 전달하고, 실행 결과를 사용자와 응용 프로그램에 돌려주는 인터페이스와 운영체제의 핵심 기능을 모아놓은 커널, 이렇게 두 부분으로 나뉜다.

운영체제는 커널과 인터페이스를 분리하여, 같은 커널을 사용하더라도 다른 인터페이스를 가진 형태로 제작할 수 있다.

같은 커널이라도 다른 인터페이스가 장착되면 사용자에게는 다른 운영체제처럼 보인다.

  • 유닉스를 예로 살펴보면, 유닉스의 사용자 인터페이스는 shell이라고하며 C셸(csh), T셸(tsh), 배시셸(bash)등 여러 종류의 셸이 있다. 셸은 명령어 기반이라 일반인이 사용하기 불편하여 유닉스 운영체제를 어렵게 느끼는 사람이 많다.
  • 반대로 편리한 인터페이스와 화려한 그래픽을 자랑하는 매킨토시의 운영체제 Mac OS X도 알고 보면 유닉스 계열의 커널을 이용해서 만든 것이다.
  • 엄밀히 말하면 유닉스 운영체제가 어려운 것이 아니라 명령어 기반의 인터페이스가 어려운 것이다.

시스템 호출

  • 시스템 호출(system call)은 커널이 자신을 보호하기 위해 만든 인터페이스이다.
  • 커널은 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 자원에 직접 접근하는 것을 차단한다.
  • 따라서 컴퓨터 자원을 이용하려면 시스템 호출이라는 인터페이스를 이용하여 접근해야 한다.
  • 커널이 제공하는 시스템 관련 서비스를 모아놓은 것이며 함수 형태로 제공된다.
  • C언어 printf()도 시스템 호출 중 하나다.

사용자 관점에서의 컴퓨터 자원 접근

Case 1: 사용자가 컴퓨터자원에 직접 접근

사용자가 직접 컴퓨터 자원에 접근한다면, 사용자가 모든 것을 처리해야한다. 자기가 찾고자하는 자원이 어느 위치에 있으며, 어떻게 사용하며, 사용후에는 어떤 처리를 해줘야하는지를 모두 알고있어야하고 찾아야한다. 원하는 결과를 얻을수는 있지만 다른사용자에게도 제공해야할 자원이 망가지거나 없어져 있을수도 있다

Case 2: 시스템 호출을 통한 접근

누군가에게 요청하여 작업의 결과만 받는 방식이다. 이 누군가가 바로 운영체제다. 사용자는 자원이 어디에 위치해있는지, 어떻게 가공을해야하는지에 대한 고민이 필요없이 그냥 결과만 받으면 된다. 또한 내부적으로도 사용자의 오작동이나 악의에 의해 망가질 염려를 전혀 하지 않아도 된다.

사용자가 결과를 얻는 방법은 위의 두가지가 있다. 사용자 입장에서도 굳이 결과만 받아오고 싶은거라면 내가 직접 알아보고, 결과물을 만들고 할 필요가없다. 즉 2번째 방식처럼 받는게 훨씬 좋다.

응용 프로그램 관점의 컴퓨터 자원 접근

Case 1: 응용프로그램이 컴퓨터자원에 직접 접근

두 응용 프로그램이 자기가 마음에 드는 위치에 데이터를 저장하려 할 것이므로, 이 경우 다른 응용 프로그램의 데이터를 지울 수도 있고 내 데이터가 다른 응용 프로그램에 의해서 지워질 수도 있다.

Case 2: 시스템 호출을 통한 접근

응용 프로그램이 하드 디스크에 직접 데이터를 저장하지 않고 커널에서 제공하는 write() 함수를 사용하여 데이터를 저장해달라고 요청하며, 자신이 저장한 데이터를 역으로 읽고싶다면 read() 함수로 시스템 호출을 이용하여 가져오면 된다. 시스템 호출을 이용하면 커널이 데이터를 가져오거나 저장하는것을 전적으로 책임 지기 때문에 응용 프로그램은 어떠한 방식으로 하드디스크 어느곳에 저장되는지 전혀 알수가 없다.

드라이버

앞서 응용 프로그램과 커널의 인터페이스가 시스템 호출이라면 커널과 하드웨어의 인터페이스는 드라이버가 담당한다. 컴퓨터 하드웨어의 종류는 엄청 많은데, 운영체제가 이 많은 하드웨어를 다 사용할 수 있는 환경을 제공하려면 각 하드웨어에 맞는 프로그램을 직접 개발해야한다. 그러나 이는 불가능하며, 각 하드웨어의 특성은 하드웨어 제작자가 가장 잘 알고 있기 때문에 하드웨어 제작자가 관련 소프트웨어를 만드는 것이 더 유리하다.

커널은 입출력의 기본적인 부분만 제작하고, 하드웨어의 특성을 반영한 소프트웨어를 하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 한다. 이때 하드웨어 제작자가 만든 소프트웨어를 디바이스 드라이버라고 부른다.

시스템 호출을 거치지 않고는 사용자나 응용프로그램은 커널에 진입할수 없지만 드라이버는 커널 자체가 제공하는 드라이버도 있으며 하드웨어 제작자가 제공하는 드라이버도 있다.

더 읽어보기 API & SDK

API(Application Programming Interface)와 SDK(System Developer’s Kit)가 있다.

API

  • 응용 프로그램이 자신과 연관된 프로그램을 만들 수 있도록 제공하는 인터페이스이다.
    • 포토샵은 수많은 필터를 모두 제공하지 않는다. 이러한 필터를 제공하기위한 인터페이스는 제공하는데 이것이 바로 API이다. API는 시스템 호출보다 광범위한 개념이며, 운영체제의 API를 시스템 호출이라고 정의할 수 있다.

SDK

  • 프로그램 개발자를 위해 API 및 API 사용 매뉴얼뿐만 아니라 프로그램 개발에 필요한 코드 편집기와 에뮬레이터 같은 각종 개발용 응용 프로그램까지 하나로 묶어서 배포하는 개발 툴을 말한다.

  • 대표적으로 안드로이드 SDK인 Android Studio가 있다.