컴퓨터는 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다. 이때 컴퓨터 내부로 데이터가 들어오는 것을 입력(input)이라고 하고, 컴퓨터 외부장치로 데이터가 나가는 것을 출력(output)이라고 한다. 키보드로부터 입력을 받아서 컴퓨터가 어떤 연산을 한 후 그 결과를 모니터에 출력하는 경우를 대표적으로 입출력(Input-output:I/O)라고 말할 수 있다. 따라서 컴퓨터 외부 장치를 입출력 장치라고 부른다.
이전에 운영체제 개요에서 잠깐 살펴본 컨트롤러는 메모리 및 입출력장치 등의 각 하드웨어 장치에 붙어있는것을 알 수 있었는데 다시 한번 살펴보자면, 컨트롤러는 각 하드웨어 장치마다 존재하면서 이들을 제어하는 작은 CPU라고 할 수 있다. 예를 들면 메모리를 제어하는 컨트롤러는 메모리 컨트롤러이고, 디스크를 제어하는 컨트롤러는 디스크 컨트롤러이다.
우리가 생각하는 운영체제는 여러 프로그램이 동시에 수행되는 시스템을 위한 운영체제이며 이때 프로그램이 수행되려면 그 프로그램이 메모리에 올라가 있어야 한다. 하자만 운영체제의 모든 코드를 다 메모리에 상주시키려면 메모리의 낭비가 발생하게 된다. 따라서 운영체제 중 항상 메모리에 올라가 있는 부분은 전체 운영체제 중 핵심적인 부분에 한정되며, 이 부분을 커널(kernel)이라고 부른다.
입출력 장치들의 I/O연산은 입출력 컨트롤러가 담당하고 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당한다. 이때 입출력 장치와 메인 CPU는 동시에 수행이 가능하다. 한편 각 장치마다 이를 제어하기 위해 설치된 장치 컨트롤러는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있고 이를 로컬버퍼(local buffer)라고 부른다.
디스크나 키보드 등에서 데이터를 읽어오는 경우 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다. 이때 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당하게 된다. 예를 들어 프로그램 B가 수행중에 디스크에서 데이터를 읽어오라는 명령을 내리면, 디스크 컨트롤러가 물리적인 디스크에서 내용을 읽어 이를 로컬버퍼에 저장한다. 원하는 데이터를 로컬 버퍼로 다 읽어오고 나면 B는 자신이 필요로 하는 데이터를 다 읽어왔으므로 메인 CPU에서 다음 일을 수행 할 수 있다. 이때 로컬버퍼로 읽어오는 작업이 끝났는지를 메인 CPU가 지속적으로 체크하는것이 아니라 장치에 있는 컨트롤러가 인터럽트를 발생시켜 CPU에 보고하게 된다.
이때 이전에 배운 인터럽트란 컨트롤러들이 CPU의 서비스가 필요할 때 이를 통보하는 방법을 말하고, CPU 옆에는 인터럽트 라인(interrupt line) 이 있어서, CPU가 자신의 작업을하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리한다. 즉, CPU는 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인하며, 인터럽트가 발생했으면, 다음 명령을 수행하기 전에 인터럽트 처리를 하게 되고, 그렇지 않으면 다음 명령을 계속 수행하게 되는 것이다. 인터럽트는 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시키는 것이다.
운영체제 커널에는 인터럽트가 들어왔을 때 해야할 일이 미리 다 프로그래밍되어 그 코드가 보관돼 있다. 이와 같은 커널에는 운영체제가 해야 할 일들을 운영체제의 개발자가 미리 프로그래밍해서 포함시켜 둔다. 그중 운영체제가 해야 할일 들을 미리 프로그램밍한것 중 하나가 인터럽트 처리루틴 이다.운영체제 커널 내에 있는 인터럽트 처리루틴은 다양한 인터럽트에 대해 각각 처리해야 할 업무들을 정의하고 있다.
예를 들어보자면 디스크 컨트롤러가 인터럽트를 발생시키려면 CPU는 하던 일을 잠시 멈추고 이 인터럽트가 발생했을 때 수행하도록 정의된 코드를 찾아 수행한다. 이때 수행하는일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 cpu를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해두는 일이다.
한편 인터럽트에는 하드웨어 인터럽트와 소프트웨어 인터럽트가 있다
공통점: cpu의 서비스가 필요한 경우 ,cpu옆에 있는 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려주는 방식은 똑같다.
차이점: 하드웨어 인터럽트는 컨롤러 등, 하드웨어 장치가 cpu의 인터럽트 라인을 세팅하는 반면,
소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다는 있다.
이와 같이 하드웨어 인터럽트와 소프트웨어 인터럽트는 인터럽트 라인을 세팅하고 인터럽트 라인을 수행하는 의미에서 조금씩 다른 차이점을 가지고 있지만, 하드웨어 인터럽트든 소프트웨어 인터럽트든 일단 인터럽트가 발생하면 cpu는 하던 일을 멈추고 운영체제 커널 내에서 해당 인터럽트의 처리를 위해 정의된 코드를 찾게 된다. 그리고 이러한 코드를 쉽게 찾아가기 위해서는 인터럽트 벡터(interrupt vector)를 가지고 있다. 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조를 말한다. 실제 처리해야 할 코드는 인터럽트 처리루틴(interrupt service routine) 또는 인터럽트 핸들러(interrupt handler) 라고 불리는 다른 곳에 저장된다.
인터럽트 핸들링(interrupt handling)이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미한다. CPU에서 명령이 실행될 때에는 CPU내부에 있는 임시 기억장치인 레지스터(register)에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해두어야 한다. 이것을 모두 저장한 후에야 인터럽트 처리가 이루어질 수 있는 것이다.
운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록(Process Control Block: PCB) 이라는 자료구조를 둔다. PCB 각각의 프로그램마다 하나씩 존재하며 해당 프로그램의 어는 부분이 실행 중이었는지를 저장하고 있다. 구제적으로는 프로그램이 실행중이던 코드의 메모리 주소와 레지스터값, 하드웨어 상태 등이 저장된다. 예를 들어 어떤 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 PCB에 저장한 후 CPU의 제어권이 인터럽트 처리루틴으로 넘어가게 되며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 되는 것이다.
하지만 오늘날의 컴퓨터에서 운영체제는 인터럽트가 발생할 때에만 실행되며, 운영체제는 단지 인터럽트가 발생했을때에만 잠깐 CPU제어권을 흭득하고 인터럽트가 발생하지 않을때면 원래 실행 중인 사용자 프로그램이 원하는 만큼 CPU를 계속 점유하고 있게 된다. 인터럽트가 발생할 때에만 운영체제 코드 부분으로 CPU가 이양되어 인터럽트 처리를 수행하여 된다. 결론적으로 운영체제가 직접 CPU를 점유하는 경우는 인터럽트에 의하지 않고는 발생하지 않는다. 그럼에도 불구하고 운영체제는 컴퓨터 시스템 내의 모든 하드웨어 및 소프트웨어 자원을 체계적이고 효율적으로 관리 할 수 있다.
입출력(I/O)이란 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고 받는것을 말한다.
입출력 방식에는 동기식입출력과 비동기식 입출력이 있다.
(1) 동기식 입출력(synchronuousI/O)
동기식 입출력(synchronuousI/O)은 어떤 프로그램이 후속 작업을 수행할 수 있는 방식을 말한다. 더 자세히 말해보자면 동기식 입출력을 요청한 프로그램은 입출력이 완료될때까지 다음 명령을 수행 할 수 없기 때문에 그동안 CPU가 낭비된다. 또한 이 경우 다른 프로그램에게 cpu를 양도하는 방법을 사용하지 않고 입출력 연산이 완료될때까지 기다린다면, 매 시점 하나의 입출력 연산만이 일어날수 있다. 그러나 cpu의 효율적인 사용을 위해 입출력이 수행되는 동안 다른 프로그램에게 cpu를 양도하면 동시에 다수의 입출력 연산이 일어날 수 있다. 예를 들어 A라는 프로그램이 입출력을 요청해서 수행 중에 프로그램 B가 입출력 연산을 요청하면 또 다른 입출력 연산이 일어날 수 있기 때문이다. 이와 같이 다수의 프로그램이 동시에 입출력 연산을 요청하는 경우 동기성(synchronization)을 보장하기 위해 장치마다 큐를 두어 순서대로 처리할 수 있도록 한다.
위에 그림에서 보는것과 같이 장치마다 큐해더가 존재하고, 각 장치별로 입출력 수행 순서를 지켜주기 위한 큐를 관리하고 있다.컨트롤러는 이 순서에 따라 매 시점 하나씩 자신에게 주어진 입출력 작업을 처리하게 된다. 이때 cpu의 수행 속도에 비해 컨트롤러의 수행 속도난 장치자체의 작업 수행 능력은 매우 떨어진다. 그렇기 때문에 입출력이 완료될때까지 cpu가 아무 일도 못하게 하는것이 아니라, 입출력과 관련 없는 프로그램을 수행하도록 하고 , 요청된 입출력 연산이 완료되면 cpu에게 입출력이 완료되었음을 알려주는 방식으로 진행된다.
(2) 비동기식 입출력
비동기식 입출력은 입출력 연산을 요청한 후에 연산이 끝나기를 기다리는것이 아니라 cpu의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식을 말한다. 어떤 프로그램이 데이터를 디스크에서 읽어오라는 요청을 했을때 보통은 읽어온 결과를 이용해서 다음 연산을 수행하지만 경우에 따라서는 그 데이터와 관련 없이 수행할 수 있는 일이 있을 수 있다. 비동기식 입출력에서는 그러한 작업을 먼저 수행하고, 읽어오는 데이터가 반드시 있어야 수행할 수있는 일들은 입출력이 완료된 후에 수행하게 된다. 또한 입출력 요청이 디스크에서 읽어오는 요청이 아니라 디스크에 쓰는 요청이라면 쓰기 작업이 완료되기 전에도 다음 명령을 수행 할 수 있으므로 비동기식 입출력이 사용될 수 있다.
위의 그림으로 사용자가 I/O요청을 하면 동기식 입출력에서는 먼저 운영체제의 커널로 cpu의 제어권이 넘어와서 입출력 처리와 관련된 커널의 코드가 수행된다. 이때 입출력을 호출한 프로세스의 상태를 봉쇄 상태로 바꾸어 입출력이 완료될 때까지 cpu를 할당받지 못하도록한다. 입출력이 완료되면 I/O컨트롤러가 cpu에게 인터럽트를 발생시켜 입출력이 완료되었음을 알려준다 그러면 이 프로세스의 봉쇄 상태를 해제 시켜 cpu를 할당받을 수 있는 권한 생기게 된다.
반면 비동기식 입출력에서는 cpu 의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지며, 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업부터 처리한다. 한편 비동기식 입출력에서도 입출력 연산이 완료되면 동기식과 마찬가지로 인터럽트를 통해 이를 cpu에게 알려준다. 그러면 그 시점부터 읽어온 데이터를 필요로 하느 명령을 수행 할 수 있게 된다.
일반적으로는 운영체제에게 입출력 요청을 할 경우 해당 프로그램의 입출력이 완료될때 까지 그 프로그램을 봉쇄시키는 동기식 입출력을 사용한다. 이때 운영체제는 장치별로 입출력 처리를 기다리는 프로세스를 줄 세워 관리함으로써 동기성을 보장하게 되는것이다.
앞에 살펴본 것처럼 컨트롤러가 cpu에게 인터럽트를 발생시키면 cpu는 컨트롤러의 로컬버퍼와 메모리 사이에서 데이터를 옮기는 일을 하게 된다. 한편 모든 메모리 접근 연산이 cpu에서만 이루어질 경우 입출력 장치가 메모리 접근을 할 때마다 인터럽트에 의해 cpu의 업무가 방해되고 ,cpu 사용의 효율성이 떨어지는 문제점이 발생하게 된다.
이러한 비효율성을 극복하기 위해 cpu이외에 메모리 접근이 가능한 장치를 하나 더 두는 경우가 많은데, 이와 같은 장치를 DMA(Direct Memory Access)라고 부른다. DMA는 일종의 컨트롤러서, cpu가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는것을 막아주는 역할을 한다. DMA를 사용하게 되면 로컬버퍼에서 메모리로 읽어오는 작업을 cpu가 담당하는것이 아니라 DMA가 대행함으로써 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없어지는 것이다. DMA는 블록(block)이라는 큰단위로 정보를 메모리로 읽어온 후 cpu에게 인터럽트를 발생시켜 작업의 완료를 알려준다. 이러한 방식으로 cpu에 발생하는 인터럽트의 빈도를 줄여 cpu를 효율적으로 관리하고 입출력 연산을 빠르게 수행 할 수 있게 된다.
컴퓨터 시스템을 구성하는 저장장치는 주기억장치와 보조기억장치로 나누어볼 수 있다.
- 주기억장치: 보통 메모리라고 부르며 전원이 나가면 저자오디었던 내용이 모두 사라져버리는 휘발성(volatile)의 RAM을 메체로 사용하는 경우가 대부분이다.
- 보조기억장치: 전원이 나가도 저장된 내용을 기억할 수있는 비휘발성(novolatile)의 마그네틱 디스크를 주로 사용한다. 이 밖에 보조기억장치로 플래시 메모리,cd 마그네틱 테이프 등이 사용되기도 한다.
(1) 보조 기억장치의 용도 2가지
1. 파일 시스템(file system)
전원이 나가도 유지해야 할 정보가 있으며 그것을 파일 형태로 보조기억장치에 저장하게 된다. 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장하게 된다. 메모리는 휘발성 매체이기 때문에 비휘발성 메체인 디스크를 파일 시스템용으로 사용하는 것이다.
2. 스왑 영역(swap area)
메모리는 크기가 한정되고, 가격이 상대적을 비싼데다가 용량이 적은 경우가 대부분이다. 이 경우 운영체제는 프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고, 그렇지 않는 디스크의 스왑 영역에 내려놓게 된다. 이처럼 디스크에 내려놓는 일을 스왑 아웃(swap out)시킨다고 말하며, 스왑 아웃된 부분이 필요할 때는 다시 메모리 영역으로 올리게 된다. 이러한 스왑 영역은 프로그램이 실행될때 내용을 저장 했다가 프로그램이 종료될 때 삭제하는 메모리의 연장 공간으로서의 역할을 담당하므로 파일 시스템처럼 비휘발성 용도롤 사용되는것과는 역할이 구분된다.
(2) 보조기억 장치의 대표적인 예시
컴퓨터 시스템을 구성하는 자장장치는 빠른 저장장치부터 느린 저장장치까지 단계적인 계층 구조로 이루어진다. 빠른 저장장치는 단위 공간당 가격이 높기 때문에 적은 용량을 사용하며, 느린 저장장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다는 약점이 있다. 위의 그림에서는 저장장치의 계층은 최상위의 cpu내부에 존재한는 레지스터부터 메인 메모리까지,등의 휘발성 저장장치로 구성되는 부분이 상위에 존재하며, 반면 메인메모리보다 아랫부분을 구성하는 저장장치 계층은 전원이 나가도 지워지지 않는 비휘발성 저장장치이다.
위의 그림과 같이 상위 저장장치 계층으로 갈수록 접근 속도가 월등히 빠르지만 용량은 상대적으로 적다. 하지만 당장 팔요한 정보만을 선별적으로 저장하면 하위에 있는 큰 용량의 저장장치를 가지고 있는 것과 비슷한 성능을 가질 수 있다.
=> 캐시 메모리: 여러가지 캐싱 기법을 이용해 적은 용량의 캐시 메모리를 사용해서도 메인 메모리와 같은 큰 메모리를 가진것처럼 효율적으로 동작할 수 있다. 이때 해싱기법이란, 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법을 일컷는다. 캐싱 기법은 상대적으로 느린 저장장치에 선별적으로 저장함으로써 두 저장장치 사이의 속도를 완충시킨다.. 빠른 저장장치에 빈번히 사용될 정보를 저장하면 필요한 정보를 바른 저장장치에서 곧바로 찾을수 있는 경우가 많아져 전체적인 성능이 향상된다.
우리가 흔히 사용하는 운영체제는 여러 프로그램이 동시에 실행 될 수 있는 다중 프로그래밍(multi-programming)환경에서 동작한다. 그러므로 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기위해서 하드웨어에 대한 각종 보안 기법이 필요하고 이를 유지하기 위해서 운영체제는 커널모드(kernel mode, system mode)와 사용자모드(user mode)의 두 가지 모드를 지원한다.
커널모드는 운영체제가 cpu의 제어권을 가지고 운영체제 코드를 실행하는 모드로서, 이 모드에서는 모든 종류의 명령을 다 실행 할 수 있다.
반면 사용자모드에서는 일반 사용자 프로그램이 실행되며 제한적인 명령만을 실횅 가능하도록 함으로써 하드웨어의 보안을 유지하는것이다.
그러나 중요한 연산을 운영체제만이 수행할 수 있도록 정의하더라도 사용자 프로그램이 프로그램 내에서 그런 종류의 연산을 수행해버리면 제어가 소용이 없게 된다. 그러므로 이러한 상황을 방지하기 위해서는 하드웨어적인 지원이 필요하다. 이 하드웨어적인 지원에는 cpu내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시하게 된다.
모드비트가 0으로 세팅되어 있으면 커널모드로서 모든 명령을 수행할 수 있고, 모드비트가 1로 세팅되어 있으면 사용자 모드로서 제한된 명령만을 수행 할 수 있다. cpu는 보안과 관련된 명령을 수행하기 전에는 항상 모드비트를 조사해 그 값이 0으로 세팅된 경우에만 그 명령을 수행한다. 그리고 운영체제가 cpu를 점유해 자신의 코드를 수행하다가 사용자 프로그램에게 cpu의 제어권을 넘길때 모드비트를 1로 세팅해 넘기게 된다.이러한 방식으로 사용자 프로그램은 보안과 관련된 중요한 명령의 수행에 제약 받기 때문에 하드웨어를 보안 할 수 있다.
이제 각종 하드웨어 장치에서 보안이 유지되는 방식에 대해 자세히 알아보도록해보자. 사용자 프로그램이 디스크에 저장된 파일에 자유롭게 접근 할 수 있다면 보안상 문제가 발생할 수 있다. 자신의 소유가 아닌 다른 사람의 파일에 접근할 수 있기 때문이다.그래서 모든 입출력 명령은 특권명령으로 규정해서 사용자 프로그램이 직접 입출력하는것을 차단한다.
그리고 입출력이 필요할 때에는 운영체제에 요청하여 운영체제가 입출력 명령을 대신 수행하게 된다. 입출력은 특권명령이기 때문에 모드비트가 0일때에만 수행 할 수 있으며, 사용자 프로그램이 입출력을 하고 싶으면 시스템 콜로 운영체제에 요청해야한다. 그러면 운영체제가 cpu를 할당하고 인터럽트 벡터의 특정 위치를 통해 해당 인터럽트 처리루틴으로 이동한다. 이때 인터럽트 하드웨어에 의해 모드비트가 0으로 세팅되어 운영체제는 입출력을 수행할 수 있게 된다. 한편 운영체제는 입출력 요청이 올바른 요청인지 확인한 후 입출력을 실해하기 때문에 파일에 대한 보안을 유지 할 수 있다. 요청된 입출력이 완료되면 cpu 제어권을 다시 사용자 프로그램에게 넘길 수 있게 되며, 사용자 프로그램이 다시 cpu를 할당받으면 시스템 콜 이후의 명령을 수행할 수 있게 된다.
디스크뿐 아니라 메모리의 경우에도 보안이 필요한다. 이는 여러 프로그램이 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기 때문이다. 예를 들어 하나의 사용자 프로그램이 C언어의 포인터 등 메모리 주소 참조 연산을 잘못 사용해 다른 사용자 프로그램의 메모리 영역이나 운영체제 커널이 위치한 영역을 참조하려는 시도를 할 수 있다.
이러한 문제를 해결하기위해 2개의 레지스터를 사용해서 프로그램이 접근하려는 메모리 부분이 합법적인지 체크함으로써 메모리를 보호할 수 있다. 이때 사용되는 2개의 레지스터는 기준 레지스터(base register)와 한계 레지스터(Init register)이다.
기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근 할 수 있는 메모리상의 가장 작은 주소를 보관하고 있고, 한계 레지스터는 그 프로그램이 기준 레지스터 값부터 접근할 수있는 메모리의 범위를 보관하고 있다. 즉 어떤 프로그램이 실제 메모리에 올라가 있는 부분의 시작 주소와 그 프로그램의 길이를 각각 기준레지스터와 한계 레지스터에 보관해 메모리 접근 연산이 있을 때마다 하드웨어적으로 현재 접근하혀는 위치가 합법적인 범위에 있는지 체크하게 된다.
사용자프로램은 기준 레지스터에 있는 주소부터 기준 레지스터 +한계 레지스터 값 사이의 주소 영역에만 접근 할 수 있으며, 접근하려는 주소가 이 범위 안에 없으면 불법적인 메모리 접근이므로 예외상황이라는 일종의 소프트웨어적인 인터럽트가 발생하게 된다. 예외상황은 운영체제에 소프트웨어 인터럽트를 발생시켜 cpu의 제어권을 해당 프로그램으로부터 운영체제로 이양시키고, 운영체제는 예외상황을 발생시킨 프로그램을 강제로 종료시킨다. 단 여기에서 살펴본 기준 레지스터와 한계 레지스터를 통한 메모리 보호기법은 하나의 프로그램이 메모리의 한 영역에 연속적으로 위치하는 단순화된 메모리 관리 기법을 사용하는 경우에 한정된 설명이다.
일반적으로 cpu는 컴퓨터 시스템내에 하나밖에 존재하지 않기 때문에 특정 프로그램이 cpu를 독점해 무한반복무을 수행하는 등 부적절한 방법으로 cpu의 사용 권한을 독점하고 있다면 다른 프로그램 및 운영체제가 cpu를 빼앗는 방법이 없게 된다. 이와 같이 cpu가 하나의 프로그램에 의해 독점되는것을 막기 위해 운영체제는 타이머(timer)라는 하드웨어를 사용한다. 타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 cpu의 제어권을 획득할 수 있도록 하는 역할을 수행한다. 타이머에 의해 발생되는 이터럽트 처리루틴의 역할은 지금 cpu를 점유하고 명령을 실행하는것이다. 타이머는 일정한 시간 단위로 세팅 될 수 있으며 매 클럭 틱(clock tick)때마다 1씩 감소한다. 그리고 타이머가 0이되는 순간 인터럽트가 발생하게 된다. 여기서 타이머의 값을 세팅하는 명령을 로드타이머(load timer)라고 하고 이는 특권명령에 속한다.
사용자 프로그램이 디스크의 파일에 데이터를 쓰거나 디스크의 파일로부터 데이터를 읽어오는 행위, 키보드로부터 입력을 받거나 수행 결과를 화면에 출력하는 행위 등은 모두 특권명령인 입출력 명령에 해당하므로 사용자 프로그램이 직접 수행 할 수 없다. 이러한 입출력 명령은 운영체제 코드에 구현되어 있으며, 사용자 프로그램은 직접 입출력을 수행하는 대신 운영체제에게 시스템 콜이라는 서비스 대행 요청을 하여 입출력을 수행한다. 시스템 콜은 일종의 소프트웨어적인 인터럽트로서 사용자 프로그램이 시스템 콜을 할 경우 트랩이 발생해 cpu의 제어권이 운영체제로 넘어가게 된다.체제는 해당 시스템 콜을 처리하기 위한 루틴으로 가서 정의된 명령을 수행한다.