[JAVA/자바] 멀티태스킹과 멀티스레딩의 개념
컴퓨터 기술 용어로서 멀티태스킹은 여러 프로그램 코드(작업,태스크)가 동시에 실행되는 것을 말한다.
간단한 응용프로그램은 보통 하나의 작업(태스크)만 하는 경우가 대부분이지만, 큰 규모의 응용프로그램은 많은 경우 여러 작업(태스크)을 동시에 실행한다. 응용프로그램의 여러 작업(태스크)이 동시에 진행되게 하는 기법으로,응용프로그램의 목적을 효율적으로 달성하게 한다.
스레드와 멀티태스크
스레드(thread) : 멀티태스킹 응용프로그램 작성을 위함
컴퓨터 용어로 사용되는 스레드는 실의 의미와 일맥상통한다.
컴퓨터에서 사용하는 스레드(thread)는 thread of control의 준말로서 프로그램 코드를 실행하는 하나의 실 혹은 제어의 개념이다. 하나의 실로 하나의 바느질밖에 할 수 없듯이 하나의 스레드로 하나의 작업밖에 처리할 수 없다.
구체적으로 스레드는 운영체제나 JVM에서 태스크(작업)를 실행하는 단위로서, 운영체제나 JVM에 의해 관리되는 단위이다. 자바 스레드에만 국한시켜 설명해보면, JVM은 하나의 태스크(작업)를 실행하기 위해 하나의 스레드를 만들고, 스레드로 하여금 태스크 코드를 실행하도록 한다.
위의 그림은 테트리스를 구성하는 3개의 태스크 코드를 3개의 스레드로 실행시키는 멀티스레딩을 보여준다. 3개의 스레드는 테트리스의 실행 시작과 함께 생성되며, JVM이 3개의 스레드를 스케줄링하여 번갈아 실행시킨다. JVM의 영역 안에 그려진 스레드A, 스레드B, 스레드C는 3개의 스레드에 관한 여러 정보(ex.오디오 재생 태스크)를 가진 데이터 블록을 나타낸다. JVM은 이들을 보면서 3개의 스레드가 만들어져 있음을 알고, 이중에서 하나를 스케줄링하여 실행시킨다.
멀티태스킹과 멀티스레딩
멀티태스킹을 실현하기 위해 2가지 방법이 사용되고 있다. 멀티프로세싱(multi-processing)은 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 기법이다. 각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행된다. 그러므로 하나의 응용프로그램에 속하는 프로세스들은 변수를 공유할 수 없기 때문에, 프로세스들 사이의 통신(IPC, Inter Process Communication)이 어렵고 한다 해도 오버헤드가 크다. 또한 프로세스 사이의 문맥 교환(context switch)에 따른 과도한 작업량과 시간 소모의 문제점이 있다.
이러한 문제점을 개선하기 위해 제안된 방법이 멀티스레딩(multi-threading)이다. 멀티스레딩은 하나의 응용프로그램을 동시처리가 가능한 여러 작업(코드)으로 분할하고 작업의 개수만큼 스레드를 생성하여 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다. 모든 스레드는 응용프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 작고, 스레드 사이의 문맥 교환시 소요되는 작업량이 많아 문맥 교환이 빠르다는 장점이 있다. 윈도우, 리눅스 등 많은 운영체제들이 멀티프로세싱을 지원하고 있지만 멀티스레딩을 기본으로 하고 있다.
웹 서버 소프트웨어는 대표적인 멀티스레드 응용프로그램이다. 네트워크 클라이언트로부터 웹 검색 요청이 전달되면 웹 서버 스레드는 클라이언트를 전담하는 웹 서비스 스레드를 생성하여 검색을 하고 결과를 클라이언트로 전송하도록 한다. 따라서 동시에 100명의 클라이언트가 접속하면 100개의 웹 서비스 스레드가 각각 자신의 웹 클라이언트 요청을 서비스한다. 만약 웹 서버 소프트웨어를 싱글스레드(single thread)로 구현한다면 웹 서버가 한 번에 한 클라이언트씩 순차적으로 서비스하게 되므로 뒤에 접속한 클라이언트는 많은 시간을 기다려야 할 것이다.
멀티스레딩은 응용프로그램이 다수의 스레드를 가지고 다수의 작업을 동시에 처리함으로써, 한 스레드가 대기하는 동안 다른 스레드를 실행하여 시간 지연을 줄이고 자원의 비효율적 사용을 개선한다.
References 명품 JAVA Programming 4th edition