프로세스 vs 스레드

프로그램

어떤 작업을 위해 실행할 수 있는 파일

프로세스

메모리에 올라와 실행되고 있는 프로그램의 인스턴스
운영체제로부터 독립된 시스템 자원을 할당 받는 작업의 단위
최소 한개의 스레드 존재
code : 실행 명령을 포함하는 코드들
data: static 변수, global 변수
heap: 동적 메모리 영역
stack: 지역변수, 매개변수, 반환값 등등 일시적인 데이터
OS는 프로세스에게 제한된 Virtual Memory 공간 할당

PCB

process control block
프로세스에 대한 정보를 담고있는 블록

컨텍스트 스위칭

다수의 프로세스를 동시에 실행하기위해 여러개의 프로세스를 짧은 텀을 반복하면서 전환해서 실행

스레드

한 프로세스 내에서 구분지어진 실행 단위
하나의 프로세스 안에 다수의 스레드
Process에 속한 모든 스레드는 프로세스가 할당 받은 가상 메모리로 공간이 제약
code, data, heap 영역의 자원을 공유
→ 다 빼고 다시 다 넣지 않기 때문에 효율적임
컨텍스트 스위칭이 일어날 때 캐싱 적중률이 올라감
동시성 - 한순간에 여러가지 일이 아니라 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는
프로세스를 한 가구라고 비유
한 가구는 집(가상 메모리 공간)이 부여
세대원을 스레드
세대원은 방(Thread Local Storage; 스택 구조로 관리되는 메모리 공간)은 각자쓰고 거실같은 공용공간(data, heap, code)을 같이 사용
한 어플리케이션에 대한 두 가지 다른 처리방식

멀티 프로세스

각 프로세스는 자원을 공유하지 않고 독립적
→ IPC를 통해서 통신해야한다.
자원 소모적, 개별 메모리 차지
Context Switching 비용이 큼
단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화되므로 오버헤드가 큼
동기화 작업이 필요하지 않음
프로세스에 문제가 발생해도 다른 프로세스에는 영향이 확산되지 않음

멀티 스레드

공유자원이 많아 스레드 간 긴밀하게 연결되어 있음
공유 자원으로 통신 비용 절감, 메모리 효율적
Context Switching 비용이 적음
stack영역만 처리하기 때문에 전환 속도가 빠
공유 자원 관리 필요
한 스레드에 문제가 생기면 전체 프로세스에 영향
다른 프로세스에서 스레드를 제어할 수 없음
동기화 문제
스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 함께 상용할 때 충돌이 발생할 수 있음 → 동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤해야함 But 병목현상으로 성능 저하 가능성 있

관련 질문

1.
스레드에 스택을 독립적으로 할당하는 이유?
스레드마다 독립적인 함수 호출, 실행을 하기 위해서 스레드에 스택을 독립적으로 할당
2.
PC 레지스터를 스레드마다 독립적으로 할당하는 이유?
PC 레지스터란? 스레드가 명령어의 어디까지 수행했는지 기록
Context Switch 할 때 이전에 어디 부분까지 작업을 수행했는지 기억하기 위해서 PC 레지스터를 스레드마다 독립적으로 할당
3.
자바 스레드란?
JVM에 의해 스케쥴링 되는 코드 블록으로
자바는 프로세스가 존재하지 않고 스레드만 존재
4.
Thread-safe?
멀티 스레드 환경에서 공유 자원에 여러 스레드 접근이 있어도 프로그램 실행에 문제가 없음을 의미
5.
세마포어와 뮤텍스
세마포어는 count를 주어 count 값만큼 프로세스/스레드가 접근 가능하도록 하는 기법
뮤텍스는 lock/unlock으로 권한을 가진 프로세스/스레드만 접근할 수 있도록하는 기법