9. 운영체제 시작하기
1. 운영체제를 알아야 하는 이유
1.1 운영체제란?
모든 프로그램은 하드웨어를 필요로 한다. 이때 프로그램 실행에 마땅이 필요한 요소들을 가리켜 시스템 자원, 혹은 줄여서 자원이라고 한다.
여기 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이 바로 운영체제이다.
운영체제는 인터넷 브라우저, 게임과 같은 프로그램으로 운영체제 또한 여느 프로그램과 마찬가지로 메모리에 적재되어야 한다. 다만 운영체제는 매우 특별한 프로그램이기 때문에 항상 컴퓨터가 부팅될 때 메모리 내 "커널 영역(Kernel Space)" 이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역, 사용자가 이용하는 응용 프로그램이 적재되는 영역을 "사용자 영역(User Space)" 이라고 한다.
즉, 운영체제는 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고 이들이 올바르게 실행되도록 돕는다.
운영체제는 응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리한다.
1.2 운영체제를 알아야 하는 이유
2. 운영체제의 큰 그림
운영체제는 사용자를 위한 프로그램이 아닌 사용자가 실행하는 프로그램을 위한 프로그램이다.
2.1 운영체제의 심장, 커널
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다. 대표적인 운영체제인 리눅스를 구성하는 소스 코드는 천만줄이 넘어간다. 또 세상에는 다양한 운영체제가 있기 때문에, 운영체제가 응용 프로그램에 제공하는 기능들 또한 매우 다양하다.
운영체제가 응용 프로그램에게 제공하는 기능들은 매우 다양하지만, 그 중에서도 가장 핵심적인 기능들이 있다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 "커널(Kernel)" 이라고 한다.
자원에 접근하고 조작하는 기능,
프로그램이 올바르고 안전하게 실행되게 하는 기능
운영체제가 설치된 모든 기기에는 커널이 있다. 어떤 커널을 사용하는지에 따라 프로그램이 하드웨어를 이용하는 양상이 달라지고, 결과적으로 컴퓨터 전체의 성능이 달라질 수 있다.
운영체제가 제공하는 기능 중 커널에 포함되지 않는 기능도 있는데, 대표적으로 사용자 인터페이스(그래픽 유저 인터페이스, 커맨드 라인 인터페이스)가 있다. 이러한 사용자 인터페이스는 운영체제가 제공하는 서비스지만, 이는 그저 컴퓨터와 상호작용하기 위한 통로일 뿐 커널에 속한 기능들은 아니다.
2.2 이중 모드와 시스템 호출
운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다.
그래서 운영체제는 응용 프로그램이 자원에 접근하려고 할 때 오직 자신을 통해서 접근하도록 하여 자원을 보호한다. 이러한 운영체제의 문지기 역할은 이중 모드로써 구현된다. "이중 모드(dual mode)" 란 CPU 가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다.
"사용자 모드(user mdoe)" 는 커널 영역의 코드를 실행할 수 없는 모드이다. 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행되며, 하드웨어에 직접적인 명령을 할 수 없다.
반면 "커널 모드(kernel mode)" 는 운영체제 서비스를 제공받을 수 있는 실행 모드이다. 즉, 커널 영역의 코드를 실행할 수 있는 모드이다. CPU 가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.
요컨데 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 "시스템 호출(system call)" 이라고 한다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.
시스템 호출은 일종의 인터럽트이다. 인터럽트는 입출력장치에 의해 발생하기도 하지만 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 하는데, 이를 "소프트웨어 인터럽트"라고 한다.
시스템 호출의 예를 들어보자. 한 응용 프로그램이 하드 디스크에 데이터를 저장하려 한다고 가정해보자. 이를 위해 응용 프로그램은 하드 디스크에 접근해야 한다. 하지만, 사용자 모드로 실행되는 동안에는 자원에 접근할 수 없기 때문에 커널 모드로 전환해야 한다.
응용 프로그램은 하드 디스크에 데이터를 저장하는 시스템 콜을 발생시켜 커널 모드로 전환한다.
운영체제 내의 '하드 디스크에 데이터를 저장하는 코드'를 실행함으로써 하드 디스크에 접근할 수 있다.
그리고 하드 디스크에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속해나간다.
일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 사용한다. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 번갈아가면서 실행된다.
2.3 운영체제의 핵심 서비스
2.3.1 프로세스 관리
실행 중인 프로그램을 "프로세스(process)" 라고 한다. 윈도우 작업관리자를 살펴보면 상당히 많은 프로세스가 실행 중인 것을 확인할 수 있다. 이처럼 우리가 컴퓨터를 사용하는 과정에서 메모리 안에서는 새로운 프로세스들이 생성되고, 사용하지 않는 프로세스는 메모리에서 삭제된다.
일반적으로 하나의 CPU 는 한 번에 프로세스만 실행할 수 있기에 CPU 는 이 프로세스들은 조금씩 번갈아 가면서 실행한다. 다시 말해 CPU 는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 반복한다.
여기서 각각의 프로세스는 사용하고자 하는 자원이 다양하다.
때문에, 운영체제는 다양한 프로세스를 일목요연하게 관리하고 실행할 수 있어야 한다.
추가로, 여러 프로세스가 동시에 실행되는 환경에서는 '프로세스 동기화' 가 필수적이고, 프로세스가 꼼짝도 못하고 더 이상 실행되지 못하는 상황인 "교착상태(dead lock)" 을 해결해야 한다.
2.3.2 자원 접근 및 할당
모든 프로세스는 실행을 위해서 자원을 필요로 한다. 그리고 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해준다.
CPU
일반적으로 메모리에는 여러 프로세스들이 적재되고, 하나의 CPU 는 한 번에 하나의 프로세스만 실행할 수 있다. 그래서 하나의 프로세스가 CPU 를 사용하고 있다면 다른 프로세스는 기다려야 한다.
이에 운영체제는 프로세스들에 공정하게 CPU 를 할당하기 위해서 어떤 프로세스부터 CPU 를 이용하게 할 것인지, 얼마나 오래 CPU 를 이용하게 할지를 결정할 수 있어야 한다. 이를 "CPU 스케줄링" 한다.
메모리
메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 가지각색이다. 같은 프로세스라 할지라도 실행할 때마다 적재되는 주소가 달라질 수 있다. 그래서 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재할지 결정해야 한다.
때로는 메모리가 이미 꽉 차 있어 꼭 실행해야 할 프로세스를 적재할 공간이 없는 경우도 있고, 메모리 공간이 남았는 데도 불구하고 프로세스를 적재하지 못하는 상황도 발생한다.
입출력장치
인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지이다. 입출력장치가 CPU 에 하드웨어 인터럽트 요청 신호를 보내면 CPU 는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실행한다. 이처럼 운영체제는 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.
2.3.3 파일 시스템 관리
"파일 시스템" 도 운영체제가 지원하는 핵심 서비스이다. 운영체제가 보조기억장치 속 데이터를 어떻게 파일과 디렉터리로 관리하는지 뒤에서 알아보자.
Last updated