프로그래밍 언어/JAVA

자바의 멀티스레딩

· 코딩마이데이

멀티스레드와 자바 가상 기계(JVM)

자바에는 프로세스(process)가 존재하지 않고 스레드 개념만 존재하며, JVM은 멀티스레딩만 지원합니다. 자바 스레드(java thread)는 JVM에 의해 스케줄되는 실행 단위 코드 블록입니다.

 

하나의 JVM은 하나의 자바 응용프로그램만 실행합니다. 사용자가 자바 응용프로그램을 실행시키면, JVM이 먼저 실행되고 JVM이 자바 응용프로그램을 로딩하여 실행시킵니다. 자바 응용프로그램이 종료되면 JVM도 함깨 종료됩니다. 만일 한 컴퓨터에서 n개의 자바 응용프로그램이 실행된다는 하면 n개의 JVM이 실행된다. JVM은 멀티스레딩을 지원하며 자바 응용프로그램은 하나 이상의 스레드를 생성할 수 있습니다.

JVM은 하나의 자바 응용프로그램만 실행 가능

 

2개 이상의 자바 응용프로그램이 각각 JVM에 의해 실행되며, 서로 정보를 주고받고자 하는 경우 소켓 통신과 같은 통신 방법을 이용합니다.

두 갸의 자바 응용프로그램이 실행되는 방법

 

 

자바의 스레드와 JVM

자바 스레드는 다른 운영체제의 스레드와 크게 다르지 않습니다. 응용프로그램 개발자 입장에서 스레드를 만들기 위해서는 스레드로 실행될 프로그램 코드를 작성해야 합니다. 이 프로그램 코드를 JVM에 스레드로 등록하는 간단한 절차를 마치면 새로운 스레드가 탄생합니다.

그 후부터 스레드 코드를 실행시키고, 잠깐 중단시키기도 하는 등 스레드 스케줄링은 전적으로 JVM에 의해 이루어집니다. 스레드가 몇 개 존재하는지, 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지, 스레드의 상태는 무엇인지, 스레드의 우선순위는 얼마인지 등의 정보들도 JVM이 관리합니다. 개발자가 할 일은 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에게 요청하는 것 뿐입니다. 스레드를 관리하는 일은 모두 JVM의 일이기 때문입니다.

위의 그림은  자바 응용프로그램, 스레드 코드, JVM, 스레드 정보와의 관계를 보여줍니다. 그림에서 자바 응용프로그램은 4개의 스레드를 생성한 상태입니다. 스레드가 생성되면 스레드에 관련된 정보(Thread Control Block, TCB)가 생성되며 이들은 모두 JVM에 의해 관리됩니다.  TCB 정보를 토대로 어떤 스레드를 실행시킬지를 결정하는 스케줄링은 JVM에 의해 이루어집니다. 만약 JVM이 스레드2를 선택하면 2번째 TCB에 기록된 스레드2의 코드 주소에서 실행을 시작합니다. 위의 그림은 JVM이 스레드2를 선택하여 스레드2의 코드가 실행되고 있는 상태입니다. 스레드가 종료되면 해당 TCB는 사라진다. 모든 스레드가 종료되면 JVM이 종료되고 자바 응용프로그램도 종료됩니다.