프로세스와 스레드 차이

프로세스와 스레드의 차이를 알아보고, Context Switching에 대해서도 비교해보자 ❕

  • 프로세스 : (하드디스크에 있는) 프로그램을 메인 메모리에 올려 동적으로 실행시킨 상태로,

    • OS 입장에서의 최소 작업 단위
  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위로,

    • CPU 입장에서의 최소 작업 단위
    • (프로그램의 단위가 커지고 복잡해졌기에 더 작은 실행 단위를 만듦.)

프로세스와 스레드에 대해서 자세히 알아보자. 특히 ❗ 이부분은 각각의 메모리 할당과 관련한 부분이다. 이 차이가 Context Switching 속도에 영향을 준다.

Context Switching이란

하나의 프로세스를 실행하고 있는 상태에서 다른 프로세스를 실행해야 할 때 발생한다. 기존 프로세스의 상태를 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태로 교체하는 작업이다.

프로세스

  • 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당 받는다.
  • ❗ 각각 독립적인 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.
  • 하나의 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
  • 프로세스당 최소 1개의 스레드(Main 스레드)를 가지고 있다.

스레드

  • ❗ 같은 프로세스의 스레드들끼리는 각각 Stack만 따로 할당받고, 프로세스 내의 주소 공간이나 자원들(Code/Data/Heap)은 공유한다.
  • 장점
    • 스레드간 데이터를 주고 받는 때 자원 소모가 줄고, 응답 시간 단축된다.
    • Context Switching의 오버헤드가 해결된다.
  • 단점
    • 서로 데이터를 사용하다가 충돌이 일어날 수 있다.
    • 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.

즉, 프로세스는 모든 메모리 영역(Code, Data, Stack, Heap)을 독립적으로 가진다. 반면, 스레드는 Stack만 독립적으로 할당받고, 그 외의 메모리 영역(Heap 등)은 공유한다. (같은 프로세스 내의 여러 스레드들일 경우) 이 차이가 Context Switching 속도에도 영향을 준다.

스레드가 Context Switching이 더 빠르고 메모리를 효율적으로 쓴다.

💡 왜냐하면, 다른 메모리 영역은 공유하므로 Stack영역만 교체해주면 되기 때문이다. -> 시간/공간 효율적 프로세스는 모든 메모리 공간을 Switching해주어야 하기에 오버헤드가 크다.

이것이 멀티 프로세스 대신 멀티 스레드를 사용하는 이유이기도 하다.

  1. 메모리 측면 : 자원을 효율적으로 사용하기 위해 멀티 프로세스의 경우 프로세스를 생성하여 자원을 할당하는 시스템 콜을 할 때마다 오버헤드가 크지만, 멀티 스레드는 메모리 영역을 공유하기 때문에 시스템 자원을 효율적으로 사용할 수 있다.
  2. 속도 측면 : Context-Switching 비용을 줄이고 응답 속도를 빠르게 하기 위해 메모리 영역을 공유하기 때문에 Context-Switching과 스레드 간의 통신 시 Stack 영역만 처리하기에 통신 비용이 적고 응답속도가 빠르다.