Process 와 Thread의 차이

yoneeki·2022년 12월 8일
0

개요

  • 프로세스와 스레드의 차이점은 면접 단골 질문
  • '동시에' 라는 말이 한 순간에 여러가지 일이 일어나는 것이 아님을 염두에 두어야 한다.
  • 스레드와 프로세스가 완전히 다른 무언가가 아닐 수 있다.
  • 실행 단위 : cpu core에서 실행하는 하나의 단위로 프로세스와 스레드를 포괄하는 개념. 실행 단위가 프로세스일 때도 있고 스레드일 때도 있다.
  • (부연 설명이 없는) 프로세스 : 하나의 스레드만 갖고 있는 단일 스레드 프로세스.
  • 동시성 : 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것.

프로세스 (Process) & 스레드 (Thread)

  • 프로그램과 프로세스 : 실행 중인 프로그램 -> 프로세스. 즉 프로세스는 메모리에 올라간 프로그램. 프로세스는 프로그램의 인스턴스.
  • 멀티태스킹 : OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위.
  • 프로그램이 프로세스가 되면, 프로세스에 필요한 재료들이 메모리에 올라간다 (메모리 확보) ex) Code(실행 명령을 포함하는 코드들), Data(Static 혹은 Global 변수), Heap(동적 메모리 영역), Stack(지역변수, 매개변수, 리턴 값 등등 일시적인 데이터)
  • 각각의 프로세스는 프로세스 고유번호(pid)를 갖고 있다.
  • 또한 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 프로세스 생성 시 함께 만들어 진다.
  • 대부분의 사람들은 동시에 프로세스 여러가지를 사용한다. 하지만 원래 한 프로세스가 실행되며 cpu를 점령하고 있으면 다른 프로세스는 실행 상태에 있을 수가 없다. 그래서 다수의 프로세스를 실행하기 위해 여러 개의 프로세스를 시분할로, 짧은 텀을 반복하면서 전환해서 실행하도록 한다 (컨텍스트 스위칭)
  • 이처럼 컨텍스트 스위칭이 너무 복잡해서 그것을 경량화한 것이 스레드이다.
  • 하나의 프로세스 안에 다수의 스레드가 있을 때 스레드는 스택을 제외한 코드, 데이터, 힙 영역을 공유해서 사용한다. 각 스레드는 스택 부분만을 따로 가지고 있기에 효율적이다. 공유되는 자원이 있기 때문에 컨텍스트 스위칭이 발생할 때 캐싱 적중률이 올라간다. 쉽게 말해서 모조리 다 빼고 다시 다 넣을 필요가 없다는 것이다(외출 때마다 이사 나가듯이 물건을 다 이삿짐 차에 실어서 나갈 필요가 없다는 것).

멀티 프로세스 (Multi-Process) & 멀티 스레드 (Multi-Thread)

  • 우선, 멀티 프로세스와 멀티 스레드 두 가지 개념 모두 처리방식의 일종이다 (한 어플리케이션에 대한 처리방식).
  • 한 어플리케이션이 여러가지 일을 처리할 때가 있다. 예를 들어 여러 사용자가 로그인을 요청하는 경우. 한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시에 처리할 수 없다. 그래서 부모 프로세스가 프로세스를 여러 개 포크해서 자식 프로세스들이 그 일을 처리하도록 만든다. // 그런데 한 프로그램을 처리하기 위해 프로세스를 여러 개 만든다는 말은 틀리다. 주의해야 한다. 원칙적으로 프로세스는 자신에게 할당된 메모리 내의 정보에만 접근할 수 있고 그것을 벗어나면 오류가 되기 때문이다. 프로세스 간의 접근은 IPC 통신을 활용해야 한다.
  • 이 때 자식 프로세스들은 부모와 별개의 메모리 영역을 확보하게 된다.
  • 반면 스레드는 한 프로세스 내에서 구분이 지어진 실행 단위이다.
  • 만약에 프로세스가 여러 개 스레드로 구분되어져 있지 않다면 단일 스레드 하나로 프로세스가 실행되게 된다. 이 때의 실행단위는 프로세스 그 자체가 된다. 더 자세히 말하자면 해당 프로세스의 하나밖에 없는 스레드가 실행 단위가 되는 것이다.
  • 프로세스 내에서 스레드가 여러 개 나뉘어져서 실행 단위가 나누어지면 그것이 멀티 스레드가 되는 것이다. ex) 인텔리제이에서 테스트도 돌리면서 소스코드를 수정하기도 하고, 코드 수정하면서 추천 코드도 보여줘야 하고.. 한 어플리케이션에 대해 작업의 단위가 나누어지고 각각의 스레드가 그 작업을 담당한다

