프로그램은 특정 작업을 컴퓨터에서 실행하기 위한 지시의 모음(collection of instruction)입니다. 특히 컴퓨터 프로그램은 프로그래밍 언어로 작성되고, 이 프로그램은 보통 비휘발성 메모리인 하드디스크에 저장됩니다. 이 프로그램이 실행되어 생긴 인스턴스가 프로세스입니다. 즉, 실행 중인 프로그램이 프로세스입니다.
운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라고 부릅니다. 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코드를 실행하는데, 이것을 프로세스라고 부릅니다. 예를 들어 Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성된 것입니다. 이와 같이 하나의 애플리케이션은 다중 프로세스를 만들기도 합니다.
아래 사진에서의 항목 하나하나가 전부 프로세스입니다.
스레드는 사전적 의미로 한 가닥의 실이라는 뜻인데, 한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어놓았다고 해서 유래된 이름 입니다. 하나의 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미입니다.
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미합니다. 운영체제는 멀티 태스킹을 할 수 있도록 CPU및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행을 시킵니다. 예를 들어, 워드로 문서작업을 하면서 동시에 Chrome 브라우저에서 음악을 들을 수 있습니다. 물론 멀티 태스킹은 꼭 멀티 프로세스를 의미하는 것은 아닙니다. 한 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 애플리케이션들도 있습니다. 어떻게 하나의 프로세스가 두 가지 이상의 작업을 처리 할 수 있을까요? 그 비밀은 멀티 스레드에 있습니다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹 이라면 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있습니다.
멀티 스레드는 다양한 곳에서 사용됩니다. 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하는 곳에서 사용되기도하고, UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용되기도 합니다. 또한 다수 클라이언트의 요청을 처리하는 서버를 개발할 때도 사용됩니다.
자바를 예시로 들자면, 애플리케이션은 메인스레드(main thread)가 main() 메소드를 실행하면서 시작됩니다. 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return 문을 만나면 실행을 종료합니다.
메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있습니다 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행합니다. 다음 그림에서 우측의 멀티 스레드 애플리케이션을 보면 메인 스레드가 작업 스레드1을 생성하고 실행한 다음, 곧이어 작업 스레드2를 생성하고 실행합니다.
싱글 스레드 애플리케이션에서는 메인 스레드가 종료하면 프로세스도 종료 됩니다. 하지만 멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있다면 프로세스는 종료 되지 않습니다. 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않습니다.