언어/CS
[CS] 프로세스 vs 스레드
Geunny
2025. 7. 9. 00:12
반응형
1. 개념차이
프로세스
- OS 에서 실행중인 프로그램. OS 로 부터 자원을 할당받아 실행한다.
- 하나의 프로그램은 여러개의 프로세스를 만들 수 있다. (크롬 다중실행등)
- 프로세스는 실행단위 이며, 서로 독립적인 여러 실행 인스턴스가 만들어 질 수 있다.
스레드
- 프로세스 내부의 실행 흐름 단위
- 한 프로세스 내에서 여러 쓰레드를 동시에 실행한다.
- 해당 스레드는 프로세스의 메모리 자원을 공유한다.
2. 메모리 구조
운영체제가 프로세스에 메모리를 할당하는 방식. 총 4개의 메모리 영역으로 나뉜다.
- 코드영역 : 실행할 프로그램의 기계어 코드 (함수/if제어문/루프문)
- 데이터영역 : 전역변수, static 변수
- 힙영역 : 런타임중 new, malloc 으로 동적으로 할당되는 메모리
- 스택영역 : 함수호출정보, 지역변수
프로세스와 스레드의 메모리 구조 차이
프로세스
- 각 프로세스마다 모든 메모리 영역을 따로 갖는다.
- 프로세스간 일반적인 메모리 공유는 없다.
- 프로세스는 1개의 스택을 갖는다.
스레드
- 한 프로세스 내에서 여러 스레드가 코드, 데이터, 힙영역을 서로 공유한다.
- 스택영역은 스레드 별 따로 갖는다.
- 스레드는 자원공유로 효율성은 높지만 공유로 인한 동기화 로직이 필요하다. (경쟁조건이 발생할수 있다.)
3. 자원소유
프로세스
- 파일 디스크럽트(fd), 메모리, PID 등 모든 자원을 운영체제로부터 직접 할당받는다.
스레드
- 프로세스의 자원을 공유하여 사용한다.
- 별도의 파일 디스크럽트는 갖지 않는다. (프로세스의 fd 를 사용한다.)
파일 디스크럽터(fd)
- OS 가 프로세스에 부여하는 자원 핸들(번호)
- 프로세스의 입출력 자원 (파일, 소켓, 파이프, 표준입출력) 사용시 운영체제는 프로세스에세 fd 인덱스 번호를 제공
- 프로세스는 실제 요청을 하는 것이 아닌 fd 에 입출력을 요청한다.
- 스레드는 프로세스 내에서 동작하기에 해당 프로세스의 fd를 사용한다.
- 동일 프로그램이더라도 서로다른 프로세스는 서로다른 fd를 사용한다.
4. 생성과 종료비용 (Creation & Termination Overhead)
프로세스
- 생성시 OS에서 새로운 주소공간, 자원테이블 등 새롭게 설정하기 때문에 비용이 크다.
스레드
- 프로세스내에서 주소공간이 공유되기에 빠르다.
- 같은 작업을 분산한다면 스레드가 훨씬 효율적이다.
프로세스 생성(실행)하는 작업은 OS의 시스템 콜을 호출한다.
프로세스의 경우는 코드/데이터/힙/스택 영역에 대한 모든 시스템콜을 호출하기에 무거우나 스레드는 스택영역에 해당하는 시스템콜만 호출하기에 상대적으로 빠르다.
5. 문맥 교환 비용 (Context Switching)
프로세스
- 컨텍스트 스위칭시 CPV레지스터 , 메모리맵, 페이지테이블 등 전체를 교체한다.
스레드
- 스택포인터와 최소한의 레지스터만 변경한다. 전환비용이 적다.
- 스레드 기반 서버가 고성능인 이유중 하나이다.
컨텍스트 스위칭
- CPU 가 한 작업(프로세스 또는 스레드)를 중단하고 다른 작업으로 전환하는 과정
- 작업중단 → Context저장 → 다음작업상태복원 → 실행 반복
컨텍스트 스위칭을 하는 이유
- CPU는 물리적으로 하나의 코어에서 하나의 작업밖에 할수 없음.
- 컨텍스트 스위칭 과정을 통해 CPU 사용시간을 쪼개어 여러 작업이 동시에 실행되는 것처럼 동작시킨다. (멀티태스킹)
프로세스 기반 서버
- Apache (Pre-Fork)
- Redis
- PostgreSQL
스레드 기반 서버
- Apache (worker, Event MPM)
- Nginx
- Tomcat, Spring
- Node.js
6. 통신방식
프로세스
- 서로다른 주소 공간을 사용하기 떄문에 IPC를 사용한다.
- IPC(Inter-Process Communication): pipe, socket, 공유메모리
스레드
- 동일한 메모리를 사용하기에 직접 변수로 접근 가능하다. 단 병렬처리시 동기화(Lock)을 수행하여 정합성을 맞춘다.
- 스레드가 통신속도가 빠르지만 Race Condition 방지는 필요하다.
Race Condition
- 둘 이상의 스레드나 프로세스가 동시에 공유자원에 접근할때 실행 순서에 따라 결과가 달라질수 있는 상황.
- 특히 쓰기작업을 수행할때 발생할 수 있다.
8. 병렬성
프로세스
- CPU 코어가 여러개일때 서로다른 프로세스를 병렬로 실행가능하다.
스레드
- 병렬성 + 비동기 처리에 적합하다.
- 하나의 작업을 나누어 병렬로 처리할 때 유리하다.