프로그램 실행에 필요한 요소들을 시스템 자원, 줄여서 자원이라고 한다. CPU, 메모리, 보조기억장치, 입출력장치 등 컴퓨터 부품들은 모두 자원이라고 볼 수 있다.
운영체제operating system는 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램이다.
운영체제는 브라우저, 게임과 같이 프로그램이기 때문에 메모리에 적재되어야 한다. 다만 컴퓨터가 부팅될 때 메모리 내 커널 영역kernal space이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지 영역에 사용자가 이용하는 프로그램이 적재되는 영역을 사용자 영역user space이라고 한다.
운영체제가 응용 프로그램에 제공하는 핵심적인 기능
커널kernal은 위 두 가지를 담당하는 운영체제의 핵심이다.
이중 모드란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다.
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이 요청을 시스템 호출system call(system call)이라고 한다.
시스템 호출은 소프트웨어적인 인터럽트다. 그래서 인터럽트 처리 순서와 유사한데, 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속한다.
운영체제의 핵심 서비스 중 일부
실행 중인 프로그램을 프로세스process라고 한다. 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 생성되고 삭제되기를 반복한다.
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행한다. 각 프로세스는 상태도 사용하고자 하는 자원도 다양하기 때문에 운영체제는 다양한 프로세스를 관리하고 실행할 수 있어야 한다.
여러 프로세스가 동시에 실행되는 환경에서는 '프로세스 동기화'가 필수적이고, 프로세스가 꼼짝도 못하고 더 이상 실행되지 못하는 '교착 상태'를 해결해야 한다.
모든 프로세스는 실행을 위해 자원을 필요로 한다. 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 준다.
CPU
일반적으로 메모리에는 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다. 그래서 하나의 프로세스가 CPU를 이용하고 있다면 다른 프로세스는 기다려야 한다. 운영체제는 프로세스들에 공정하게 CPU를 할당하기 위해 우선순위를 정하고, 얼마나 오래 이용하게 할지를 경정한다. 이를 CPU 스케줄링이라고 한다.
메모리
메모리에 적재된 프로세스들은 크기, 적재되는 주소도 가지각색이다. 같은 프로세스라 할지라도 실행할 대마다 적재되는 주소가 달라질 수 있다. 그래서 운영체제는 새로운 프로세스가 적재되 때마다 어느 주소에 적재해야 할지 결정해야한다.
때로는 메모리가 이미 꽉 차 있어 꼭 실행해야 할 프로세스를 적재할 공간이 없는 경우도 있고, 메모리에 공간이 남았는데도 적재하지 못하는 상황도 발생한다.
입출력장치
인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지다. 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실핸한다.