운영체제는 사용자를 위한 프로그램이 아닌 사용자가 실행하는 프로그램을 위한 프로그램이다. 즉, 사용자가 실행하는 응용 프로그램이 올바르게 실행되도록 돕고 필요한 자원을 할당해 주는 프로그램이다. 이번 강의에서는 운영체제에서 매우 중요한 개념인 커널에 대해 알아보고, 응용 프로그램이 운영체제로부터 어떻게 도움을 받으며 실행되는지를 이해하기 위해 이중 모드와 시스템 호출이라는 개념을 알아볼 것이고, 운영체제가 응용 프로그램에 제공하는 서비스 종류에는 어떤 것들이 있는지 알아볼 것이다.

1. 운영체제의 심장, 커널

운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다. 대표적인 운영체제인 리눅스를 구성하는 소스 코드는 천만 줄이 넘는다. 또 세상에는 다양한 운영체제가 있다. 그래서 운영체제가 응용 프로그램에 제공하는 기능들, 달리 말해 운여체제 서비스 또한 매우 다양하다.

스마트폰이 사용자에게 제공하는 서비스 종류는 다양하지만, 그중에서도 전화, 문자, 인터넷 기능처럼 가장 핵심적인 서비스가 있다. 마찬가지로 운영체제가 응용 프로그램에 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있다. 곧 자세히 설명하겠지만, 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능이 운영체제의 핵심 서비스에 속한다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel)이라고 한다.

운영체제가 설치된 모든 기기에는 커널이 있다. 커널은 마치 사람의 심장, 혹은 자동차의 엔진과도 같다. 어떤 커널을 사용하는지에 따라 우리가 실행하고 개발하는 프로그램이 하드웨어를 이용하는 양상이 달라지고, 결과적으로 컴퓨터 전체의 성능도 달라질 수 있다.

앞으로 운영체제를 지칭할 때는 특별히 언급하지 않는 한 커널을 지칭한다고 봐도 무방하다.

Untitled

운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스도 있는데, 대표적으로 사용자 인터페이스가 있다. 사용자 인터페이스(UI, User Interface)는 윈도우의 바탕화면과 같이 사용자가 컴퓨터와 상호작용할 수 있는 통로이다.

운영체제가 제공하는 사용자 인터페이스의 종류에는 그래픽 유저 인터페이스(GUI, Graphical User Interface)와 커멘트 라인 인터페이스(CLI, Command Line Interface)가 있다. 전자는 윈도우 바탕화면이나 스마트폰의 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스이고, 후자는 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스이다.

우리가 윈도우 운영체제 컴퓨터를 사용할 때 마우스를 이용해 다앙한 플그램을 실행할 수 있는 것은 윈도우 운영체제가 GUI를 지원하기 때문이다.

Untitled

Untitled

반면 CLI는 명령어를 기반으로 컴퓨터와 상호작용하는 인터페이스이기 때문에 아이콘이나 다채로운 그래픽 화면이 없다. 사용자는 컴퓨터를 사용하기 위해 정해진 명령어를 입력함으로써 컴퓨터와 상호작용할 수 있다.

Untitled

Untitled

이러한 UI는 운영체제가 제공하는 서비스이지만, 이는 그저 컴퓨터와 상호작용하기위한 통로일 뿐 커널에 속하는 기능은 아니다. 실제로 같은 커널을 사용하더라도 UI는 다를 수 있다.

2. 이중 모드와 시스템 호출

운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 응용 프로그램이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하고 조작할 수 있다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있다.

그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다. 비유하자면 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할을 하는 셈이다. 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청해야한다. 이떄 ‘운영체제에 도움을 요청한다’는 말은 ‘운영체제 코드를 실행하려고 한다’는 말과 같다. 응용 프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다.

예를 들어 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터에 저장하려면 운영체제에 도움을 요청해야 하고, 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행해준다.

Untitled

이러한 운영체제의 문지기 역할은 이중 모드로써 구현된다. 이중 모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다. CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있다.

사용자 모드(user mode)는 운영체제 서비스를 제공받을 수 없는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 없는 모드이다. 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다. 사용자 모드로 실행중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다. 그래서 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근할 수 없다.

반면 커널 모드(kernel mode)는 운영체제 서비스를 제공받을 수 있는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 있는 모드이다. CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다. 운영체제는 커널모드로 실행되기 때문에 자원에 접근할 수 있다.

<aside> 🗒️ 슈퍼바이저 플래그

CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는 플래그 레지스터 속 슈퍼 바이저 플래그를 보면 알 수 있다.

Untitled

</aside>