프로세스와 스레드는 실행 중인 프로그램을 이해하는 기본 단위입니다. 프로세스는 자원과 실행 환경의 경계, 스레드는 그 안에서 실행되는 흐름으로 생각할 수 있습니다.

프로세스

프로그램 파일을 실행하면 운영체제가 프로세스를 생성합니다. 프로세스는 가상 주소 공간, 실행 코드, 열린 파일 등의 자원을 가집니다.

각 프로세스의 주소 공간은 기본적으로 분리됩니다. 다른 프로세스와 데이터를 교환하려면 파이프, 소켓, 공유 메모리 같은 프로세스 간 통신(IPC)을 사용합니다. 메모리가 분리된다는 말은 프로세스 사이에 데이터를 공유할 방법이 전혀 없다는 뜻은 아닙니다.

스레드

하나의 프로세스 안에는 하나 이상의 스레드가 있습니다. 스레드는 같은 프로세스의 주소 공간과 여러 자원을 공유하면서 각자의 실행 위치를 유지합니다.

공유하는 것 스레드마다 구분되는 것
코드, 전역 데이터, 힙 등 주소 공간 스택, 레지스터 상태, 실행 위치
프로세스의 파일·자원 등 스레드별 저장소와 실행 문맥

스택이 따로 있다는 설명은 스택 메모리가 다른 스레드로부터 보호된다는 뜻은 아닙니다. 같은 프로세스의 주소 공간을 공유하므로 포인터 등을 통한 접근이 가능할 수 있습니다.

공유의 장점과 주의점

스레드는 데이터를 쉽게 공유할 수 있지만, 여러 스레드가 같은 값을 동시에 읽고 쓰면 경쟁 상태가 생길 수 있습니다. 예를 들어 두 스레드가 동일한 카운터 값을 읽고 각각 1을 더해 저장하면 증가 한 번이 사라질 수 있습니다.

이를 막으려면 뮤텍스, 원자적 연산 등 적절한 동기화가 필요합니다. 공유 메모리를 쓰는 프로세스 간에도 같은 문제가 발생할 수 있습니다.

비교

기준 프로세스 스레드
주소 공간 기본적으로 분리 같은 프로세스 안에서 공유
데이터 교환 IPC 등 필요 공유 메모리에 직접 접근 가능
장애 영향 다른 프로세스로부터 격리하기 쉬움 프로세스 전체에 영향을 줄 수 있음
생성·전환 비용 일반적으로 더 큼 일반적으로 더 작음

실제 비용은 운영체제와 작업에 따라 달라집니다. 또한 브라우저 탭 하나를 스레드 하나로 보는 것은 부정확합니다. 현대 브라우저는 여러 프로세스와 스레드를 사용하며, 탭과 프로세스도 항상 일대일 관계가 아닙니다.

참고