프로세스와 스레드는 자칫 같은 의미로 생각하기 쉬운 개념입니다. 하지만 두 개념은 실행 범위와 목적에서 차이가 존재합니다.
프로세스란 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이며, 스레드란 프로세스 내에서 실행되는 여러 흐름의 단위인 것이죠.
이 부분은 현업 개발자 분의 조언을 받아 작성했습니다.
우선 스레드는 프로그램이 실행하는 작업의 단위라고 생각하시면 됩니다. 쉽게 말해서 프로그램이 사용하는 손? 팔? 이라고 생각하시면 편합니다.
예를 들어서 스프링으로 이메일을 보내고 루트 주소 (/) 로 이동한다고 가정해보겠습니다. 사용자가 "이메일 인증" 버튼을 누르면 이메일이 날아가는 로직입니다. 만약 이 모든 과정이 싱글스레드로 동작한다면 사용자가 "이메일 인증" 버튼을 누르는 순간 이메일을 보내는 로직이 실행이 될 것이고 스프링은 이메일을 보내고 있는 중이기 때문에 이메일이 도착하기 전까지 아무것도 할 수 없습니다. 이는 이메일을 보내고 루트 주소로 이동하는 일련의 과정이 하나의 스레드에서 실행되기 때문에 벌어지는 일입니다.
이 상황이 멀티 스레드인 경우를 생각해보겠습니다. 사용자가 "이메일 인증" 버튼을 누르는 순간 이메일을 보내는 로직을 실행하는 스레드가 할당되고 여분의 스레드가 있기 때문에 루트 주소로 이동하는 것을 이메일이 전송됐는지 여부와 관계없이 실행할 수 있습니다.
각각의 로직들을 스레드라는 팔을 이용해서 작업을 수행하는 것인데 만약 싱글스레드 (팔이 하나인 경우) 에는 작업을 한번에 하나밖에 못하겠죠? 하지만 멀티스레드 (팔이 여러개인 경우) 에는 한번에 여러가지 일을 처리할 것입니다.
프로그램은 우리가 만드는 프로젝트 그 자체입니다. 예를 들어서 우리가 스프링 프로젝트를 만들었다면 그 프로젝트 자체가 프로그램이 되는 것이죠. 프로세스는 프로그램 안에서 실행되는 다양한 수행작업들입니다.
예를 들어서 스프링 프로젝트 (프로그램) 안에서 이메일을 보내고 사용자를 인증하는 로직 (프로세스) 을 수행하는 것입니다.
프로세스는 앞서 설명드렸듯이 프로그램에서 실행되는 작업의 단위이고 스레드는 프로세스 안에서 실행되는 흐름의 단위입니다.
이 둘의 차이는 프로세스는 고유한 주소와 메모리 공간이 부여되어 있고 독립적입니다. 반면에 스레드는 부모 프로세스에서 자원을 공유하기 때문에 논리적으로 연결되어 있습니다. 즉, 스레드는 프로세스 안에 포함된 개념이며 경량화된 프로세스라고 볼 수 있습니다.