멀티 프로세스(Multi Process) & 멀티 스레드(Multi Thread)

hyun0·2023년 12월 12일

OS

목록 보기
1/3

Process

  • 실행중인 프로그램
  • 스케줄링의 대상이 되는 작업(task)와 같은 의미
  • 프로세스 내부에는 최소 하나의 스레드(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)을 활용

예시

  • 크롬 브라우저에서 여러개의 탭 띄우고 여러 사이트 방문
  • 한 탭에 문제가 생겨도 다른 탭은 문제없이 이용 가능

특징

장점

  1. 독립성: 각 프로세스는 독립적인 메모리 공간을 가지기 때문에 하나의 프로세스가 다른 프로세스에게 영향을 미치지 않음
  2. 안정성: 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스는 영향을 받지 않아 시스템이 더 안정적
  3. 스레드 간 통신: 프로세스 간 통신은 복잡하고 오버헤드가 크지만, 안전하게 데이터를 공유할 수 있음

단점

  1. 자원 소모: 각 프로세스는 독립적인 메모리를 사용하므로 메모리 사용량이 증가하고 전환 비용이 발생
    • 프로세스를 컨텍스트 스위칭 하면, CPU는 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비해야 함
      -> 빈번한 Context Switching 작업으로 인해 비용 오버헤드가 발생
  2. 속도 저하: 프로세스 간 통신이 필요한 경우 오버헤드로 인해 성능이 저하

Multi Thread

  • 하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동
  • 프로세스 내에서 데이터, 힙, 코드 영역을 공유하기 때문에 자원의 관점과 Context Switching 관점에서 멀티 프로세싱 방법보다 효율적
  • 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있음

예시

  • 멀티 프로세스는 웹 브라우저에서의 여러 탭이나 여러 창
  • 멀티 스레드는 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리하는데 사용

동시성과 병렬성

동시성

  • 동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것
  • 동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 것임

병렬성

  • 멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것

특징

장점

  1. 자원 공유: 스레드 간의 자원을 공유하기 때문에 프로세스 간 통신 (IPC)을 사용하지 않고도 데이터를 공유할 수 있어서 자원의 효율적인 활용이 가능해 시스템 자원 소모가 줄어듦
  2. 경량화: 프로세스에 비해 스레드는 용량이 작고, 스레드를 생성하고 제거할 때 프로세스 내부의 자원만을 관리하면 되기 때문에 프로세스 생성, 제거보다 훨씬 빠름
  3. Context Switching 비용 감소
    • 프로세스 Context Switching: 스위칭할 때마다 CPU 캐시에 있는 내용을 모두 초기화하고, 새로운 프로세스 정보를 CPU 캐시에 적재해야 하므로 높은 비용
    • 스레드 Context Switching: 스위칭할 때 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만을 교체하면 되므로 프로세스 컨텍스트 스위칭 비용보다 상대적으로 낮음
  4. 빠른 통신:
    • Multi Process: 웹 서버에서 클라이언트 요청을 처리하는 경우, 각 요청마다 프로세스를 생성하여 처리해야 하므로 오버헤드가 큼
    • Multi Thread: 여러 개의 스레드가 하나의 프로세스 내에서 요청을 처리할 수 있으므로, 오버헤드가 감소해 더욱 빠른 응답 시간을 보장

단점

  1. 안정성: 하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받아 전체 프로그램이 종료될 수 있음
  2. 자원 한계: 너무 많은 스레드를 생성하면 자원 소모가 커질 수 있고, 성능이 저하
  3. 동기화 문제: 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에, 동기화 문제가 발생
    +) 동기화 작업: 여러 스레드들이 자원에 대한 접근을 순차적으로 통제 -> 동시 접근으로 인한 동시 수정과 같은 현상 해결
    그러나 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하
  4. 교착상태: 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생

해결방법

  • 동기화 작업: 임계 영역(Critical Section)에 대하여 뮤텍스(mutex), 또는 세마포어(Semaphore) 방식

  • 교착상태: 상호배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait) 등의 알고리즘을 통해 극복


참고

profile
聽卽振, 視卽記, 爲卽覺

0개의 댓글