Skip to content

Latest commit

 

History

History
111 lines (75 loc) · 6.7 KB

process-and-thread.md

File metadata and controls

111 lines (75 loc) · 6.7 KB

프로그램과 프로세스

프로그램(Program) 이란?

  • 사전적 의미: "어떤 작업을 위해 실행할 수 있는 파일"

프로세스(Process) 란?

  • 사전적 의미: "컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램"
  • 메모리 상에 로드되어 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
    • CPU 시간
    • 운영되기 위해 필요한 메모리 주소 공간
    • Code, Data, Stack, Heap이라고 하는 구조로 되어 있는 독립된 메모리 영역
  • 실행중인 프로그램이라고 간단하게 생각하면 됩니다.

프로세스의 특징

  • 기본적으로 프로세스 당 1개의 스레드가 존재하며, 이를 메인 스레드라고 한다.
  • 각 프로세스는 별도의 메모리 공간에서 실행되며, 한 프로세스는 다른 프로세스의 메모리 공간을 직접적으로 참조할 수 없기 때문에, 통신(IPC, inter-process communication)이나 I/O를 이용해서 간접적으로 이용해야 한다.
  • 한 프로세스가 다른 프로세스의 자원을 접근하는 통신방식은 여러가지가 있다.
    • 파이프, 파일, 소켓 등

프로세스와 스레드

스레드(Thread) 란?

  • 사전적 의미: "프로세스 내에서 실행되는 여러 흐름의 단위"
  • 프로세스에서 실행 제어 부분만을 분리한 것

스레드의 특징

  • 스레드는 프로세스 내에서, Stack 영역만 따로 할당 받고, 같은 프로세스의 스레드는 Code, Data, Heap 영역을 공유한다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

프로세스와 스레드의 차이

  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면 프로세스는 다른 프로세스의 메모리 공간에 직접 접근할 수 없다.

OS 스레드와 자바에서의 스레드의 차이

일반 스레드와 거의 차이가 없으며 네이티브 스레드로 동작합니다.

JVM 자체가 프로세스이고, 이곳에서 스레드를 관리(스레드 스케줄링, 스레드 관련 정보)합니다.

  • 스레드가 몇 개 존재하는가?
  • 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인가?
  • 스레드의 상태는 무엇인가?
  • 스레드의 우선순위는 얼마인가?

개발자는 자바 스레드로 동작할 스레드 코드만 작성하면, 스레드의 라이프 사이클은 JVM에 맡기고 실행만 요청하면 됩니다.

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

멀티 프로세싱

하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것

장점: 한 프로세스가 비정상 종료되더라도, 다른 프로세스에 영향을 미치지 않는다.

단점:

  • Context Switching에서의 오버헤드
    • 캐시 초기화 등의 무거운 작업들이 진행되고, 이로 인해 많은 시간이 소요되므로 오버헤드가 발생하게 된다.
    • 프로세스는 각각 독립된 메모리에서 동작하기 때문에 공유하는 메모리가 없어서 Context Switching이 발생하면, 캐시에 있는 모든 데이터를 전부 지우고 다시 캐시 정보를 불러와야만 한다.
    • 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)

멀티 스레딩

하나의 응용 프로그램을 여러 개의 스레드로 구성하고, 각 스레드는 각각의 작업을 처리하도록 하는 것

장점:

  • 시스템 자원 소모 감소(자원의 효율성 증대)
    • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
    • 또한, 메모리를 대부분 공유하기 때문에 그만큼의 공간이 절약된다.
  • 시스템 처리량 증가(처리 비용 감소)
    • 스레드간 데이터를 주고받는 것은 공유하는 영역을 통해서 하면 되기 때문에, 데이터를 주고받는 것이 간단해지고, 시스템 자원을 그만큼 더 사용할 수 있게된다.
    • 스레드 간의 Context Switching을 할 때에는 무거운 작업이 덜하기 때문에 자연스럽게 오버헤드가 줄어들어 응답 속도가 빨라지게 되므로 단위 시간당 처리량이 늘어나게 된다.
  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
    • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.

단점:

  • 주의 깊은 설계가 필요하다.
  • 디버깅이 까다롭다.(자바에서 멀티 스레딩 관련 코드를 디버깅하면 쉽게 알 수 있다. 디버깅 포인트가 완전히 달라지고, 내가 디버거로 해당 코드를 지연시켜서 동작이 달라질 수도 있다.)
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
  • 다른 프로세스에서 스레드를 제어할 수 없다.
  • 멀티 스레드의 경우 자원 공유의 문제가 발생한다.(동기화 문제)
  • 하나의 스레드에 문제가 발생하면 다른 스레드까지 영향을 미치게 된다.

왜 멀티 스레딩을 더 많이 사용할까?

  • 설계의 어려움과, 디버깅의 불편함과는 별개로 오버헤드가 많이 줄어들고, 자원 공유가 되기 때문입니다.
  • 프로그램을 여러 개 실행시켜서 작업을 진행하는 것과, 하나의 프로그램 안에서 해결한다는 차이로도 볼 수 있습니다.
  • 자원의 효율성 증대 측면
    • 프로세스 생성 후 자원을 할당하는 과정의 시스템 콜이 줄어듭니다. 이를 통해서 자원이 효율적으로 관리될 수 있습니다.
      • Context Switching 때, Register 교체 뿐만아니라 RAM와 CPU 사이에 위치한 캐시 메모리 까지 초기화 시켜주어야 하기 때문입니다.
    • 스레드는 같은 프로세스에서는 메모리를 공유하기 때문에 프로세스간의 통신처럼 복잡한 과정이 필요 없고, 데이터를 주고 받는 방식이 간단하고, 시스템의 자원 또한 아낄 수 있습니다.
  • 처리 비용 감소 및 응답 시간 단축 측면
    • 프로세스 간 통신(IPC)보다 스레드 간의 통신 비용이 당연히 적기 때문에 결국 응답 시간이 줄어듭니다.
    • 프로세스 간 Context Switching보다 스레드 간 Context Switching 비용

참고한 자료

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

[How Java thread maps to OS thread?](