멀티태스킹
멀티태스킹(Multitasking)은 멀티(Multi)와 태스킹(Tasking)의 합성어로서 다수의 작업을 동시에 처리하는 것을 말한다.
스레드와 멀티태스크
스레드(Thread)란 Thread Of Control 준말로서 프로그램 코드를 실행하는 제어의 개념이다. 하나의 스레드로는 하나의 작업밖에 처리할 수 없다. 구체적으로 가상 스레드 런타임 라이브러리에 의해 관리되는 코드 실행 단위이며, (Java 21 이후부터)자바에서는 프로세스가 존재하지 않고 스레드 개념만 존재하며, 프로젝트 룸을 통해 가상 스레드를 도입했다. 이는 기존의 메모리를 많이 소모하는 OS 스레드 풀 구조의 대안으로 제시되었다. 가상 스레드의 특징은 다음과 같다.
-
경량화 및 대규모 동시성: OS 스레드보다 적게 관리되는 스택을 특징으로, 적은 자원으로 수천만 개의 선점형 작업 및 이벤트를 처리할 수 있게 한다. 이는 주 메모리 양에 비례하여 스레드 수를 증가시킨다.
-
선점형(Preemptive) 실행: 프로그래머의 개입 없이 현재 작업을 완료하기 전에 이벤트에 반응할 수 있으며, 응답 성능 향상에 중요하다.
-
프로그래머의 개입 불필요: 코루틴과 달리 프로그래머의
yield와 같은 개입이 필요하지 않다. -
메모리 공유: OS 스레드와 마찬가지로 프로세스 전반에 걸쳐 메모리를 공유하므로, 동기화 대상 메모리 개체를 자유롭게 공유하고 접근할 수 있다.
자바 스레드와 JVM
스레드 스케줄링은 전적으로 JVM에 의해 이루어진다. 스레드가 몇 개 존재하는지, 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지, 스레드의 상태는 무엇인지, 스레드의 우선 순위는 얼마인 지 등 많은 정보를 JVM이 관리한다.
멀티태스킹과 멀티스레딩
멀티태스킹을 실현하기 위해 2가지 방법이 사용되고 있다. 멀티프로세싱(Multiprocessing)은 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 기법이다. 멀티프로세싱의 문제점은 다음과 같다.
-
변수 공유 불가: 각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행되기에 변수를 공유할 수 없다.
-
독립적인 프로세스 간 통신(Inter Process Communication, IPC): 하나의 응용 프로그램에 속하는 프로세스들은 독립적으로 실행되기에 변수를 공유할 수 없어 프로세스 사이의 통신이 어렵다.
-
문맥 교환에 따른 과도한 작업: 프로세스 사이의 문맥 교환에 따른 시간 소모에 따른 과도한 작업량(오버헤드)이 발생한다.
이러한 문제점을 개선하기 위해 제안된 방법이 있다. 멀티스레딩(Multithreading)은 하나의 응용 프로그램을 동시 처리가 가능한 여러 작업으로 분할하고 작업의 개수만큼 스레드를 생성하여, 각 스레드에 하나의 작업을 처리하도록 하는 기법이다. 멀티스레딩의 특징은 다음과 같다.
-
동시 처리: 하나의 응용 프로그램을 여러 작업으로 분할하여, 작업의 개수만큼 스레드로 하여금 하나의 작업을 처리하도록 할 수 있다.
-
자원 공유: 모든 스레드는 응용 프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 작고, 스레드 사이의 문맥 교환 시 소요되는 작업량이 작다.
-
빠른 문맥 교환: 스레드 사이의 작업량이 작아 문맥을 교환하는데 시간이 적게 소요된다.
-
효율적인 자원 사용: 한 스레드가 대기하는 동안 다른 스레드를 실행하여 시간 지연을 줄이고 자원의 비효율적 사용을 개선한다.