Thread와 Process의 차이





기술면접 단골주제

  • Process와 Thread의 차이가 뭔가요? 
  • 그래서 멀티쓰레드 어플리케이션을 운영해본적 있나요?(웹서버 돌려봤으면 되는 있는 것)
  • 그래서 멀티쓰레드 어플리케이션을 만들어 봤나요? (threading 라이브러리 사용해서 데몬을 만들어봤다면 오케이! Python 기준)


ProcessThread
Process란 실행되는 그 어떠한 프로그램을 의미함
쓰레드는 프로세스의 한 부분이다.
프로세스는 생성시/종료시 시간이 더 많이 소요됨
쓰레드는 생성시/종료시 시간이 더 적게 소요됨
컨텍스트 스위칭에도 시간이 더 많이 소요됨
쓰레드는 컨텍스트 스위칭에 시간이 더 적게 걸림
프로세스는 리소스를 더 많이 잡아먹음
쓰레드는 리소스를 더 적게 사용함
독립적인 메모리에서 돌아감
공유 메모리에서 돌아감
프로세스는 '무거운 프로세스' 라고 불림
쓰레드는 "가벼운 프로세스" 라고 불림
프로세스 변경은 OS의 인터페이스를 사용함
쓰레드 변경은 OS를 호출하지 않고 커널을 건드리지 않음
만약 1번 서버 프로세스가 막히면 그 막힌 서버 프로세스가 해제될때까지 다른 서버 프로세스는 실행되지 않음
다른 서버 쓰레드가 막혀도 두번째 쓰레드가 같은 작업을 처리함
동적인 개념으로 실행된 프로그램
프로세스가 할당받은 자원을 이용하는 실행의 단위
할당받는 자원의 예 : CPU시간, 운영을 위한 공간주소, 코드, 데이터, 스택, 힙 으로 되어 있는 돌립 메모리 영역
쓰레드는 프로세스 내에 스택만 할당받고 코드, 데이터, 힙은 공유함
1 프로세스당 최소 1개의 메인 쓰레드를 가지고 있다.
프로세스 안에 여러 쓰레드가 존재할 수 있다.
프로세스가 다른 프로세스에 접근하려면 프로세스간의 통신(IPC)를 사용해야 한다(파이프, 파일, 소켓을 이용함). -커뮤니케이션이 불리함
어떤 쓰레드가 프로세스 자원을 변경하면, 다른 쓰레드 들도 즉시 알 수 있다. - 프로세스간 커뮤니케이션 보다 쓰레드간 더 유리함
  

** 컨텍스트 스위칭(Context Switching)

컨텍스트 스위칭이란, CPU에서 여러 프로세스를 돌면서 순차적으로 작업을 처리하는데 이것이 Context Switching 이다. 프로세스를 작업장 건물이라고 하고, 쓰레드가 그 안에 있는 워크벤치이라 가정하자. CPU는 작업자 이다. 작업자가 1번 워크벤치에서 일하다가 바로 옆에 2번 워크벤치에서 다시 일을 하고, 다시 1번으로 돌아오면? 1번 워크벤치에서 어디까지 했더라? 라고 기억해 내고 다시 시작하는 작업이 컨텍스트 스위칭이다.

프로세스의 컨텍스트 스위칭은 작업장 건물을 옮겨 다니며 더 많은 것을 기억해야 한다. 그 와중에 캐시 메모리 초기화와 같은 무거운 작업이 진행되면 오버헤드가 발생한다.

Multi-ProcessMulti-Thread
하나의 응용프로그램을 여러개의 프로세스로 구성한다.
1개의 응용프로그램을 여러개 쓰레드로 구성한다.
각 프로세스가 한개의 작업을 처리한다.
각 쓰레드가 한개의 작업을 처리한다.
다수의 프로세스중 한명이 사망해도 다른 프로세스로 영향이 전달되지 않는다.
하나의 쓰레드에 문제가 발생하면 전체 프로세스에 영향을 준다.
비교적 디버깅이 쉽다
디버깅이 어렵다.
크롬은 대표적인 멀티프로세스 브라우저 이다.
웹서버 응용프로그램은 대표적인 멀티 쓰레드 응용프로그램이다.
프로세스간 통신이 가능하다. (IPC)
다른 프로세스로 접근할 수 없다.


MultiThreading에는 단점도 많다.

  1. 설계를 잘해야함
  2. 왜냐. 자원공유문제나, 하나의 잘못된 쓰레드가 전체 프로세스의 영향을 주니까.
  3. 그리도 단일 쓰레드는 의미가 없다.


그럼에도 불구하고 MultiThread를 사용하는 이유는?

  1. 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
  2. 작업장을 돌아다니는 것보다 옆테이블로 옮기는것이 편하다.
  3. CPU레지스터 교체를 포함해서 RAM과 CPU사이에 캐시 메모리 초기화가 되어 오버헤드가 크다.
  4. 쓰레드는 스택 메모리 공유
  5. 그래도 스레드간 자dn공유는 전역변수를 이용하니까 충돌이 생길 수 있다. (그래서 설계를 잘하자)

  • [[a.original_name]] ([[a.file_size | fileSizer]])
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'컴퓨터공학' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]