
운영체제를 알아야 하는 이유
우리가 사용하는 데스크톱 컴퓨터나 노트북, 스마트폰에는 모두 운영체제가 설치되어 있습니다. 대표적으로 윈도우와 macOS, 리눅스가 있고, 스마트폰 운영체제는 안드로이드와 iOS가 있습니다.
이번 절에서는 운영체제가 무엇인지 알아보고, 개발자들이 운영체제를 알아야 하는 이유에 대해 알아보겠습니다.
운영체제란
모든 프로그램은 하드웨어를 필요로 합니다. 프로그램 실행에 필요한 요소들을 시스템 자원, 혹은 자원이라 부르며, CPU, 메모리 등등의 컴퓨터 부품들을 말합니다.
여기서 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 운영체제 입니다.
운영체제 역시 프로그램 입니다. 그래서 다른 프로그램들과 마찬가지로 메모리에 적제되어야 합니다. 다만 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역이라는 공간에 따로 적재되어 실행됩니다.
커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 사용자 영역이라고 합니다. 즉 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕습니다.
예를 들어보겠습니다. 우리가 사용하는 브라우저나 메모장 같은 프로그램을 실행하면 메모리에 올라갑니다. 그럼 누가 이 프로그램들을 메모리에 올렸을까요? 그리고 각 프로그램이 서로의 영역이 겹치지 않도록 메모리 주소 할당을 누가 했을까요? 바로 운영체제 입니다.
또한, 각 응용 프로그램이 실행되려면 CPU가 필요합니다. 그럼 각각 프로그램이 CPU를 사용할 때 어떤 순서로 얼마나 사용할지 어떻게 결정할까요? 이 부분도 운영체제가 해결합니다.
운영체제를 알아야 하는 이유
개발자 입장에서 운영체제가 없으면 끔찍합니다. 아무리 간단한 프로그램이라도 운영체제가 없다면 하드웨어를 조작하는 코드를 개발자가 모두 직접 작성해야 합니다. 운영체제가 하드웨어를 조작하고 관리하는 기능들을 제공하기 때문에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요 없이 운영체제의 도움을 받아 간편하게 개발할 수 있습니다.
그렇다면 개발자들이 왜 운영체제를 알아야 할까요? 그 이유는 문제 해결 능력과 관련있습니다. 우리가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어는 운영체제가 조작합니다. 운영체제를 통해 하드웨어 상태를 파악하고, 어떻게 코드가 실행되는지, 하드웨어 상에 어떤 문제가 있었는지 알 수 있고 이를통해 문제 해결의 실마리를 찾을 수 있습니다.
대표적으로 오류 메세지를 해석하는 능력을 기를수 있습니다. 만일 프로그램 실행중 memory leaks 관련 에러가 발생하면 메모리 관련 에러임을 파악할 수 있습니다.
운영체제의 큰 그림
운영체제는 사용자를 위한 프로그램이 아닌 실행하는 프로그램을 위한 프로그램 입니다. 이번 절에서는 운영체제에서 매우 중요한 개념인 커널에 대해 알아보고, 응용 프로그램이 운영체제로 부터 어떻게 도움을 받으며 실행되는지를 이해하기 위해 이중모드와 시스템 호출이라는 개념을 알아보겠습니다.
운영체제의 심장, 커널
자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능이 운영체제의 핵심 서비스에 속합니다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널이라고 합니다.
대부분 운영체제에 대해 설명하는 자료가 있다면, 특별히 지칭하지 않는이상 운영체제를 커널이라고 봐도 무방합니다.
운영체제가 제공하는 서비스 중 커널에 해당하지 않는 서비스도 있는데, 대표적으로 사용자 인터페이스가 있습니다. 사용자 인터페이스는 그래픽 유저 인터페이스와 커맨드 라인 인터페이스가 있습니다. 전자는 윈도우나 스마트폰 운영체제처럼 그래픽을 기반으로 컴퓨터와 사용자가 상호작용할 수 있도록 하는 인터페이스이고, 후자는 명령어 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스 입니다.
이중 모드와 시스템 호출
운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호합니다. 그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 합니다.
이런 운영체제의 문지기 역할은 이중 모드로써 구현됩니다. 이중 모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식입니다.
사용자 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드입니다. 즉, 커널 영역의 코드를 실행할 수 없는 모드입니다. 반면 커널 모드는 운영체제 서비스를 제공받을 수 있는 실행 모드입니다. 즉, 커널 영역의 코드를 실행할 수 있는 모드입니다.
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 합니다. 이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출이라고 합니다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있습니다.
시스템 호출은 일종의 인터럽트입니다. 정확히는 소프트웨어적인 인터럽트 입니다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 소프트웨어 인터럽트라고 합니다.
CPU가 시스템 호출을 처리하는 순서는 앞서 설명한 인터럽트 처리 순서와 유사합니다. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드를 실행한 뒤 기존에 실행하던 응용 프로그램으로 복귀하여 실행해 나갑니다.
운영체제의 핵심 서비스
프로세스 관리
실행중인 프로그램을 프로세스라고 합니다. 일반적으로 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행합니다. 이 때 각 프로세스는 상태도, 사용하려는 자원도 다양합니다. 또 당장 실행할 수 있는 프로세스가 있는 반면, 당장 실행 불가능한 프로세스도 있습니다.
그래서 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 합니다. 여러 프로세스가 동시에 실행되는 환경에서는 '프로세스 동기화'가 필수적이고, 프로세스가 더 이상 실행되지 못하는 상황인 '교착 상태'를 해결해야 합니다. 이것들은 이 후에 다루도록 하겠습니다.
자원 접근 및 할당
운영체제가 컴퓨터의 주요부품을 어떻게 관리하고 어떤 기능을 제공하는지 알아보겠습니다.
- CPU
일반적으로 메모리에는 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 그래서 운영체제는 프로세스들에 공정하게 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할지를 결정할 수 있어야 합니다. 이를 CPU 스케쥴링이라고 합니다.
- 메모리
메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 가지각색입니다. 같은 프로세스라 할지라도 실행할 때마다 적재되는 주소가 달라질 수 있습니다. 그래서 운영체제는 새로운 프로세스가 적재될 때 마다 어느 주소에 적재해야 할지를 결정해야 합니다.
- 입출력장치
인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있습니다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지입니다. 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 멈추고 커널 영역에 있는 인터럽트 서비스 루틴을 실행합니다. 이처럼 운영체제는 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행합니다.
파일 시스템 관리
컴퓨터를 사용할 때 여러 파일을 열고, 생성하고, 삭제합니다. 이런 파일 시스템도 운영체제가 관리하는 핵심 서비스 입니다.
