커널이 무엇인지 이해하고, 우리가 개발하고 실행하는 응용 프로그램이 어떻게 운영체제의 도움을 받으며 실행되는지, 운영체제가 응용 프로그램에 어떤 서비스를 제공하는지 알아보겠습니다.

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

 

운영체제의 큰 그림

 

 

 


커널: 운영체제의 심장

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

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

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

대부분의 운영체제 전공서는 운영체제의 핵심부, 즉 커널을 설명합니다. 따라서 앞으로 운영체제를 지칭할 때는 특별히 언급하지 않는 한 커널을 지칭한다고 봐도 무방합니다.

 

운영체제 핵심 기능_커널

 

 

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

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

우리가 윈도우 운영체제 컴퓨터를 사용할 때 마우스를 이용해 다양한 프로그램을 실행할 수 있는 것은 윈도우 운영체제가 그래픽 유저 인터페이스를 지원하기 때문입니다. 또 우리가 안드로이드 스마트폰 속 다양한 앱을 터치하여 실행할 수 있는 것은 안드로이드 운영체제가 그래픽 유저 인터페이스를 지원하기 때문입니다. 

 

GUI 그래픽 유저 인터페이스

 

 

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

CLI 커맨드 라인 인터페이스cmd 명령 프롬프트

 

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

 

 

 


이중 모드와 시스템 호출

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

 

운영체제_이중모드 시스템 호출

 

 

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

응용 프로그램 실행 과정

 

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

운영체제 이중모드

 

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

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

 

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

CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는 플래그 레지스터 속 슈퍼바이저 플래그를 보면 알 수 있습니다. 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미합니다.

사용자모드 커널모드

 

 

요컨대 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 합니다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출system call(시스템 콜)이라고 합니다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공 받을 수 있습니다.

운영체제 시스템 호출

 

시스템 호출은 일종의 인터럽트입니다. 정확히는 소프트웨어적인 인터럽트입니다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 합니다.

그래서 CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사합니다. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나갑니다.

시스템 호출의 작동 예를 들어 볼게요. 한 응용 프로그램이 하드 디스크에 데이터를 저장하려 한다고 가정해 보겠습니다. 이를 위해 응용 프로그램은 하드 디스크에 접근해야겠죠? 하지만 사용자 모드로 실행되는 동안에는 자원(하드 디스크)에 접근할 수 없기에 커널 모드로 전환해야 합니다. 이를 위해 응용 프로그램은 하드 디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널 모드로 전환하고, 운영체제 내의 ‘하드 디스크에 데이터를 저장하는 코드’를 실행함으로써 하드 디스크에 접근할 수 있습니다. 그리고 하드 디스크에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속해 나갑니다.

운영체제 커널모드 사용자모드 2

 

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용합니다. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행됩니다.

운영체제 사용자모드 커널모드 3

 

 

 


운영체제의 핵심 서비스

운영체제의 핵심 서비스는 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리입니다.

 

✔️프로세스 관리

실행 중인 프로그램을 프로세스process라고 합니다. 윈도우의 [작업 관리자]를 열어 [프로세스] 항목을 보면 굉장히 많은 프로세스가 실행 중인 것을 알 수 있습니다. 이처럼 우리가 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 마구 생성되고, 사용되지 않는 프로세스는 메모리에서 삭제됩니다.

작업관리자

 

일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행합니다. 다시 말해 CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복합니다.

CPU 프로세스 실행

 

 

이때 각 프로세스는 상태도, 사용하고자 하는 자원도 다양합니다. 입출력장치를 주로 사용하는 프로세스도 있고, 입출력장치는 거의 사용하지 않고 주로 CPU만 사용하는 프로세스도 있습니다. 또 당장 실행할 수 있는 프로세스가 있는 반면, 당장 실행이 불가능한 프로세스도 있습니다. 그래서 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 합니다. 

 

운영체제 프로세스 실행

 

 

 

✔️자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 합니다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 줍니다. 운영체제가 컴퓨터의 네 가지 핵심 부품(CPU, 메모리, (보조기억장치와) 입출력장치)을 어떻게 관리하고, 결과적으로 어떤 기능을 제공하는지 알아볼게요.

 

CPU

일반적으로 메모리에는 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 합니다. 이에 운영체제는 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할지를 결정할 수 있어야 합니다. 이를 CPU 스케줄링이라고 합니다.

 

메모리

메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 가지각색입니다. 같은 프로세스라 할지라도 실행할 때마다 적재되는 주소가 달라질 수 있지요. 그래서 운영체제는 새로운 프로세스가 적재될 때 마다 어느 주소에 적재해야 할지 결정해야 합니다. 때로는 메모리가 이미 꽉 차 있어 꼭 실행해야 할 프로세스를 적재할 공간이 없는 경우도 있고, 메모리에 공간이 남았는데도 불구하고 프로세스를 적재하지 못하는 상황도 발생합니다.

 

입출력장치

인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있습니다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지입니다. 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실행합니다. 이처럼 운영체제는 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력작업을 수행합니다.

 

 

 

✔️파일 시스템 관리

우리가 컴퓨터를 사용할 때는 여러 파일을 열고, 생성하고, 삭제하곤 합니다. 그리고 이 파일들을 한데 묶어 디렉터리(폴더)로 관리합니다. 자칫 당연해 보이는 이런 파일 시스템file system도 운영체제가 지원하는 핵심 서비스입니다. 

 

 

 

⭐정리⭐

운영체제의 핵심 서비스를 제공하는 부분은 커널입니다. 그리고 사용자 프로세스가 커널의 서비스를 제공받기 위해서는(커널 영역의 코드를 실행하기 위해서는) 사용자 모드에서 커널 모드로 전환해야 하고, 이는 시스템 호출을 통해 이루어집니다. 즉, 시스템 호출은 커널 모드로써 운영체제의 서비스를 제공 받을 수 있는 방법입니다. 그리고 대표적인 커널의 서비스로는 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리가 있습니다.

 

 

 


혼자 공부하는 컴퓨터 구조+운영체제

위 내용은 『혼자 공부하는 컴퓨터 구조+운영체제』의 일부분을 재구성하여 작성하였습니다.

프로그래밍 언어의 문법만 안다고 해서 실력 있는 개발자가 되기는 어렵습니다. 컴퓨터 구조와 운영체제를 알아야 프로그래밍을 근본적으로 이해하고 다양한 문제를 쉽게 해결할 수 있습니다.

코드 속에 숨어 있는 문제를 해결하고 싶을 때, 부족한 전공 지식을 습득하고 싶을 때, 기술 면접을 준비하고 싶을 때 혼공컴운을 펼쳐보세요!