Logo

프로세스와 쓰레드

본 포스팅는 오라클 자바 튜토리얼의 Processes and Threads를 번역하였습니다.

동시 프로그래밍(Concurrent Programming)에는 프로세스와 쓰레드, 이 두가지 기본 실행단위가 있습니다. 자바 프로그래밍 언어에서는 동시 프로그래밍은 주로 쓰레드와 관련이 있지만 프로세스 또한 중요합니다.

컴퓨터는 보통 여러 개의 활성화된 프로세스와 쓰레드를 가지고 있습니다. 이것은 심지어 동시에 하나의 쓰레드 밖에 실제로 처리할 수 없는 싱글 코어를 가진 시스템에서도 마찬가지입니다. 싱글 코어의 처리 시간은 운영체제의 시분활(time slicing) 기능을 통해 여러 프로세서와 쓰레드 간에 공유되어 집니다.

멀티 코어나 프로세스가 탑재된 컴퓨터들이 점점 더 일반화되고 있습니다. 이것은 시스템의 프로세스와 쓰레드의 동시 처리 능력을 현저하게 향상시킵니다. 하지만 동시성(concurrency)은 멀티 프로세서나 코어 없이 단순한 시스템 상에서도 가능한 일입니다.

프로세스 (Processes)

프로세스는 독립적인 실행 환경을 가집니다. 프로세스는 보통 완전하고 자체적인 기본 실행 자원 세트를 가지고 있습니다. 좀 더 자세히 얘기하면, 각 프로세스는 전용 메모리 공간을 할당받습니다.

프로세스는 종종 프로그램과 애플리케이션에 대해 동기적으로 보입니다. 그러나 사용자가 하나의 애플리케이션으로 보는 것이 사실 한 세트의 협력하는 프로세스들일 수 도 있습니다. 프로세스 간의 통신을 촉진하기 위해서, 대부분 운영체제들은 파이프나 소켓과 같은 IPC(Inter Process Communication)를 지원합니다. IPC는 단지 같은 시스템 상에서 프로세스 간에 통신을 위해서 사용될 뿐만 아니라 다른 시스템 간의 프로세스들이 통신하기 위해서도 사용됩니다.

대부분 자바 가상 마신의 구현은 단일 프로세스로서 돌아갑니다. 자바 애플리케이션은 ProcessBuilder 객체를 이용해서 추가적인 프로세스를 생성할 수 있습니다. 멀티 프로세스 애플리케이션은 본 수업의 범위에서 벗어납니다.

쓰레드 (Threads)

쓰레드는 때때로 경량 프로세스라고도 불립니다. 프로세스와 쓰레드 모두 실행 환경을 제공하지만 새로운 쓰레드를 생성하는 데는 새로운 프로세스 생성 대비 더 적은 자원이 필요합니다.

쓰레드는 프로세스 안에서 존재하며, 모든 프로세스는 적어도 하나의 쓰레드를 가집니다. 쓰레드는 메모리와 열린 파일(open files)을 포함한 프로세스의 자원을 공유합니다. 이것은 효율적인 통신에 도움이 되지만 잠재적인 문제의 소지를 낳기도 합니다.

멀티 쓰레드 실행은 자바 플랫폼의 필수적인 기능입니다. 모든 애플리케이션은 하나 이상의 쓰레드를 가지며 메모리 관리나 신호 처리 등을 하는 시스템 쓰레드들까지 포함시킨다면 그 보다 많은 쓰레드를 가지게 됩니다. 그러나 프로그래머의 관점에서 보았을 때는 메인 쓰레드라고 불리는 단지 하나의 쓰레드에서 시작합니다. 이 쓰레드는 추가적인 쓰레드들을 생성할 능력이 있으며 이는 다음 섹션에서 보여드리겠습니다.