Process VS Thread
Last updated
Last updated
프로세스는 실행 중인 프로그램의 인스턴스로, 운영체제로부터 독립적인 메모리 영역(코드, 데이터, 힙, 스택)을 할당받습니다.
메모리 구조:
코드 영역: 실행할 프로그램의 명령어가 저장됨
데이터 영역: 전역 변수와 정적 변수 등이 저장됨
힙 영역: 동적 메모리 할당 시 사용됨
스택 영역: 함수 호출 시 지역 변수와 호출 정보를 저장함
특징:
독립된 주소 공간을 가지므로 한 프로세스에서 발생한 오류가 다른 프로세스에 영향을 미치지 않음
생성, 소멸, 컨텍스트 스위칭에 상대적으로 큰 오버헤드가 있음
서로 간의 데이터 교환은 IPC(Inter-Process Communication) 등의 별도 기법을 통해 이루어져야 함
쓰레드는 프로세스 내에서 실행되는 가장 작은 실행 단위로, 같은 프로세스의 자원(코드, 데이터, 힙)을 공유하고, 자신만의 스택과 레지스터를 가집니다.
메모리 구조:
공유 영역: 프로세스의 코드, 데이터, 힙 영역은 모든 쓰레드가 공유함
개별 영역: 각 쓰레드는 자신만의 스택을 할당받아 독립적인 함수 호출과 지역 변수 관리를 수행함
특징:
생성 및 종료가 가볍고, 컨텍스트 스위칭 비용이 낮음
메모리를 공유하기 때문에 쓰레드 간 통신이 간편하지만, 동기화 문제(경쟁 상태, 데드락 등)가 발생할 위험이 있음
한 쓰레드에서 오류가 발생하면 전체 프로세스에 영향을 줄 수 있음
메모리 관리:
프로세스: 각 프로세스는 독립된 주소 공간(코드, 데이터, 힙, 스택)을 가지므로 서로 간섭이 없으나, 데이터 교환 시 IPC 등의 별도 기법 필요
쓰레드: 같은 프로세스 내에서 자원(코드, 데이터, 힙)을 공유하고, 각자 독립적인 스택을 사용하므로 통신은 쉽지만 동기화에 주의해야 함
생성 및 종료 비용:
프로세스: 새 프로세스를 생성할 때 메모리 할당 및 초기화 등으로 오버헤드가 큼
쓰레드: 이미 할당된 프로세스 내에서 생성되므로 비교적 빠르고 오버헤드가 작음
안정성과 격리:
프로세스: 독립된 주소 공간 덕분에 한 프로세스에서 발생한 문제가 다른 프로세스에 영향을 주지 않음
쓰레드: 하나의 쓰레드에서 문제가 발생하면 같은 프로세스 내 다른 쓰레드도 영향을 받아 전체 프로세스가 종료될 수 있음
컨텍스트 스위칭:
프로세스: 컨텍스트 스위칭 시 전체 메모리 영역과 CPU 레지스터 등을 저장하고 복원해야 하므로 오버헤드가 큼
쓰레드: 스택과 레지스터 정도만 변경하면 되므로 스위칭이 빠름
통신 방식:
프로세스: IPC(파이프, 소켓, 공유 메모리 등)를 사용해야 하므로 구현이 복잡할 수 있음
쓰레드: 동일 메모리 공간을 공유하므로 간단하게 변수나 객체를 통해 데이터를 주고받을 수 있음