💡 프로세스와 스레드의 차이?
✅ 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
✅ 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
▪️ 프로세스(Process)는 쉽게 말해 '실행 중인 프로그램'이다. 더 정확히 말하면, 디스크에 있는 프로그램이 메모리에 로드되면 프로세스가 된다. 하나의 프로그램이 여러 프로세스가 될 수 있다.
▪️ 각 프로세스는 별도의 주소 공간에서 실행되고 프로세스끼리는 자원을 공유하지 않는다.
▪️ 프로세스 내부에는 최소 하나의 스레드(thread) 를 가지고 있는데, 실제로는 스레드(thread) 단위로 스케줄링을 한다.
▪️ 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC)을 사용해야 한다.
📌 IPC
: Inter-Process Communication
프로세스들 사이 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로로 파이프, 파일, 소켓 등을 이용한 통신 방법이 있다.
▪️ 프로세스는 스택(Stack), 힙(Heap), 데이터(Data), 코드(Code)로 나뉜다.
Stack 영역 : 함수의 매개변수, 복귀 주소와 지역 변수와 같은 임시 자료를 위한 영역
Data 영역 : 전역 변수, static 변수 할당
Heap 영역 : 프로세스 실행 중에 동적으로 할당되는 메모리 영역
- C언어 : malloc & free
- C++ : new & delete
- JAVA : new & (java에서 메모리 해제는 가비지컬렉터가 해줌)
Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어 올라감
(쉽게 말하면 소스코드가 올라간다고 생각하면 됨)
▪️ PCB(Process Control Block)는 운영체제가 각 프로세스를 관리하기 위해 프로세스 별로 보유하고 있는 정보 묶음이다. 프로세스는 CPU를 할당받아 작업을 처리하다가도 프로세스 전환(문맥교환) 이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 하는데 이때 작업의 진행상황을 모두 PCB에 저장한다. 그리고 다시 CPU를 할당받게 되면 PCB에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.
▪️ OS는 빠르게 PCB에 접근하기 위해 프로세스 테이블을 사용해 각 프로세스의 PCB를 관리한다.
▪️ PCB는 커널의 주소 공간에 있으며 다음의 구성 요소를 갖는다.
▪️ 스레드(Thread)는 프로세스 내에서 실행되는 여러 흐름의 단위로, 프로세스의 특정한 수행 경로이다.
▪️ 프로세스 하나만을 사용해서 프로그램을 실행하기에는 메모리의 낭비가 발생한다. 메모리 낭비를 줄이고자 스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
▪️ 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유(=task)한다.
📌 스택을 스레드마다 할당하는 이유 ?
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.
▪️ 따라서 각각의 스레드는 별도의 레지스터와 program counter, 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
▪️ 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(task)을 처리하도록 하는 것
장점
여러개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽고 다른 것에 영향을 미치지 않는다.
단점
✅ Context Switching에서의 오버헤드
✅ 프로세스 사이 어렵고 복잡한 통신 기법(IPC)
하나의 응용 프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하는 것으로, 웹 서버가 대표적인 멀티 스레드 응용 프로그램이다.
장점
✅ 시스템 자원 소모 감소 (자원의 효율성 증대)
✅시스템 처리량 증가 (처리 비용 감소)
✅ 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
단점
▪️ 주의깊은 설계가 필요
▪️ 디버깅 까다로움
▪️ 단일 프로세스 시스템의 경우 효과를 기대하기 어려움
▪️ 다른 프로세스에서 스레드를 제어할 수 없음 (즉, 프로세스 밖에서 스레드를 각각 제어할 수 없음)
▪️ 멀티 스레드의 경우 자원 공유의 문제 발생 (동기화 문제)
▪️ 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받음
📌 동기화 문제란 ? (Synchronization Issue)
멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될지 그 순서를 알 수 없다. 만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A가 해당 자원에 접근하지 못하거나, 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
이처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다.