어제의 나보다 성장한 오늘의 나

프로세스와 스레드의 차이 본문

CS/운영체제

프로세스와 스레드의 차이

NineOne 2021. 4. 21. 02:19

먼저 프로세스와 스레드에 대해 본격적으로 설명하기 전에 프로그램에 대해서 알고 가야 한다.

프로그램(Program)이란?

  • 사전적 의미 : "어떤 작업을 위해 실행할 수 있는 파일"
  • 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가지 있지 않은 정적인 상태
    • 메모리에 올라가 있지 않은 : 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해줘야 실행될 수 있다.
    • 정적인 상태 : 단어 그대로 움직이지 않은 상태 즉! 아직 실행되지 않고 가만히 있다는 뜻이다.
    • 위 2가지 형태로 본다면 아직 실행되지 않은 파일 그 자체를 가리키는 말이다.

프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다. 위키피디아에서는 프로세스에 대해 정의를 내릴 때 실행되고 있는 컴퓨터 프로그램이라고도 하며, 스케줄링 단계에서의 '작업'과 같은 단어로 봐도 무방하다고 한다.

프로세스(Process)란?

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (독립적인 개체)
  • 즉! 프로그램을 실행하게 되면 CPU를 차지하면서 수행하는 수행주체가 프로세스이고 프로그램은 하나지만 이 프로그램을 실행하는 인스턴스는 여러 개가 생길 수 있다.
  • 운영체제로부터 자원을 할당받는 작업의 단위
  • 동적인 개념으로는 실행된 프로그램을 의미

스레드(Thread)란?

  • 프로세스 내에서 실행되는 여러 흐름의 단위
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위


프로세스와 스레드의 작동 방식

  • 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다.
  • 이때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해준다.
  • 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
  • 하지만!!! 한 프로세스가 다른 프로세스의 자원을 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다. Ex) 파이프, 파일, 소켓 등을 이용한 통신 방법

(이미지 출처:  Heee's Development Blog )

 

  • 이와 다르게 스레드는 메모리를 서로 공유할 수 있다.
  • 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다.
  • 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있다.

(이미지 출처:  Heee's Development Blog )

여기서! 프로세스와 스레드의 중요한 차이 하나

만약 한 프로세스를 실행하다가 오류가 발행해서 프로세스가 강제로 종료된다면??? 다른 프로세스에게 어떤 영향이 있을까?? -> 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.

그런데!!! 스레드의 경우는 다르다. 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유한다. 따라서 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내에서 다른 스레드 모두가 강제로 종료된다.

 

멀티 프로세스와 멀티 스레드의 차이

멀티 프로세스 

  • 멀티 프로세싱
    • 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
  • 장점
    • 여러 개의 자식 프로세스 중 하나가 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
  • 단점
    • Context Switching에서 오버헤드
      • Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생한다.
      • 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이의 공유하는 메모리가 없어 Context Switching이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 캐시 정보를 불러와야 한다.
    • 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
      • 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없고 통신 기법을 이용해야 된다.
  • 참고! Context Switching이란?
    • CPU에서 여러 프로세스를 돌리면서 작업을 처리하는 과정을 말한다.
    • 구체적으로 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

멀티 스레드

  • 멀티 스레딩
    • 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것
    • 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
    • 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
  • 정점
    • 시스템 자원 소모 감소 (자원의 효율성 증대)
      • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리
    • 시스템 처리량 증가( 처리 비용 감소 )
      • 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어듦
      • 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
    • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
      • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
  • 단점
    • 주의 깊은 설계 필요
    • 디버깅의 까다로움
    • 단일 프로세스 시스템의 경우 효과를 기대하기 어려움
    • 다른 프로세스에서 스레드를 제어할 수 없음 (즉, 프로세스 밖에서 스레드를 제어할 수 없다.)
    • 멀티 스레드의 경우 자원 공유 문제가 발생 (동기화 문제)
    • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받음

 

멀티 프로세스 대신! 멀티 스레드를 사용하는 이유

멀티스레드의 장점

  1. Context-Switching 할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
  2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.

멀티스레드의 단점

  1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
  2. 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.

동기화 문제

  • 멀티스레드를 사용하면 각각의 스레드 실행 순서를 할 수 없다.
  • A 스레드가 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.

자바 스레드(Java Thread)란

  • 일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다.
  • 자바에는 프로세스가 존재하지 않고 스레드만 존재
  • 자바 스레드는 JVM에 의해 스케줄 되는 실행 단위 코드 블록이다.
  • 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
  • 아래와 같은 스레드와 관련된 많은 정보들도 JVM이 관리한다.
    • 스레드가 몇 개 존재하는지
    • 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
    • 스레드 상태는 무엇인지
    • 스레드 우선순위는 얼마인지
  • 즉! 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일뿐이다.

 

 

출처

Comments