프로세스 vs 스레드

고장난 고양이·2022년 7월 15일
0

운영체제

목록 보기
9/21

프로세스 & 스레드

프로그램

파일이 저장 장치에 저장되어는 있으나, 메모리에는 올라가있지 않은 정적인 상태

어떠한 작업을 위해 실행할 수 있는 파일을 의미합니다.

프로세스

프로그램이 메모리에 올라오면 OS로부터 CPU를 할당받고 프로그램이 실행되어 있는 상태

  • 할당받는 시스템 자원
    • CPU 시간
    • 필요한 주소 공간
    • Code, Data, Stack ,Heap의 구조로 되어있는 메모리 영역

특징

  • 프로세스당 최소 1개의 스레드를 가진다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한프로세스가 다른 프로세스에 접근할려면 프로세스간의 통신(IPC)를 이용해야한다.
    ex) 파이프, 파일 ,소켓등을 이용

스레드

프로세스 내에서 실행되는 여러 흐름의 단위

프로세스가 할당 받는 자원을 이용하는 실행의 단위라고 생각하면 쉬울 것 같다.

특징

  • 스레드는 각각의 stack만 할당 받고 나머지 code, data, heap은 공유한다.
  • 스레드는 한 프로세스내에서 진행되는 여러 실행의 흐름으로, 프로세스 내의 주소공간이나 자원들을 같은 프로세스 내의 스레드끼리 공유한다.
  • 대신 다른 프로세스의 메모리에는 직접 접근할 수 없다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 프로세스가 그 변경 결과를 바로 볼 수 있다.

Java Thread란?

일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다.

  • 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
  • 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
  • 아래와 같은 스레드와 관련된 많은 정보들도 JVM이 관리한다.
    • 스레드가 몇 개 존재하는지
    • 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
    • 스레드의 상태는 무엇인지
    • 스레드 우선순위는 얼마인지

즉, 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일 뿐이다.

멀티프로세스 & 멀티스레드

멀티프로세스

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

(장점)

  • 하나의 프로세스가 죽어도 다른 프로세스에는 영향을 끼치지 않음

(단점)

  • 각각 독립된 메모리 영역을 갖고 있어 작업량이 많을수록 오버헤드가 발생하고 문맥 교환(Context Switching)으로 인한 성능 저하를 유발
  • 프로세스 사이의 통신이 복잡(IPC)

멀티 스레드

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

  • 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
  • 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

(장점)

  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 가능
  • Code, Data, Heap 영역을 공유하기 때문에 데이터를 주고 받는 것이 간단해지고 자원 소모가 적음
  • 스레드 사이 작업량이 작아 문맥교환이 빠르며 시스템 처리량 증가

(단점)

  • 프로그램 디버깅이 까다로움
  • 하나의 스레드에 문제가 생기면 전체적인 프로세스에 영향을 끼침
  • 동기화 문제 발생(전역 변수를 이용하기 때문)
  • 단일 프로세스 시스템에서 효과를 기대하기 어려움
  • 다른 프로세스에서 스레드 제어 불가

(중요) 멀티 프로세스 대신 멀티 스레드를 사용하는 이유

  • 프로세스 생성 시 자원을 할당하는 시스템 콜이 줄어들어 자원 소모가 적고 자원을 효율적으로 관리할 수 있습니다.
  • 또한 프로세스의 경우 Context Switching 시 CPU 레지스터, RAM과 CPU 사이의 캐시 메모리가 초기화되기 때문에 오버헤드가 큰 반면, 스레드는 Context Switching시 Stack 영역만 처리하면 됨으로 스레드 간의 문맥 교환 속도가 빠릅니다.
  • 그리고 프로세스의 경우 프로세스 간의 통신을 위해서는 IPC를 통해서 통신을 해야 하지만, 스레드의 경우 스레드 간의 자원 공유가 간단하기 때문에 시스템 자원 소모가 작습니다.

그러나 전역 변수를 통해 스레드 간의 자원을 공유하기 때문에 동기화 문제는 잘 해결해야 합니다.

참고
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
https://cocoon1787.tistory.com/688

profile
개발새발X발일지

0개의 댓글