대부분의 사람들이 컴퓨터를 이용할 때 하나의 프로그램만 이용하는 것이 아닌 여러 프로그램을 실행하며 컴퓨터를 이용하고 있습니다. 노래를 들으면서 게임을 하거나 개발을 하면서 검색을 하는 것처럼 여러개의 프로그램을 실행합니다. 이 때 각각의 프로그램은 동시에 동작하는 것처럼 느껴집니다. CPU 코어 수보다 더 많은 프로그램을 실행하는데에도 동시에 동작하는 것처럼 느껴지는 것은 어떻게 하는 것일까요?
먼저 CPU가 한 번에 하나의 작업만 처리하는 상황을 생각해봅시다. 만약 CPU가 작업을 순차적으로 처리한다면, 여러 작업이 동시에 진행되는 것처럼 느껴지지 않을 것입니다. 예로 들어, 사용자가 노래를 들으며 검색을 하는 상황을 살펴보겠습니다.
위 그림과 같이 CPU가 한 번에 한 작업만 처리한다면, 노래를 듣는 작업과 검색 작업을 번갈아 가며 처리하게 됩니다. 이는 다음과 같은 문제를 유발합니다.
이와 같은 방식은 사용자에게 불편함을 초래할 뿐만 아니라 CPU 자원을 비효율적으로 사용하는 방식입니다. 이를 알아보기 위해 검색의 과정을 조금 더 세분화 하겠습니다.
이 중 “검색 실행 및 대기” 단계는 네트워크를 통해 외부 서비스와 통신(I/O 작업)하는 과정으로, 외부로부터 응답이 올 때까지 CPU가 대기 상태에 놓이게 됩니다. 이 대기 시간 동안 CPU는 다른 작업을 수행하지 않고 낭비됩니다. 이와 같이 CPU사용률의 문제를 해결하고자 다중 프로그래밍 시스템이 등장합니다.
다중 프로그래밍 시스템은 단일 프로세스 시스템의 단점인 CPU 사용율 문제를 해결하기 위해 메모리에 여러 프로그램을 적재하여 CPU가 번갈아가면서 실행하는 시스템입니다. 다중 프로그래밍 시스템의 목적은 CPU의 사용률을 극대화하는 것입니다. 다중 프로그래밍 시스템에서 I/O 작업이 발생하면 다른 프로그램을 실행합니다.
앞선 단일 프로세스 시스템과 다르게 노래를 실행하는 과정에서 I/O가 발생하면 CPU가 대기를 하는 것이 아닌 검색(다른 작업)을 수행한다는 점에서 단일 프로세스 시스템에 비해 CPU의 사용률이 높다는 것을 볼 수 있습니다.
하지만 CPU가 처리하는 작업이 I/O가 발생하지 않는 작업이라면 다중 프로그래밍 시스템 역시 단일 프로세스 시스템과 마찬가지로 하나의 작업이 처리되고 다른 작업을 처리하는 방식으로 수행됩니다 즉, 다중 프로그래밍 시스템도 단일 프로세스 시스템과 마찬가지로 사용자에게는 동시에 여러 프로그램이 동작하는 느낌을 제공할 수 없습니다.
시분할 시스템은 타임슬라이스를 도입하여 프로그램이 아주 짧은 시간동안만 CPU를 점유하는 방법
으로 앞선 다중 프로그래밍 시스템에서 발생하는 문제(하나의 I/O 없는 작업이 CPU를 끝까지 점유하는 상황)를 해결하기 위해 등장했습니다. 시분할 시스템에서 작업 전환은 I/O
뿐만 아니라 정해진 타임슬라이스
초과했을 때 발생합니다.
위의 그림과 같이 노래 듣기 작업과 검색 작업이 빠르게 전환이 되면서 사용자 입장에서는 마치 노래를 들으면서 검색하는 것처럼 느끼게 됩니다. 이와 같이 시분할 시스템이 도입되면서 CPU 사용률 향상과 더불어 사용자의 편의성 모두 증가했지만 한정된 메모리 안에서 여러 프로그램을 실행하다보니 메모리 부족현상이 발생했습니다.
💡CPU는 타임슬라이스가 완료되었다는 것을 어떻게 알 수 있을까?
타임슬라이스는 타이머 인터럽트를 통해 구현됩니다. 즉, CPU는 인터럽트를 통해서 해당 작업이 타임슬라이스를 넘어갔다는 것을 알 수 있습니다.
앞서서 시분할 시스템에서는 타이머 인터럽트를 통해서 CPU가 해당 작업의 타임슬라이스가 넘었는지 파악한다는 것을 알았습니다. 여기서 말하는 인터럽트는 무엇일까요? 인터럽트는 프로그램을 수행하는 도중에 발생하는 이벤트를 의미합니다. 인터럽트가 발생하면 CPU는 진행하던 작업을 멈추고 이벤트로 넘어온 작업을 처리해 나가야 합니다.
인터럽트는 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 구분됩니다. 이 두 인터럽트에 대해서 간단하게 알아보겠습니다.
하드웨어 인터럽트는 키보드, 마우스 또는 프린터 등과 같은 외부 하드웨어 장치로부터 발생하는 인터럽트입니다. 하드웨어의 인터럽트의 경우 CPU가 폴링작업으로 외부 작업이 완료되었는지 기다리는 것을 방지하고자 도입되었습니다. 하드웨어 인터럽트의 예시는 다음과 같습니다.
💡폴링은 무엇인가요?
폴링은 하나의 장치가 다른 장치의 상태를 주기적으로 검사하여 원하는 조건을 달성했는지 확인하는 방법 입니다. 해당 방식은 CPU가 계속 다른 장치의 변화를 주기적으로 파악하기 때문에 자원의 낭비로 볼 수 있습니다.(CPU가 다른 프로세스의 작업을 처리하는 것이 아닌 해당 장치의 변화를 계속 확인하고 있기 때문)폴링 VS 인터럽트
- 폴링은 CPU가 메인 요청을 한 후 지속적으로 계속 상태변화를 체크한다.
- 인터럽트는 CPU가 요청을 한 후 다른 작업을 수행하며 상태변화가 완료된 것을 장치로부터 알게된다.
일상 생활에서의 예시 (병원)
- 폴링 : 간호사가 주기적으로 환자를 체크하는 상황
- 인터럽트 : 환자가 위급해져 간호사를 호출하는 상황
소프트웨어 인터럽트는 컴퓨터의 내부 시스템(프로그램)에 의해서 발생하는 인터럽트를 의미합니다. 프로그램이 실행되는 도중에서 시스템 호출을 하는 경우나 예외가 발생하는 경우에 소프트웨어 인터럽트가 발생합니다. 이는 트랩이라고도 불립니다. 소프트웨어 인터럽트에 대한 예시는 다음과 같습니다.