멀티태스킹은 동시성과 병렬성에서 동시성의 개념입니다. 여러 작업들을 나누어 빠르게 번갈아가며 수행하여 프로세서의 개수보다 많은 일을 동시에 처리하는 것이 멀티태스킹입니다. 멀티태스킹은 하나의 작업을 처리하는 도중 다른 작업도 처리해야 하기때문에 스케쥴링 방법이 중요합니다. 따라서 작업을 스케쥴링하는 방식에 따라 크게 2가지로 분류됩니다.
우선순위에 의해서 제어권을 선점하여 작업을 수행하는 방식으로 선점형 멀티태스킹(Preemptive multitasking)이 있습니다. '선점한다'는 것은 현재 다른 프로세스나 스레드가 선점중인 CPU, Memory와 같은 컴퓨터 자원을 다른 프로세스나 스레드가 선점하는 것이 가능하다는 것입니다. 따라서 현재 실행중인 작업을 중지하고 다른 작업을 먼저 처리하도록 결정할 수 있으며, 이러한 매커니즘은 인터럽트 매커니즘을 통해 결정할 수 있습니다.
선점형 멀티태스킹을 사용하면 I/O Bound작업을 효율적으로 처리할 수 있습니다. I/O 대기 시간동안 다른 작업을 처리하고 I/O 작업이 완료되면 인터럽트를 발생시켜 다시 작업을 이어서 처리할 수 있습니다. 대부분의 운영체제의 경우 I/O나 이벤트를 처리하기 위해서 선점형 멀티태스킹을 사용합니다.
다만 선점형 멀티태스킹의 경우 인터럽트에 의해서 프로세스가 중단될 수 있기 때문에 자원의 무결성을 보장하기 위해 동기화처리를 해야합니다. 이로 인하여 프로그램의 구현과 문제가 발생할 경우 추적하기 어려운 점이 있습니다.
비선점형 멀티태스킹은 협력형 멀티태스킹이라고도 불립니다. 비선점형 멀티태스킹은 작업을 수행하기 위한 컴퓨터 자원의 제어권을 작업을 수행중인 프로세스나 스레드가 가지고 있습니다. 따라서 작업이 특정 상태가 되거나 특정 범위의 작업을 수행하고 나면 제어권을 양보하고, 제어권을 받은 작업이 자신의 작업을 이어서 처리하는 방식으로 동작합니다. 즉, 제어권의 통제가 작업을 수행하는 프로세스나 스레드에 의해서 이루어지는 것입니다.
비선점형 멀티태스킹의 경우 다른 작업의 인터럽트에 의해서 제어권이 넘어갈 일이 없습니다. 따라서 자원의 동기화를 위한 별도의 처리를 할 필요가 없습니다. 버그나 문제가 생기는 경우에도 인터럽트로 인한 부분은 고려하지 않고 작성된 로직으로만으로 파악할 수 있습니다.