본문 바로가기

Java

자바 스레드 기초

멀티태스킹이란?

멀티태스킹(multitasking)이란 다수의 작업을 동시에 처리하는 것을 말한다. 일상 생활에서의 예시를 들어 설명하자면, 노래를 들으면서 운동을 하는 행위, 기타를 치면서 노래를 부르는 행위, 울면서 웃는 행위 등으로 생각하면 쉽겠다. 

윈도우 운영체제의 미디어 플레이어는 오디오를 출력하는 태스크와 스크린에 동영상을 출력하는 태스크(재생하는 화면), 그리고 사용자의 키와 마우스 입력을 처리하는 태스크 등 최소한 3개의 태스크가 동시에 실행되고 있다. 만일 이 3개의 태스크를 순차적으로 실행하면 오디오나 비디오가 간헐적으로 끊어지는 일이 발생할 수 있다. 

하나의 프로그램에 여러 작업(태스크)를 구현하는 멀티 태스킹을 이용하면, 실행 중에 여러 작업(태스크)를 동시에 실행시켜 프로그램이 효율적으로 실행되게 한다.

 

스레드와 운영체제

스레드(thread)란 운영 체제에 의해 관리되는 하나의 작업 혹은 태스크를 말하며, 다수의 스레드를 동시에 실행시키도록 응용프로그램을 작성하는 기법을 멀티스레딩이라고 부른다. 윈도우의 미디어 플레이어는 최소한 3개의 스레드가 동시에 실행되는 멀티스레딩 프로그램이다. 수행할 작업을 프로그램 코드로 작성하는 것은 응용프로그램 개발자의 몫이고, 이 프로그램 코드를 스레드로 작동시키는 것은 운영체제의 몫이다. 그러므로 개발자는 작성한 코드를 하나의 스레드로 만들어 줄 것을 운영체제에 요청해야 한다. 스레드는 실행 중 다른 스레드를 생성하거나 중단시킬 수 있지만 반드시 운영체제를 통해야 한다. 스레드를 생성하고 중단시키고 종료시키는 권한은 모두 운영체제에게 있다. 또한 실행할 스레드를 스케줄링하는 것 역시 운영체제이다. 

 

멀티태스킹과 멀티스레딩

멀티프로세싱하나의 응용프로그램여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 기법이다. 각 프로세스는 고유한 메모리 영역을 보유하고 독립적으로 실행된다. 그러므로 하나의 응용프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없기 때문에, 프로세스들 사이에 상용하는 통신 기법(IPC, Inter Process Communicaition)이 어렵고 오버헤드가 크다. 또한 프로세스 사이의 문맥 교환(context switch)에 따른 과도한 작업량과 소모의 문제점이 있다.

이런 문제점을 개선하기 위해 제안된 방법이 멀티 스레딩이다. 멀티 스레딩하나의 응용 프로그램여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 기법이다. 모든 스레드가 응용프로그램 내의 자원과 메모리를 공유하므로 통신에 따른 오버헤드가 비교적 크지 않고, 스레드 사이의 문맥 교환 시 작업량이 작아 문맥 교환이 빠른 장점을 지닌다. 멀티 스레딩 시 운영체제의 스케줄링 단위는 스레드이다. 윈도우, 리눅스 등 많은 운영체제들이 멀티프로세싱을 지원하고 있지만 멀티스레딩을 기본으로 하고 있다. 

웹 서버는 대표적인 멀티스레드 응용프로그램이다. 네트워크 클라이언트로부터 웹 검색 요청이 전달되면 웹 서버는 그 클라이언트를 전담하는 웹 서비스 스레드를 생성하여 검색을 하고 결과를 클라이언트로 전송하도록 한다. 그러므로 웹 서버에 동시에 1000명의 클라이언트가 접속하면 1000개의 웹 서비스 스레드가 각각 자신의 웹 클리이언트에 요청을 응답한다. 만일 이게 싱글스레드로 되어있다면 클라이언트는 많은 시간을 기다려야 할 것이다. 

 

자바 스레드와 JVM

자바 스레드는 앞서 설명한 일반 스레드와 거의 차이가 없으며, JVM이 운영체제의 역할을 한다. 자바에는 프로세스가 존재하지 않고 스레드만 존재한다. 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.

하나의 JVM은 하나의 응용프로그램만 실행한다. JVM이 실행을 시작하면 자바 응용프로그램 클래스 파일을 로딩하여 실행한다. 자바 응용프로그램이 종료되면 JVM도 같이 종료된다. 만일 한 컴퓨터에서 n개의 자바 응용프로그램이 실행되고 있다고 하면 n개의 JVM이 실행되고 있는 것이다. 이들은 각각 별개의 메모리 영역에서 독립적으로 실행된다. 

JVM은 멀티스레딩을 지원하며 자바 응용프로그램은 하나 이상의 스레드를 생성할 수 있다. 

자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다. 개발자가 할 일은 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에게 요청하는 일 뿐이다. 스레드를 관리하는 모든 일은 JVM이 한다.

 

출처

  • 명품 자바 에센셜