일단 멀티 프로세스와 멀티 쓰레드를 알기전에 프로세스와 쓰레드부터 알아보자
프로세스: 운영체제로부터 자원을 할당받은 작업의 단위
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
정의만으로는 어떤 느낌인지 와닿지 않는데 특징을 보며 좀 더 구체적으로 알아보자
🔍 하나의 프로세스는 code, date, stack, heap 4가지로 이루어져 있다.
Code : 코드 자체를 구성하는 메모리 영역(프로그램 명령)
Data : 전역 변수, 정적 변수, 배열 등 (초기화된 데이터)
stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
Heap : 동적 할당 시 사용 (new(), mallock() 등)
🔍 프로세스는 작업 중인 프로그램이다.
이 말의 뜻을 이해하려면 먼저 프로그램의 정의를 알아야한다.
❗ 프로그램: 파일이 저장 장치에 저장되어있는 메모리에는 올라가있지 않은 정적인 상태정적인 상태의 프로그램에 자원을 할당하여 메모리에 올라가게되면 동적인 상태의 프로그램, 즉 프로세스가 되는 것이다.
🔍 프로세스 내에서 실행되는 여러 흐름의 단위이다.
위의 사진은 멀티 스레드의 구조이다.
스레드는 프로세스 내에서 code, data, heap 영역을 공유하며 stack만 별도로 가지게 된다.
기본적으로 하나의 프로세스는 최소 하나의 스레드(메인 스레드)를 갖게 되고
이를 여러 개 갖게 되면 멀티스레드라고 한다.
❗ stack만 따로 갖는 이유??
이는 stack의 특성인 LIFO(후입선출)와 연관이 있다.
stack 영역은 함수 호출시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하기 위해 사용하는데 이를 공유하게 되면 원하는 실행의 흐름을 갖기가 힘들어진다.
때문에 stack만을 독립적으로 갖게 된다.
멀티 프로세스란 다수의 프로세서(CPU)가 다수의 프로세스를 동시에 처리하는 것이다.
장점
- 여러개의 프로세스 중 하나에 문제가 발생해도 다른 프로세스에 영향을 미치지 않는다.
단점
- Context Switching에서의 오버헤드가 발생한다.
- ❗ Context Switching: CPU에서 여러 프로세스를 돌아가며 작업을 처리하는 과정
더 자세히 말하자면 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태르 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관하던 프로세스의 상태를 복구하는 작업이다.- 프로세스는 각각의 독립된 메모리 영역을 할당 받기 때문에 프로세스 사이의 정보에 접근이 힘들다.
- IPC(Inter-Process Communication), LPC(Local inter-Process Communication)를 사용하는 등 방법이 아예 없지는 않다.
하나의 프로세스에 여러개의 스레드를 구성하고 사용하는 방식
장점
- 스레드는 프로세스 내의 stack 영역을 제회한 모든 메모리를 공유하기 때문에 통신의 부담이 적어 응답 시간이 빠르다.
- Context Switching시 공유하는 메모리만큼 메모리 자원을 아낄 수 있다.
단점
- 하나의 스레드에서 문제가 발생하면 전체 프로세스가 영향을 받는다.
- 자원을 공유하기 때문에 동기화의 문제가 발생할 수 있다.
- 각각의 스레드가 어떤 순서로 실행되는지 알 수 없어 발생
- 디버깅이 까다로워 진다.
- 동기화의 이유와 동일
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
- 단일 프로세스 시스템이 싱글 코어를 말하는게 맞다면 Context Switching과 같은 부분에서의 이점이 사실상 없어서 그렇다고 생각한다.
스레드는 프로세스 안에 포함되어 있기 때문에 프로세스와 스레드를 동등한 위치에 놓고 비교하는건 사실 맞지않다.
프로세스는 운영체제가 code, date, stack, heap 메모리 영역을 할당해 주고 최소 작업 단위,
스레드는 프로세스 내에서 stack 메모리 영역을 제외한 다른 메모리 영역을 공유하는 실행의 흐름 단위이다.
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://devuna.tistory.com/21
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://goodmilktea.tistory.com/24