01. 멀티태스킹
멀티태스킹이란?
멀티태스킹(multitasking)이란 멀티+태스킹의 합성어로 다수의 작업을 동시에 처리하는 것을 말한다.
멀티태스킹은 컴퓨터 기술용어로 여러 프로그램의 코드(작업, 태스크)가 동시에 실행되는 것을 말한다.
멀티태스킹 프로그램 사례
하나의 프로그램이 하나의 작업(태스크)만 하는 경우가 대부분이지만, 하나의 프로그램이 여러 작업(태스크)를 동시에 실행하는 경우가 있다. [미디어 플레이어, 테트리스 게임 등 의 멀티태스킹]
하나의 프로그램에 여러 작업을 구현하는 멀티 태스킹을 이용하면, 실행 중에 여러 작업을 동시에 실행시켜 프로그램이 효율적으로 실행되게 한다.
스레드와 운영체제
스레드(thread)란 운영 체제에 의해 관리되는 하나의 작업 혹은 태스크를 말하며, 다수의 스레드를 동시에 실행 시키도록 응용프로그램을 작성하는 기법을 멀티스레딩(multi-threading)이라고 부른다. 태스크와 스레드는 서로 바꾸어 사용해도 무관하다.
스레드는 다음과 같이 스레드 실행 코드와 운영체제가 관리하는 스레드 정보로 이분화 된다.
- 스레드 코드 : 작업을 실행하기 위해 사용자가 작성한 프로그램 코드
- 스레드 정보 : 스레드 명, 스레드 ID, 스레드 소요시간, 스레드 우선순위 등 운영체제가 관리하는 정보
수행할 작업을프로그램 코드로 작성하는 것은 응용프로그램 개발자의 몫이고, 이 프로그램 코드를 스레드로 관리하고 작동시키는 것은 운영체제의 몫이다. 그러므로 개발자는 작성한 코드를 하나의 스레드로 만들어 줄 것을 운영체제에게 요청해야 한다. 스레드는 실행 중다른 스레드를 생성하거나, 중단시킬 수 있지만, 반드시 운영체제를 통해야 한다. 스레드를 생성하고 중단시키고, 종료시키는 권한은 모두 운영체제에게 있다. 또한 실행할 스레드를 스케줄링하는 것 역시 운영체제 이다.
멀티태스킹과 멀티스레딩
컴퓨터 기술의 발전과 함께 멀티태스킹을 실현하기위해 두가지 방법이 사용되고 있다.
1) 멀티 프로세싱(multi-processing)은 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)를 처리하도록 하는 기법. 각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행된다. 그러므로 하나의 응용프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없기 때문에, 프로세스 들 사이에 사용하는 통신기법이 어렵고, 오버헤드가 크다. 또한 프로세스 사이의 문맥 교환에 따른 과도한 작업량과 시간 소모의 문제점이 있다.
2) 이런 문제점을 개선하기 위해 제안된 방법이 멀티스레딩이다. 멀티스레딩은 하나의 응용프로그램을 여러 개의 스레드로 구성하고, 각스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다. 모든 스레드가 응용프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 비교적 크지않고, 스레드 사이의 문맥 교환 시 작업량이 작아 문맥 교환이 빠른 장점을 지닌다. 멀티스레딩 시 운영체제의 스케줄링 단위는 스레드이다.
윈도우, 리눅스 등 많은 운영체제들이 멀티프로세싱을 지원하고 있지만, 멀티스레딩을 기본으로 하고 있다.
멀티스레딩은 응용프로그램이 다수의 스레드를 가지고 다수의 작업이나 요청을 동시에 처리함으로써, 여러 작업을 순차적으로 진행하는 경우 발생하는 시간 지연과 자원의 비효율적 사용을 개선한다.
자바 스레드와 JVM
자바 스레드는 앞서 설명한 일반 스레드와 거의 차이가 없으며, 자바 가상 기계 (JVM : Java Virtual Machine)가 운영체제의 역할을 한다. 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
하나의 JVM은 하나의 자바 응용프로그램만 실행한다. JVM이 실행을 시작하면 자바 응용프로그램 클래스 파일을 로딩하여 실행한다. 자바 응용프로그램이 종료되면 JVM도 함께 종료된다. 만일 한 컴퓨터에서 n개의 자바 응용프로그램이 실행된다고하면 n개의 JVM이 실행되고 있는 것이다. 이들 각 자바 응용프로그램은 별개의 메모리 영역에서 독립적으로 실행된다. JVM은멀티스레딩을 지원하며, 자바 응용프로그램은 하나 이상의 스레드를 생성할 수 있다.
자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다. 또한 스레드가 몇 개 존재하는지, 스레드로 실행디는 프로그램 코드의 메모리 위치는 어디인지, 스레드의 상태는 무엇인지, 스레드의 우선순위는 얼마인지 등 많은 정보는 JVM이 관리한다. 개발자의 임무는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에게 요청하는 일뿐이다. 스레드를 관리하는것은 오로지 JVM이다.