컴퓨터에 OS가 없다면 어떤 일이 일어나게 될까. 누군가가 이러한 컴퓨터의 상태를 달리는 방법을 모르는 말이라고 했다. 왜 그렇게 비유를 들었는지 이 글을 정리하는 시점에서 이해가 가려한다. 이 글에서는 컴퓨터가 프로그램을 실행하기까지 어떠한 과정을 거치는지, OS는 무엇이고 어떤 역할을 하는지에 대한 내용을 다루어보았다.
위 그림은 하나의 프로그램이 컴퓨터에서 어떻게 실행되는지 하드웨어적인 측면에서 그림을 그린 것이다.
하나의 프로그램(program)은 a set of instructions, 명령어들의 집합이다. 이 명령어는 컴퓨터가 알아들을 수 있도록 되어있다. 컴퓨터 공학에서 흔히 말하는 프로그램은 단지 하드디스크(hdd)에 물리적으로 저장된 파일에 불과하다. 하드디스크에 있는 프로그램을 실행해야지만 비로소 우리가 원하는 바를 컴퓨터에서 처리해줄 수 있다.
실행 중인 프로그램은 프로세스(process)라고 한다. 프로그램이 프로세스가 되기 위해서는 하드디스크에서 메인 메모리(main memery)에 적재(load)되어야 한다. 그럼 메인 메모리에 올라와 있기만 하면 실행되는 것이냐? 그건 또 아니다. 메인 메모리에 적재된 여러 프로세스 중 하나를 프로세서(processor)가 실행시켜야만 한다. 그림에서는 프로세서(processor)에 프로세스 하나가 들어있다고 표기해두었지만, 엄밀히 말하자면 프로세서는 명령어를 실행하는 것이다. PC라는 레지스터에는 다음에 실행할 명령어의 주소를 담고 있는데, 메모리에 접근하여 이 주소에 해당하는 명령어를 가져와 프로세서가 실행시키는 것이다.
다중 프로그래밍이란 다수의 프로세스를 메인 메모리에 올려두고, 프로세서에 의해 실행되는 프로세스들이 교체되는 것이다. 지금이야 거의 모든 컴퓨터들이 다중 프로그래밍을 지원하기 때문에 동시에 여러 프로그램을 실행시키는 것이 당연하다고 생각할지 모른다. 하지만 사실 컴퓨터를 사용했던 초기에는 다중 프로그래밍이라는 개념이 없었다. 따라서 메인 메모리에는 하나의 프로세스만이 적재되었고, 프로세서에 의해 실행되는 프로세스도 중간에 교체되는 일이 없었다.
다중 프로그래밍이라는 개념이 등장하게 된 배경은 이렇다. 하나의 프로세스는 프로세서를 적극적으로 활용하는 연산을 하기도 하지만, I/O 연산도 포함되어 있다. I/O 연산은 매우 빠른 CPU 처리 속도에 비해 아주 느리다. 그러면 한 프로세스가 I/O 연산을 하는 도중에는 I/O 연산이 끝날 때까지 프로세서는 유휴 상태로 대기하게 된다. CPU가 얼마나 비싼지 알면 매우 큰 낭비가 아닐 수 없다. 다중 프로그래밍은 프로세스가 I/O 연산으로 인해 유휴 상태가 된다면, 메인 메모리에 대기하고 있는 다른 프로세스를 실행시켜 CPU의 이용률을 높이는 것이다.
CPU의 이용률 높이는 것은 좋지만 그로 인해 이전에는 없었던 점들이 생겼다. 같은 공간에서 다수의 프로세스를 동작시키면서 CPU 이용률을 높이기 위해서는 다음을 고려해야 한다.
1. 다음에 실행할 프로세스를 어떠한 기준으로 선택할 것인지 => CPU scheduling
2. 메인 메모리에 여러 프로세스가 적재된다면 각 프로세스에 주어진 메모리 공간을 어떻게 관리할 것인지 => memory management
3. 한 프로세스의 메모리 공간을 어떻게 다른 프로세스가 침범하지 못하게 보호할 것인지 => memory protection
다중 프로그래밍 이후에는 시분할 시스템이 등장했다. 기존의 다중 프로그래밍의 경우, 프로세서에 의해 프로세스가 실행될 기회는 프로세서에 의해 실행되고 있는 프로세스가 I/O 연산을 실행하는 경우에 주어진다. 하지만 다중 사용자가 있는 시스템에서 그렇게 동작한다면, 전체 사용자들이 골고루 시스템을 이용할 수가 없다. 따라서 모든 사용자들이 공평하게 시스템을 사용하기 위해, 프로세서를 이용하는 프로세스를 일정한 단위 시간마다 강제로 바꿔주는 방법이 시분할 시스템이다.
OS는 그 자체로써 동작하는 것이 아니라 목적에 따라 다음과 같이 여러 부분으로 나뉜다.
1. 프로세스 관리
2. 메모리 관리
3. 저장장치 관리
4. 보호(CPU, 메모리, I/O 디바이스)
5. 보안
6. 네트워킹
OS가 컴퓨터에서 여러 서비스들을 제공함으로써 이루고자 하는 전반적인 목적은 이렇다.
1. 하드웨어와 애플리케이션의 중간자
하드웨어를 추상화시켜 사용자들이 하드웨어가 어떻게 작동하는지 알 필요 없이 프로그램을 쉽게 작성할 수 있도록 한다.
애플리케이션을 추상화시켜 애플리케이션들 간의 소통을 가능하게 한다.
애플리케이션이 다양한 하드웨어를 조작할 수 있도록 간단하고 일관된 관점을 제공한다.
2. 제어 프로그램
프로세스에서 에러가 발생하거나 프로세스가 하드웨어를 오용하거나 남용할 경우 이를 제어한다.
3. 자원 관리자
모든 컴퓨터 자원을 관리하고, 동시에 동일한 자원을 사용하고자 하는 프로세스들에게 자원을 효율적이고 공평하게 나누어준다.
4. 플랫폼 제공
여러 소프트웨어 프로그램을 묶어서 하나의 큰 컴퓨터 시스템으로 합치는 플랫폼을 제공하여 소프트웨어 생산성을 높인다.