프로세스 내부에는 최소 하나의 스레드(thread)를 가지고 있는데, 실제로는 스레드(thread) 단위로 스케줄링
완벽히 독립적이기 때문에 메모리 영역(Code, Data, Heap, Stack)을 다른 프로세스와 공유하지 않음
-> 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없음
프로세스는 최소 1개의 스레드(메인 스레드)를 갖고 있음
Thread
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로세스 내에서 Stack만 따로 할당 받고, 그 이외의 메모리 영역(Code, Data, Heap)영역을 공유
-> 스레드는 Stack 을 제외한 Code/Data/Heap 부분은 공유해 서로 읽고 쓸 수 있음
스레드는 프로세스 내에 존재하며 프로세스가 할당받은 자원을 이용하여 실행
Multi Process & Multi Thread
멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한 처리방식
둘 다 컴퓨팅의 효율성을 위한 병렬 처리 기법
이 둘의 처리 방식과 차이점에 대해 알아보자!
Multi Process
컴퓨터 시스템에서 여러 개의 프로세스가 동시적으로 작업을 실행
하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성(fork)함으로서 다중 프로세스를 구성
생성된 프로세스는 자신만의 메모리 영역(Heap, Stack, Code, Data)을 가짐
프로세스끼리 독립되기에 프로세스 사이에서 공유할 자원이 있다면 프로세스 간 통신 메커니즘(IPC)을 활용
예시
크롬 브라우저에서 여러개의 탭 띄우고 여러 사이트 방문
한 탭에 문제가 생겨도 다른 탭은 문제없이 이용 가능
특징
장점
독립성: 각 프로세스는 독립적인 메모리 공간을 가지기 때문에 하나의 프로세스가 다른 프로세스에게 영향을 미치지 않음
안정성: 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스는 영향을 받지 않아 시스템이 더 안정적
스레드 간 통신: 프로세스 간 통신은 복잡하고 오버헤드가 크지만, 안전하게 데이터를 공유할 수 있음
단점
자원 소모: 각 프로세스는 독립적인 메모리를 사용하므로 메모리 사용량이 증가하고 전환 비용이 발생
프로세스를 컨텍스트 스위칭 하면, CPU는 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비해야 함
-> 빈번한 Context Switching 작업으로 인해 비용 오버헤드가 발생
속도 저하: 프로세스 간 통신이 필요한 경우 오버헤드로 인해 성능이 저하
Multi Thread
하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동
프로세스 내에서 데이터, 힙, 코드 영역을 공유하기 때문에 자원의 관점과 Context Switching 관점에서 멀티 프로세싱 방법보다 효율적
윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있음
예시
멀티 프로세스는 웹 브라우저에서의 여러 탭이나 여러 창
멀티 스레드는 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리하는데 사용
동시성과 병렬성
동시성
동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것
동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 것임
병렬성
멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것
특징
장점
자원 공유: 스레드 간의 자원을 공유하기 때문에 프로세스 간 통신 (IPC)을 사용하지 않고도 데이터를 공유할 수 있어서 자원의 효율적인 활용이 가능해 시스템 자원 소모가 줄어듦
경량화: 프로세스에 비해 스레드는 용량이 작고, 스레드를 생성하고 제거할 때 프로세스 내부의 자원만을 관리하면 되기 때문에 프로세스 생성, 제거보다 훨씬 빠름
Context Switching 비용 감소
프로세스 Context Switching: 스위칭할 때마다 CPU 캐시에 있는 내용을 모두 초기화하고, 새로운 프로세스 정보를 CPU 캐시에 적재해야 하므로 높은 비용
스레드 Context Switching: 스위칭할 때 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만을 교체하면 되므로 프로세스 컨텍스트 스위칭 비용보다 상대적으로 낮음
빠른 통신:
Multi Process: 웹 서버에서 클라이언트 요청을 처리하는 경우, 각 요청마다 프로세스를 생성하여 처리해야 하므로 오버헤드가 큼
Multi Thread: 여러 개의 스레드가 하나의 프로세스 내에서 요청을 처리할 수 있으므로, 오버헤드가 감소해 더욱 빠른 응답 시간을 보장
단점
안정성: 하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받아 전체 프로그램이 종료될 수 있음
자원 한계: 너무 많은 스레드를 생성하면 자원 소모가 커질 수 있고, 성능이 저하
동기화 문제: 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에, 동기화 문제가 발생
+) 동기화 작업: 여러 스레드들이 자원에 대한 접근을 순차적으로 통제 -> 동시 접근으로 인한 동시 수정과 같은 현상 해결
그러나 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하
교착상태: 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생
해결방법
동기화 작업: 임계 영역(Critical Section)에 대하여 뮤텍스(mutex), 또는 세마포어(Semaphore) 방식
교착상태: 상호배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait) 등의 알고리즘을 통해 극복