Back-End/Java

[Java] Process & Thread 개념

유자맛바나나 2022. 2. 21. 03:09

 

❑ 프로세스(Process)와 쓰레드(Thread)

프로세스와 쓰레드의 개념 및 관계

  • 프로세스는 간단히 말해 '실행 중인 프로그램(Program)'이다
  • 쓰레드는 프로세스를 구성하는 한 가지이자, 작업을 처리하는 일꾼이다. 
    1. 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다. 
    2. 쓰레드를 프로세스라는 공장에서 작업을 처리하는 일꾼으로 생각하면 이해하기 쉽다.
  • 스레드를 경량화된 프로세스라고도 한다
    • 컴퓨터는 프로세스마다 자원을 분할해서 할당한다. 한 프로세스의 스레드들은 같은 공간(분할된 자원)에서 진행된다.
    • 각 스레드는 Stack 영역만 독립적으로 갖고 그 외 부모 프로세스의 자원을 공유한다. 그렇기 때문에 Context Switching처럼 하나의 프로세스를 다 내렸다가, 다시 올리는 작업을 할 필요가 없다. 이를 캐싱 적중률이 높아진다고 표현한다.

그림1. 프로세스-쓰레드 간 자원 별 공유 영역

  • 멀티 태스킹(Multi-Tasking = Multi-Process)
    윈도우, 유닉스 등 대부분의 OS는 멀티태스킹을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다.
    → 포스팅 하단의 [참고 2] 멀티태스킹의 동시성과 병렬성 확인 
  • 멀티 쓰레딩(Multi-Threading)
    1. 따라서 모든 프로세스에는 최소 한 개 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스라고 한다.
    2. 멀티 쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행한다. 예를 들어, 하나의 크롬 프로세스 안에서 유튜브와 네이버 검색 등 다중 작업을 동시에 처리함으로써 가능한 것이다. 여러 사용자에게 서비스를 해주는 서버는 멀티 쓰레드가 필수적이다.
    3. 단, 그림1에서와 같이 여러 개의 쓰레드가 Data, Heap 등 자원을 공유하며 작업하기 때문에 동기화(synchronization), 교착상태(deadlock)와 같은 문제들을 반드시 고려하며 사용해야 한다.
    4. 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않다. 하지만 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출스택)이 필요해 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드 수가 정해진다.
    5. 참고로, CPU 코어는 한 번에 단 하나의 작업만 수행할 수 있어 실제 동시 처리되는 작업은 코어의 개수와 같다. 하지만 쓰레드의 수는 언제나 코어의 개수보다 훨씬 많은데, 각 코어가 짧은 시간동안 여러 작업을 번갈아 수행함으로써 동시에 수행되는 것처럼 보이게 하는 것이다.
    6. 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니다. 싱글 쓰레드가 멀티 쓰레드보다 나은 성능을 보일때도 있다.

 

[참고 1] 프로그램과 프로세스(Program and Process)

  • 프로그램과 프로세스의 관계
    1. 프로그램: 코드로 작성되어 빌드된 파일
    2. 프로세스: 프로그램을 실행시켜 메모리에서 작동되는 것. 즉, '실행 중인 프로그램'
  • 프로그램이 프로세스가 되면서 일어나는 일
    1. Code, Data, Heap, Stack이 메모리 영역에 올라간다
      *Code: 실행 명령을 포함하는 코드들
      *Data: Static 변수 혹은 Global 변수
      *Heap: 동적 메모리 영역
      *Stack: 지역변수, 매개변수, 반환 값 등 일시적인 데이터
    2. PCB(Process Control Block) 블럭 생성
      *PCB: 프로세스에 대한 정보를 담고 있는 블럭

 

[참고 2] 멀티 태스킹의 동시성과 병렬성

한 프로세스가 실행되기 위해선 프로세서(CPU core)를 점유하고 있어야 한다. 그리고 프로세서가 점유된 상태에선 다른 프로세스는 실행될 수 없다. 즉, 동시에 여러 개의 프로세스가 실행될 수 없다. 하지만 우리는 카카오톡, 크롬, 엑셀 등 다양한 프로세스를 함께 사용하고 있는데, 프로세서가 동시성과 병렬성의 특징으로 여러 개의 프로세스를 빠르게 처리하고 있기 때문이다.

 

 

1) 동시성(Concurrency)

  • 하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)를 번갈아가면서 진행하지만 동시에 진행되는 것처럼 보이는 것.
  • 일을 바꾸는 것을 Context Swithching이라 하며, 다양한 방식과 알고리즘이 사용됨. 이 과정이 매우 빠르게 일어나서 동시에 진행되는 것처럼 느껴지는 것이다.

 

2) 병렬성(Parallelism)

  • 프로세서 하나에 코어 여러개가 달려서 각 코어가 동시에 여러 개의 작업(프로세스)을 하는 것.
  • 듀얼코어, 쿼드코어 등 멀티코어 프로세서의 CPU가 처리할 수 있는 방식

 

❑ Reference

  • Java의 정석 | 남궁성 | 도우출판