Process 와 Thread의 차이에 대해

최준석·2022년 12월 23일
0

Today I Learned

목록 보기
4/4

면접에서 질문 받았던 내용 중 하나를 정리해보고자 한다.

Process란?

프로세스(process) 는 컴퓨터에서 연속적으로 '실행되고 있는 컴퓨터 프로그램'을 말한다. 종종 스케줄링의 대상이 되는 작업(task) 이라는 용어와 거의 같은 의미로 쓰이는데, 그러니까 프로그램 그 자체(실행코드)라기보다는 프로그램을 구동하여 프로그램 자체와 프로그램 상태가 메모리 상에서 실행되는 작업 단위를 가리켜 프로세스라는 한다고 볼 수 있다. 이러한 프로세스를 여러개 사용하는 걸 멀티프로세싱이라고 하며 동시에 여러 개의 프로세스를 동작시키는 시분할 방식을 멀티태스킹이라고 한다.

각 프로세스는 서로 침범할 수 없는 각각의 주소값에 존재하며 각자 Code, Data, Stack, Heap 영역을 메모리상에 가진다.

Process의 상태

Process는 5개의 상태 중 하나를 가지는데 이는 다음과 같다.

  • 생성(create) : 프로세스가 생성되는 중
  • 실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되는 중
  • 준비(ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • 대기(waiting) : 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
  • 종료(terminated) : 프로세스의 실행이 종료된 상태

준비와 대기의 차이점에 대해 얘기하자면, 대기의 경우에는 프로세스가 실행상태에서 빠져나와 어떤 추가적인 입출력 등 을 완료하기 위해 진행중인 상태이고, 준비의 경우에는 앞에서 얘기한 입출력을 완료하고 온전히 CPU 할당을 위해 기다리고 있는 상태라고 볼 수 있다.

Thread란?

스레드(thread) 는 어떤 프로그램(프로세스) 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있고, 이런 실행방식을 멀티스레드(multithread) 라고 한다.

  • 두개의 스레드를 실행하고 있는 하나의 프로세스

1개의 프로세스에서 2개 이상의 스레드가 실행되면 Code, Data, Heap영역은 스레드간에 공유하고 Stack 영역만 각 스레드별로 따로 할당받는다.

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

멀티프로세싱

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

장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽고 영향이 확산되지 않는다.

단점

  • Context Switching에서의 오버헤드
    • Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다.
    • 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스간 공유하는 메모리가 없어, ContextSwitching이 발생하면 캐시에 있는 모든 데이터를 갱신해야 한다.
  • 프로세스 사이의 어렵고 복잡한 통신기법(IPC)
    • 프로세스는 서로의 메모리 영역을 침범할 수 없으므로 하나의 프로그램에 속하는 변수를 공유할 수 없다.

멀티 스레드

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

장점

  • 시스템 자원 소모 감소
  • 프로세스를 생성하여 자원을 할당하는 System Call이 줄어들어 자원을 효율적으로 관리할 수 있다.
  • 시스템 처리량 증가
  • 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 된다.
  • 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
  • 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.

단점

  • 주의 깊은 설계가 필요하다.
  • 디버깅이 까다롭다.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다
  • 다른 프로세스에서 스레드를 제어할 수 없다.(즉, 프로세스 밖에서 스레드 각각을 제어할 수 없다.)
  • 멀티 스레드의 경우 자원 공유의 문제가 발생한다.(동기화 문제)
  • 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.

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

멀티 프로세스 대신 멀티 스레드를 사용한다는 것은?

  • 쉽게 설명하면, 프로그램을 여러 개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.

이렇게 하는 이유는?

  1. 자원의 효율성 증대
  • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있다.
  1. 처리 비용 감소 및 응답 시간 단축
  • 프로세스 간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신 부담이 줄어든다.
  • 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.

! 주의할 점

  • 스레드 간의 자원 공유는 전역 변수를 이용하므로 여러개의 스레드가 1개의 전역 변수에 접근한다면 예상치 못한 상황이 발생할 수 있다.





출처

https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4
https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

profile
Back-End Web Developer

0개의 댓글