📌 프로세스
1.1 프로세스란?
- 프로세스란 실행중에 있는 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 스케줄링의 대상이 되는 작업(task)와 같은 의미로 쓰입니다.
- 프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread) 단위로 스케줄링을 합니다.
- 하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불립니다.
프로세스의 메모리 영역
Code 영역
- 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다. CPU는 코드영역에 저장된 명령어들을 하나씩 처리합니다.
- 코드 자체를 구성하는 메모리 영역(프로그램 명령)
Data 영역
- 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램이 실행되면서 할당되고 종료되면서 소멸합니다.
- 전역변수, 정적변수, 배열 등
Stack 영역
- 함수 안에서 선언된 지역변수, 매개변수, 리터값등이 저장된다. 함수 호출시 기록되고 종료되면 제거됩니다.
- 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
Heap 영역
- 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간입니다.
- 동적 할당 시 사용 (new(), malloc() 등)
Stack 영역만 따로 할당 받는 이유
쓰레드는 독립적인 동작을 수행하기 위해 존재합니다. 즉 독립적으로 함수를 호출 할 수 있어야 합니다. 그렇기 때문에 함수의 매개변수, 지역변수등을 저장하는 스택 메모리 영역은 독립적으로 할당 받아야 합니다.
1.2 프로세스 상태
- 프로세스는 상태(state)가 변경되며 수행됩니다.
- Running
- CPU 를 잡고 instruction 을 수행중인 상태
- Ready
- Blocked (waiting, sleep)
- CPU를 주어도 당장 instruction 을 수행할 수 없는 상태
- Process 자신이 요청한 event(예: I/O) 가 즉시 만족되지 않아, 이를 기다리는 상태
- (예) 디스크에서 file 을 읽어와야 하는 경우
- New : 디스크에서 메모리로 프로그램이 올라가 실행준비를 하는 상태
- Terminated : 수행 (execution)이 끝난 상태
📌 스레드
2.1 스레드란?
- 프로세스 내에서 실행되는 흐름의 단위
- 일반적으로 한 프로그램은 하나의 스레드를 가지고, 둘 이상의 스레드를 동작한다면 멀티 스레드라고 합니다.
- 스레드는 프로세스 내에서 stack만 따로 할당 받고, code, data, heap 영역은 서로 공유합니다.
- 개별 스레드는 별도의 Register와 Stack을 갖고, Heap 메모리는 서로 읽고 쓸 수 있습니다.
- 프로세스 하나만을 사용해서 프로그램을 실행하기때문에 메모리가 낭비될 수 있다는 단점이 있지만, 반면에 스레드는 서로 공유하며 동작하기 때문에 메모리 낭비를 줄일 수 있습니다.
- 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 단위입니다.
📌 멀티프로세스와 멀티스레드
3.1 멀티프로세스란?
- 여러 개의 프로세스가 서로 협력적으로 일을 처리하고 작업을 병렬처리 하는 것을 의미합니다. 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 때 사용됩니다.
장점
- 독립된 구조이기 때문에 높은 안정성
- 여러 프로세스가 같이 작업하고 있기 때문에 하나의 프로세스가 문제가 생겨도 큰 영향X (대신 느려질 수는 있다. 다른 프로세스의 일을 자기가 더 해야하기 때문)
- 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서(CPU)가 이를 공유하면 비용적으로 저렴
단점
- 멀티 스레드보다 많은 메모리 공간과 CPU시간을 차지
- 독립된 메모리 영역이기 때문에 작업량이 많을 수록 (Context Switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능 저하 > context switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드 발생
3.2 멀티스레드란?
멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용해 동시에 처리하는 것을 의미한다.
장점
- 시스템 자원 소모가 감소하여 자원의 효율성이 증대
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리
- 시스템 처리율 향상 (처리 비용 감소)
- 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모 해결
- 스레드 사이 작업량이 적어 Context Switching이 빠름 (캐시 메모리를 비울 필요가 없음)
- 간단한 통신 방법으로 프로그램 응답시간 단축
- 스레드는 프로세스 내 스택 영역을 제외한 메모리 영역을 공유하기에 통신 비용이 감소
- 힙 영역을 공유하므로 데이터를 주고받을 수 있음
단점
- 자원을 공유하기에 동기화 문제가 발생할 수 있음 (병목현상, 데드락 등)
- 하나의 스레드에 문제가 발생하면 전체 프로세스에 악영향
- 주의깊은 설계가 필요하고 디버깅이 어려움 (불필요 부분까지 동기화하면, 대기시간으로 인해 성능 저하 발생)
- 단일 프로세스 시스템의 경우 낮은 성능
✏️ 프로세스와 스레드의 차이점
운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당한다. 각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
이와 다르게, 스레드는 메모리를 서로 공유할 수 있다. 자세히 말하자면 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 다로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
# 요약
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
스레드 : 다른 스레드와의 공간과 자원을 공유하면서 사용
참고
피드백 및 개선점은 댓글을 통해 알려주세요😊