반응형
프로세스 vs 스레드
프로세스란?
운영체제로부터 자원을 할당받는 작업의 단위입니다.
어플리케이션 하나가 프로세스입니다.
참조 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
프로세스의 특징
- 프로세스는 독립된 메모리 영역을 할당받습니다.
- 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신을 사용해야 합니다. ( ex) 파이프, 파일, 소켓 이용한 통신(IPC))
스레드란?
할당 받은 자원을 이용하는 실행의 단위이고, 프로세스 내에 여러 개 생길 수 있습니다.
참조 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
스레드의 특징
- 프로세스에서 Stack만 따로 할당받고, Code, Data, Heap은 공유합니다.
- 서로 다른 스레드는 별도의 레지스터와 스택을 가지고 있지만, 힙 메모리는 서로 읽고 쓸 수 있습니다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 스레드도 그 변경 결과를 즉시 볼 수 있습니다.
Java에서의 스레드
- JVM이 운영체제의 역할을 수행합니다.
- 프로세스가 존재X, 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록 입니다.
- 스레드의 수, 프로그램 코드의 메모리 위치, 스레드의 상태, 스레드 우선순위 등도 JVM이 관리합니다.
※ 즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일 뿐이다.
멀티 프로세스 vs 멀티 스레드
멀티 프로세스(Multi Process)
하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 수행합니다.
장점
- 프로세스에서 문제가 발생했을 때, 해당 프로세스만 오류가 나고 오류가 확산되지 않습니다.
단점
- Context Switching 에서의 오버헤드
- 공유하는 메모리가 없기 때문에 ,Context Switching 이 발생하면 캐시에 있는 모든 데이터를 리셋하고 다시 캐시의 정보를 불러와야 합니다.
- 프로세스간의 어려운 통신 기법(IPC)
멀티 스레드(Multi Thread)
하나의 응용프로그램을 여러 개의 스레드로 구성하고, 각 스레드가 하나의 작업을 수행합니다.
장점
- 시스템 자원 소모 감소 (프로세스 생성 시 자원이 할당되는 시스템 콜 ↓)
- 시스템 처리량 증가
- 스레드 간 데이터 전달이 간단해지고, 자원 소모가 줄어듭니다.
- 스레드 간의 작업량이 작아 Context Switching이 빠릅니다.
- 간단한 통신으로 프로그램 응답 시간 단축 (프로세스의 Stack 영역을 제외한 모든 메모리를 공유하기에 통신의 부담이 적습니다.)
단점
- 주의 깊은 설계 필요
- 디버깅의 어려움
- 다른 프로세스에서 스레드 제어 불가.
- 멀티 스레드의 경우 자원 공유의 문제가 발생합니다.
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받습니다.
멀티 스레드를 선호하는 이유
- 자원의 효율성 증가
- 프로세스 생성 시 자원이 할당되는 시스템 콜 ↓
- 프로세스 간의 Context Switching시 CPU 레지스터 교체 뿐 아니라 RAM과 CPU 사이의 캐시 메모리도 초기화되기 때문에 오버헤드가 큽니다.
- 타 스레드와 자원을 공유하므로 시스템 자원 소모가 줄어듭니다.
- 처리 비용 감소 및 응답 시간 단축
- 프로세스 간의 통신(IPC) 보다 스레드 간의 통신의 비용이 적습니다.
조심해야 할 점
- 동기화 문제
- 전역 변수를 참조하게 되면 thread safe 하지 않을 수 있다.
Thread Safe 란?
여러 스레드가 동시에 사용되어도 안전하다는 것을 의미합니다.
Thread Safe를 지키기 위한 4가지 방법이 존재합니다.
- Mutual Exclusion(상호 배제)
- Atomic Operation(원자 연산)
- Thread-local Storage( 스레드 지역 저장소)
- Re-entrancy( 재진입성)
Mutual Exclusion (상호 배제)
- 공유 자원에 하나의 Thread 만 접근할 수 있도록 세마포어/뮤텍스로 락을 통제하는 방법입니다.
Atomic Operation (원자 연산)
- 공유 자원에 원자적으로 접근하는 방법
- 공유 자원 변경에 필요한 연산을 원자적으로 분리
- 실제로 데이터의 변경이 이루어지는 시점에 Lock을 걸기
- 데이터를 변경하는 시간 동안, 다른 스레드의 접근이 불가능하도록 하는 방법
Thread-local Storage (스레드 지역 저장소)
- 공유 자원의 사용을 최대한 줄이고, 각각의 스레드에서만 접근 가능한 저장소들의 사용을 통해 동시 접근을 막는 방법
Re-entrancy (재진입성)
- 스레드 호출과 상관 없이 프로그램에 문제가 없도록 작성하는 방법
참조
Noah님 - Process, Thread 차이가 뭐예요?
heejeong Kwon님 - 프로세스와 스레드의 차이
wooono 님 - 쓰레드 세이프란?
반응형
'CS 지식 > 운영체제' 카테고리의 다른 글
Deadlock(데드락) (0) | 2023.02.20 |
---|---|
동기 vs 비동기, 블로킹 vs 논블로킹 (0) | 2023.02.20 |
메모리의 구조 (0) | 2023.02.16 |
컨텍스트 스위칭(Context Switching) (0) | 2023.02.13 |
댓글