[OS] 프로세스(Process)와 스레드(Thread)의 차이/멀티 프로세스와 멀티 스레드의 개념 , 특징, 장단점
1. 프로세스(Process)와 스레드(Thread)
먼저, 프로세스(process)
란 무엇일까?
프로세스는 단순하게 말하면 일을 처리하는 일련의 과정
을 말합니다.
예를 들어, 아침에 일어나 학교에 가는 과정도 하나의 프로세스라고 할 수 있습니다.
- 아침에 일어나서 씻고 준비를 한다.
- 역으로 걸어간다
- 지하철을 탄다
- 역에서 내려 학교로 간다.
💡 컴퓨터에게는 프로세스란
-
운영체제로부터 시스템 자원을 할당받는 작업의 단위
-
컴퓨터에서 연속적으로 실행되고 있는 프로그램
-
메모리에 올라와 실행되고 있는 프로그램의 인스턴스를 말합니다.
💡 하나의 프로세스는 크게 코드영역(code), 데이터 영역(date), 스택 영역(stack), 힙 영역(heap) 4가지로 이루어져 있습니다.
Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
Data : 전역 변수, 정적 변수, 배열 등 (초기화된 데이터)
stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
Heap : 동적 할당 시 사용 (new(), mallock() 등)
실제로 하나의 프로그램이 실행될 때, 동시에 여러 가지 프로세스가 실행되는 경우들이 있습니다.
크레이지 아케이드라는 게임을 예를 들어보면, 게임을 하는 동안 물풍선을 맞고 물속에 갇히는 프로세스,
남은 게임 시간을 나타내는 프로세스, 다른 캐릭터들이 움직이는 프로세스 등 여러가지 프로세스들이
동시에 진행됩니다.
물풍선을 맞는 하나의 동작도 자세히 살펴보면,
1. 물풍선을 맞아서 물안에 갇히는 동작을 구현하는 프로세스
2. 물소리가 나는 프로세스
3. 갇힌 시간으로부터 일정 시간을 계산하는 프로세스 등..
동시에 많은 프로세스들이 진행됩니다.
그리고 이렇게 한 번의 사건이 발생해서 여러 가지 프로세스들이 실행될 때
우리 눈에는 동시에 진행되는 것처럼 보이지만,
실제로는 cpu는 프로세스 1을 어느 정도 하고 저장하고 프로세스 2를 진행하고 다시 돌아가며
여러 프로세스를 왔다 갔다 하는 콘텍스트 스위칭(Context Switching)
이 일어납니다.
👉🏻콘텍스트 스위칭에 대해서도 추후 포스팅하도록 하겠습니다.
반복이 많아지게 되면 CPU의 부담이 늘어나고, 중복된 자원들이 비효율적으로 관리됩니다.
그럴 때 사용하는 것이 바로 멀티스레드입니다.
먼저 스레드(Thread)란,
한 프로세스 내에서 동작되는 여러 실행의 흐름으로
프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개를 동시에 실행시킬 수 있는 것을 말합니다.
스레드는
- 한 프로세서 내의 주소 공간이나 자원들을 대부분 공유
- 기본적으로 하나의 프로세스가 생성되면 하나의 스레드가 같이 생성되며, 이를 메인 스레드라고 부르며, 스레드를 추가로 생성하지 않는 한 모든 프로그램 코드는 메인 스레드에서 실행됩니다.
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 이를 멀티 스레드라고 합니다.
💡 멀티스레드의 구조를 보면 다음과 같이 Code, Data, Heap영역을 공유하고 있으며, Stack만 스레드 별로 가지게 됩니다.
여기서 질문!
💡 다른 자원들은 공유하지만 굳이 스택만 분리해서 사용하는 이유는?
LIFO(Last In First Out) / 후입 선출이라는 스택의 특성과도 연관이 있습니다.
왜냐하면? 코드와 데이터 힙 영역을 공유하는 것에는 큰 문제가 없지만,
스택 영역은 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되므로
더 복잡해지기 때문에 원활한 실행 흐름을 위해 스택은 따로 독립적으로 존재하게 됩니다.
👉🏻스택에 대해서 자세히 알고 싶다면? 클릭
2. 멀티 프로세스와 멀티스레드
📌 멀티프로세스
하나의 컴퓨터에 여러 CPU 장착 → 하나 이상의 프로세스들을 동시에 처리(병렬)
장점 : 안전성이 높음 (독립된 구조기 때문에)
단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하
📌 멀티스레드
장점
- 프로그램의 응답 시간이 단축됩니다.
- 시스템의 처리율이 향상됩니다.
- 시스템의 자원 소모 감소합니다.
- 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단합니다.
단점
- 여러 개의 스레드를 이용하는 경우, 미묘한 시간차나 잘못된 변수를 공유함으로써 오류 발생 가능
👉🏼 따라서 스레드 간에 통신할 경우에는 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 합니다.
- 프로그램 디버깅이 어렵습니다.
- 단일 프로세스 시스템에서는 효과를 기대하기 어렵습니다.
공감 버튼과 댓글은 소소한 힘이 됩니다! 💪🏻
'👩💻TIL > 기술면접' 카테고리의 다른 글
[오류검출코드]패리티비트(Parity Bit)와 해밍 코드(Hamming Code) (0) | 2020.02.16 |
---|---|
[정렬] 선택정렬(Selection Sort)의 개념/Java코드/시간복잡도/공간복잡도 (0) | 2020.02.13 |
클린코드와 코드 리팩토링 (0) | 2020.02.13 |
[web] 쿠키(cookie)와 세션(session)의 개념/차이/용도/작동방식 (16) | 2020.02.11 |
[자료구조] 스택 (STACK), 큐(QUEUE) 개념/비교 /활용 예시 (13) | 2020.02.01 |
댓글