멀티 프로세스 (Multi-Process)

  • 프로세스는 독립적이기 때문에 IPC를 통해 통신을 해야 한다.
  • 자원 소모적, 개별 메모리 차지
  • Context Switching 비용이 크다
  • 하지만 개별적이기 때문에 동기화 작업에 신경을 덜 써도 된다

멀티 스레드 (Multi-Thread)

  • 스레드 간에 긴밀하게 연결되어 있음(공유자원이 많으므로)
  • 공유된 자원으로 통신 비용 절감
  • 공유된 자원으로 메모리를 효율적으로 관리
  • Context Switching 비용이 적다
  • 공유 자원에 대한 관리가 필요하다

멀티 프로세스를 사용하는 이유

  • 멀티 스레드를 이용하면 스레드 간에 연결이 긴밀하기 때문에 한 스레드, 즉 인터넷 사용 시 한 탭에 문제가 생기면 전체 프로세스가 먹통이 된다 ex) Internet Explorer는 작동 중지에 대한 오류가 많았음. 그런데 구글 크롬은 다소 비효율적인 부분이 있을 수 있지만 멀티 프로세서를 이용하기 때문에 멀티 탭 간에 영향을 덜 받음.
  • 다 장단점이 있다.

멀티 코어 (Multi-Core)

  • 멀티 코어가 아니면 멀티 프로세스나 멀티 스레드를 사용할 수 없는가?
  • 그러나 멀티 코어는 조금 다른 관점에서 바라보아야 한다. 멀티 프로세스나 멀티 스레드는 처리 방식의 일종이기 때문에 소프트웨어에 가깝고, 반면 멀티 코어는 하드웨어에 가깝다.
  • 멀티 코어의 특징 : 동시성과 병렬처리
  • 싱글 코어를 가진 cpu가 실행단위를 처리할 때는 동시에 여러가지를 진행하기 위해서 빠른 텀으로 전환이 되면서 실행됨(동시성). 동시에 일어나는 것처럼 보이게 하는 것임. 짧은 시간에 cpu의 시간을 분할해서 동시에 하는 것처럼 보이게 한다.
  • 하지만 멀티 코어는 병렬처리 즉 물리적으로 여러 코어를 사용해서 다수의 실행 단위를 한 순간에 동시에 처리할 수 있게 함.
  • 싱글코어 : 동시성 (Concurrency) - 하나의 코어에서 하나 이상의 프로세스 혹은 스레드가 번갈아 가면서 진행되지만 동시에 진행되는 것처럼 보이는 것
  • 멀티코어 : 병렬처리 (Parallelism) - 둘 이상의 코어에서 동시에 하나 이상의 프로세스 혹은 스레드가 한꺼번에 진행되는 것

번외 : Linux

  • 리눅스 (커널) 에서는 프로세스와 스레드를 동일하게 본다.
  • 스레드는 사용자 스레드와 커널 스레드로 나뉜다. 스레드의 레벨이 하나는 사용자 레벨이고 하나는 커널 레벨인 것이다.
  • 이 때 사용자 레벨에서 생성된 스레드와 커널 스레드 간에 어떤 연관 관계가 있고 여기에도 여러가지 모델이 있다.
  • 리눅스는 일대일 모델을 사용한다. 사용자 스레드 당 커널 스레드 하나가 매칭이 되어 있는 것이다. 그래서 리눅스 커널 입장에서 보면 각각의 스레드가 하나의 프로세스라고 표현하는 것이다.
  • 그런데 이 프로세스는 앞서 말한 프로세스, 즉 각각 다른 메모리를 가진 것과 조금 다르게 메모리를 공유한다(light weight process).

요약

  • 프로세스는 프로그램이 실행된 것이다.
  • 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위(작업 단위, 흐름 단위)이다.
  • 한 어플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스, 멀티 스레드)이 있다.
  • 동시에 실행이 되는 것처럼 보이기 위해서 실행 단위는 시분할로 cpu를 점유하며 context switching을 한다.
  • 멀티 프로세스는 독립적인 메모리를 갖고 있지만 멀티 스레드는 자원을 공유한다. 그것에 따른 각각의 장단점이 있다. ex) IE & Chrome
  • 멀티 코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것이다.
profile
Working Abroad ...

0개의 댓글

관련 채용 정보