프로세스 : 운영체제 위에서 연속적으로 실행되고 있는 프로그램을 말합니다. 그래서 프로세스는 운영체제 위에서 독립적으로 메모리에서 실행되고 있는 프로그램을 말합니다.
그리고 각각의 프로세스는 저마다 리소스 자원들이 정해져 있는데, 즉 프로세스 마다 할당된 메모리나 데이터들이 지정되어져 있습니다.
그리고 프로세스 안에는 프로그램을 위해서 작성된 코드, 즉 프로그램을 실행하기 위한 "Code"가 들어있는데, 그 코드와 그리고 그 프로세스 안에서 함수들이 어떤 순서로 실행되어야 하는지 이 함수가 끝나면 어디로 다시 돌아가야 되는지에 대한 정보를 저장하고 있는 "Stack" 이 들어있고, 그리고 "Heap"은 우리가 오브젝트를 생성하거나 데이터를 만들 때 그 데이터들이 저장되는 공간입니다. "Heap"에는 동적으로 할당된 변수들이 저장되는 반면에, "Data"에는 전역 변수나 static 변수들이 할당되어집니다.
그래서 각각의 프로세스는 자기들에게 필요한 "Code", 그리고 동작하고 있는 순서를 기억하는 "Stack", 데이터들이 들어있는 "Heap"과 "Data" 이런 것들이 각각 들어 있습니다.
쓰레드 : 한 프로세스 안에서 여러 개가 동작할 수 있는데, 쓰레드는 각각 저마다 해야 되는 업무를 배정 받습니다. 그래서 일꾼이라고도 불리는데, 저마다 필요한 일들을 수행하게 되고 이 쓰레드는 자기들만의 수행해야 되는 함수의 호출을 기억해야 되기 때문에 쓰레드마다 "Stack"이 할당되어져 있습니다. 하지만 이 프로세스 안에서 동작하는 일꾼들은 결국은 한 프로그램을 위해서 일해야 되므로 프로세스에 지정된 "Code"와 "Data", "Heap"들을 공통적으로 접근해서 공통적으로 업데이트가 가능합니다.
[예시]
내 프로그램에서 음악을 들으면서 사진을 편집할 수 있는 어플리케이션이 있다면 각각 쓰레드 음악을 재생하는 쓰레드 하나와 사진을 편집할 수 있는 쓰레드 그리고 다른 쓰레드에서는 이 음악의 데이터를 서버에서부터 받아와서 처리하는 이런 일들을 각각 저마다 할 수 있겠죠? 그리고 이런 쓰레드는 동시다발적으로 발생할 수 있기 때문에 이 프로세스가 조금 더 효율적으로 일을 할 수 있도록 도움을 줍니다. 만약 프로세스나 하나의 일 밖에 하지 못한다면 음악을 듣는 동안 사진 편집을 할 수가 없겠죠? 이렇게 쓰레드들이 안에 들어 있기 때문에 다양한 일들을 동시에 할 수 있습니다.
여기서 포인트는 쓰레드는 자신들이 일을 수행할 때 어디에서부터 어디까지 일을 했고 그 다음엔 어디로 가야 되는지 이런 일에 흐름을 기억할 수 있는 고유의 "Stack"이 지정되어져 있지만, "Data" 나 "Code" 나 "Heap" 같은 공통적인 데이터 리소스는 프로세스에 있기 때문에 쓰레드들은 이 프로세스에 공통적으로 할당된 리소스에 동시 다발적으로 접속해서 동시다발적으로 업데이트 해야 돼서 이렇게 서로 공유하면서 사용합니다.
그래서 멀티쓰레딩이 조금 어려운 이유는, 그리고 멀티쓰레딩을 잘 못하면 공통적으로 업데이트하면서 이 순서가 맞지 않거나 하면 발생할 수 있는 문제가 조금 있습니다. 그래서 멀티쓰레딩 프로그래밍이 조금 까다로운 이유입니다.
여기에서 프로세스는 프로그래밍을 동작하는 최고의 단위 이고, 쓰레드는 프로그램안에서 동시에 여러 개가 수행될 수 있는 작은 일꾼 단위라는 것입니다.