프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스라고 가정했을 때, '실행의 흐름 단위가 하나'라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스라고 할 수 있다.
스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다(멀티스레드 프로세스).
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기 때문에 스레드마다 각기 다른 코드를 실행할 수 있다.
중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스의 자원을 공유하며 실행된다.
"hello, os"를 화면에 출력하는 프로그램이 있다고 가정해 보자. 이 프로그램을 세번 fork하여 실행하는 것과 이 프로그램 내에서 "hello, os"를 출력하는 스레드 세 개 만들어 실행해도 결과는 같지만 큰 차이가 있다.
프로세스끼리는 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.
프로세스를 fork하여 같은 작업을 하는 동일한 프로세스를 실행하면 코드 영역, 데이터 영역, 힙 영역 등을 비롯한 모든 자원이 복제되어 메모리에 적재된다. 같은 프로그램을 실행하기 위해 메모리에 동일한 내용들이 중복해서 존재하므로 자원 낭비를 초래한다.
반면, 스레드들은 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질뿐 프로세스가 가진 자원을 공유한다. 여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다. 또한 서로 다른 프로세스들은 독립적으로 실행하는 반면, 스레드는 서로 협력과 통신에 유리하다.
프로세스의 자원을 공유한다는 특성은 때론 단점이 될 수도 있다. 멀티프로세스 환경에서는 하나의 문제가 생겨도 다른 프로세스에는 지장이 적거나 없지만, 프로세스의 자원을 공유하는 멀티 스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.
프로세스 끼리는 '기본적으로' 자원을 공유하지 않지만, 프로세스끼리도 자워늘 공유하고 데이터를 주고받을 수 있다. 프로세스 간의 자원을 공유하고 데이터를 주고받는 것을 프로세스 간 통신(IPC: Inter-Process Comunication)이라고 한다.
프로세스들은 서로 공유하는 메모리 영역을 두어 데이터를 주고받을 수 있다. 프로세스들이 공유할 수 있는 메모리 영역을 공유 메모리(shared memory)라고 한다.
외에도 소켓, 파이프 등을 통해 통신할 수 있다.