우리가 컴퓨터를 키면 마우스로 커서를 움직이고,
크롬을 열어서 구글 검색도 하고,
카카오톡으로 업무를 보기도 하죠?
이 모든 개별적인 프로그램들이 바로 프로세스라고 할 수 있어요.
사실 프로그램과 프로세스는 조금 다른 개념이에요.
프로그램은 개발자가 만든 코드들을 잘 포장해서 우리가 사용할 수 있도록 준비해 놓은 실행 파일이라고 보시면 돼요.
크롬이나 카카오톡을 다운받은 그 파일이 바로 프로그램인 거죠.
그런데 이 프로그램을 실행시키면, 바로 프로세스라는 개념이 등장해요.
프로그램 아이콘을 더블 클릭하면 운영체제가 이 프로그램을 실행할 수 있도록 준비를 해주는데,
디스크에 저장된 프로그램을 메모리에 올리고 프로세스를 생성하는 거예요.
이렇게 컴퓨터에는 다양한 프로세스들이 메모리에 올라오게 되는데,
운영체제가 각 프로세스에게 독립적인 메모리 공간을 할당해줘요.
그래서 프로세스끼리는 자원을 공유할 수가 없어요.
크롬과 카카오톡이 자원을 공유할 수 없다는 말이죠.
물론 IPC라는 기술로 프로세스 간 통신을 통해 자원을 공유할 수는 있지만,
리소스 비용이 커서 조심해서 사용해야 해요.
그럼 쓰레드는 뭘까요?
쓰레드는 프로세스에서 생기는 작업 단위예요.
프로세스를 실행하면 메인 쓰레드가 생성되어 코드를 읽고 작업을 수행하는데,
코드 구현에 따라 더 많은 쓰레드들이 생길 수 있어요.

쓰레드는 프로세스와 달리 자원을 공유할 수 있다는 특징이 있는데,
이게 때로는 문제를 일으킬 수도 있어요.
예를 들어, 두 명이 네이버에서 같은 이메일로 동시에 회원가입을 했다고 생각해보세요.
각각의 요청은 쓰레드로 생성될 텐데, 만약 개발자가 중복 이메일 체크 결과를 공유 변수로 사용했다면 두 명 모두 사용 가능하다는 안내를 받게 될 수도 있겠죠?
그래서 쓰레드를 사용할 때는 이런 문제들을 조심하고 동기화 처리 같은 조치를 잘 해줘야 해요.
그런데 왜 굳이 프로세스와 쓰레드로 나눴을까요?
프로세스로 모든 걸 처리하면 안 될까요?
아까 말한 네이버 회원가입 예시를 다시 보면, 만약 전 세계에서 동시에 1000만 명이 회원가입을 요청했다고 해보죠.
프로세스 하나로 모두 처리하려면 엄청 오래 걸릴 거예요.
1초에 한 건씩 처리한다면 1000만 초, 즉 115일 이상이 걸리겠죠?
그래서 똑같은 프로세스를 여러 개 만들어서 나눠서 처리하는 방법을 쓸 수 있겠지만,
그러면 개별 프로세스마다 모든 자원을 갖고 있어야 해서 리소스 낭비가 생길 수밖에 없어요.
여기서 쓰레드의 장점이 나오는 거죠.
쓰레드는 프로세스 안에서 메모리와 자원을 공유하니까 IPC 같은 복잡한 기술이 필요 없고,
컨텍스트 스위칭도 훨씬 빨라요.
게다가 복잡한 작업을 쓰레드로 나누면 코드도 깔끔해지고 읽기 쉬워지는 장점도 있죠.
물론 동기화나 교착상태 같은 문제는 조심해야 하지만요.