우리가 흔히 사용하는 데스크톱 컴퓨터나 노트북, 스마트폰에는 모두 운영체제가 설치되어 있다. 대표적인 데스크톱 운영체제로는 윈도우와 macOS, 리눅스가 있고, 스마트폰 운영체제로는 안드로이드와 iOS가 있다.
컴퓨터 부품들은 전기만 공급하면 마치 마법처럼 알아서 작동하는 것이 아니다. 운영체제라는 특별한 프로그램의 지휘하에 작동한다. 운영체제는 1~8장까지 배운 컴퓨터 부품들을 관리하고, 우리가 개발한 프로그램이 올바르게 실행되도록 돕는다.
이번 절에서는 가벼운 마음으로 운영체제가 무엇인지 알아보고, 개발자들이 운영체제를 알아야 하는 이유에 대해 알아보도록 한다.
모든 프로그램은 하드웨어를 필요로 한다. 예를 들어 1+2를 계산하는 프로그램은 CPU를 필요로 하고, 이미지를 하드 디스크에 저장하는 프로그램은 하드 디스크를 필요로 한다.
이때 프로그램 실행에 마땅히 필요한 요소들을 가리켜 시스템 지원, 혹은 줄여서 자원이라고 한다. 지금까지 우리가 학습한 CPU, 메모리, 보조기억장치, 입출력장치 등과 같은 컴퓨터 부품들은 모두 자원이라고 볼 수 있다. 즉, 모든 프로그램은 실행되기 위해 반드시 자원이 필요하다.
여기서 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 바로 운영체제(Operating system)이다.
운영체제는 인터넷 브라우저, 게임과 같은 프로그램이다. 그래서 운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 한다. 다만 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역(Kernel space)이라는 공간에 따로 적재되어 실행된다. 커널 여역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역(User space)이라고 한다. 즉, 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕는다.
<aside> 💡 응용 프로그램이란?
응용 프로그램(application software)은 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램을 의미한다. 일상적으로 사용하는 워드 프로세서, 인터넷 브라우저, 메모장, 게임 등과 같은 프로그램이 모두 응용 프로그램이다.
</aside>
위 이미지에서 보면 세 개의 응용 프로그램이 사용자 영역에 적재되어 있는것을 확인할 수 있다. 그렇다면 누가 이 프로그램들을 메모리에 적재했을까? 그건 바로 운영체제이다. 운영체제는 실행할 프로그램을 메모리에 적재하고, 더 이상 실행되지 않는 프로그램을 메모리에서 삭제하며 지속적으로 메모리 자원을 관리한다.
또한 응용 프로그램이 실행되려면 반드시 CPU가 필요하다. 그렇다면 어떤 프로그램부터 CPU를 사용할까? 그리고 얼마나 오랫동안 CPU를 이용하게 할까? 이 문제 또한 운영체제가 해결한다. 운영체제는 최대한 공정하게 여러 프로그램에 CPU 자원을 할당한다.
이번에는 워드 프로세서와 메모장이 동시에 동일한 프린터를 이용하려는 상황을 생각해보자. 운영체제는 동시에 두 개의 프로그램이 프린터를 사용하지 못하도록 막고, 하나의 프로그램이 프린터를 이용하는 동안 다른 프로그램은 기다리게 만들어 프린터 자원을 관리한다.
이처럼 운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 맡는다.
운영체제는 흔히 정부에 비유되기도 한다. 한 나라의 정부는 땅, 인력, 돈 등 국내 자원을 효율적으로 배분하고, 국민들이 지켜야 할 규칙을 만들어 나라 전체를 관리한다. 운영체제도 마찬가지이다. 운영체제는 응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리한다.
또한 정부에 기획재정부, 과학기술정보통신부, 외교부와 같이 역할별로 여러 부서가 나누어져 있는 것처럼 운영체제 또한 관리할 자원별로 기능이 나누어져 있다. 예를 들어 운영체제의 어느 한 부분에서는 CPU를, 어느 한 부분에서는 메모리를, 어느 한 부분에서는 하드 디스크를 관리한다.
개발자 입장에서 운영체제가 없는 세상은 상상만해도 끔찍하다. 아무리 간단한 프로그램이라도 운영체제가 없으면 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 하기 때문이다.
1과 2를 더한 결과를 모니터에 출력하는 간단한 프로그램을 생각해보자. 이런 간단한 프로그램조차도 운영체제가 없다면 작성하기 매우 어렵다. 프로그램을 메모리에 적재하는 코드, CPU로 하여금 1과 2를 더하게 하는 코드, 모니터에 계산 결과를 출력하는 코드를 개발자가 모두 직접 작성해야 하기 때문이다.
하지만 다행히도 이 세상에는 운영체제가 있다. 운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요없이 운영체제의 도움을 받아 간편하게 개발할 수 있다.
그렇다면 개발자들이 왜 운영체제를 알아야 할까? 어차피 운영체제가 알아서 하드웨어를 조작할테고, 개발자들은 운영체제의 도움을 받아 프로그램만 개발하면 될 텐데 말이다.
그 이유는 1장에서 언급한 문제 해결 능력과 관련이 있다. 우리가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어를 조작하는 프로그램이 운영체제이다. 그래서 운영체제는 우리의 프로그램이 하드웨어 상에서 어떻게 작동하는지를 윌보다 더 자세히 알고있다.
그리고 운영체제는 딱딱한 하드웨어가 아닌 프로그램이기 때문에 우리와 대화가 가능하다. 운영체제는 현재 하드웨어의 상태가 어떠한지, 우리의 코드가 어떻게 실행되었는지, 하드웨어 상에 어떤 문제가 있었는지 등을 상세히 알려줄 수 있고, 이를 통해 우리는 문제 해결의 실마리를 찾을 수 있다.
즉, 운영체제를 깊이 이해하면 운영체제가 우리에게 건네는 말을 제대로 이해할 수 있고, 운영체제에 제대로 명령할 수 있게 된다. 그리고 결과적으로 하드웨어와 프포그램을 더 깊이 이해할 수 있다.
대표적인 운영체제와의 대화 예시는 오류 메시지이다. 우리가 접하게 될 대다수의 오류 메시지의 근원은 운영체제이다. 우리가 작성한 소스 코드를 하드웨어가 제대로 실행하지 못하면 운영체제는 우리에게 아래와 같은 오류 메시지를 띄워준다. 프로그래밍 문법만 학습한 사람들은 운영체제의 메시지를 이해하기 어렵고, 문제를 진단하고 해결하기도 어려울 것이다.