🔎 [10분 테코톡] 코다의 Process vs Thread을 기반으로 작성하였습니다.
프로세스와 스레드를 공부하다 보면 헷갈릴 수 있는, 혼동하기 쉬운 용어들이 있다.
따라서 들어가기 앞서, 키워드를 먼저 정리하려고 한다.
키워드
- 실행 단위 : cpu core에서 실행하는 하나의 단위로, 프로세스와 스레드를 포괄하는 개념
- (부연 설명이 없는) 프로세스 : 하나의 스레드만 가지고 있는 단일 스레드 프로세스
- 동시성 : 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것
프로그램과 프로세스
모두가 좋아하는 음식인 피자를 예로 들어보자. 피자를 먹고 싶어서 피자 가게에 갔는데, 피자가 아닌 피자 레시피를 받는다면 어떨까?? 종이에 적힌 레시피는 피자일 수가 없다. 말이 안된다.
여기서 이 레시피가 우리가 열심히 구현하고 있는 코드 파일이고, 다른 단어로 프로그램이라고 한다. 하지만 이 프로그램 자체는 실행시키기 전에는 그저 코드가 구현되어 있는 파일일 뿐이다. 이것을 사용하기 위해 종이 레시피가 피자가 되는 것처럼 실행이 되어 사용할 수 있는 무언가가 되어야 하는데, 그것이 바로 프로세스이다.
즉, 프로세스는 프로그램이 실행된 것이다.
그렇다면, 프로그램이 프로세스가 되면서 어떤 일이 일어날까?
총 2가지 일이 일어나게 되는데, 간단하게만 알아보자.
- 프로세스 동작에 필요한 정보들이 메모리에 올라간다. (Code, Data, Heap, Stack 영역이 메모리 확보)
- 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 만들어진다.
먼저 프로세스가 구체적으로 어떻게 실행되는지 알아보기 전에, 멀리서 한 번 바라봐보자.
작업을 할 때를 예로 들어보면, 음악을 듣기 위해 유튜브도 켜놓고, 알림을 받기 위해 슬랙도 켜놓고, 검색을 위해 크롬도 켜놓고, 작업을 위해 터미널도 켜놓고, 카톡도 켜놓는다.
이처럼 대부분의 사람들은 하나의 프로세스만 사용하기 보다는, 여러 가지를 동시에 사용하고 싶어한다.
그러나 원래 한 프로세스가 실행되기 위해서는 CPU를 점유하고 있으면 다른 프로세스는 실행 상태에 있을 수 없다.
따라서 다수의 프로세스를 동시에 실행하기 위해 여러개의 프로세스를 시분할로, 즉 짧은 텀을 반복하면서 전환해서 실행을 시키도록 한다. 동시 실행하고 싶은 프로세스가, 서로 실행과 준비 상태를 번갈아가는 일련의 과정을, 매우 짧은 텀으로 반복하게 되는 것이다. 이러한 행위를 바로 컨텍스트 스위칭이라고 하며, 이는 굉장이 번거로운 작업이라고 할 수 있다.
Thread
그래서 등장하게된 것이 바로, 경량화된 프로세스 버전인 스레드이다. 스레드가 경량화된 프로세스인 것은, 다음과 같이 하나의 프로세스 안에 다수의 스레드가 있을 때 공유되는 자원이 있기 때문이다.
스레드는 Code, Data, Heap 영역을 공통된 자원으로 사용하고, 각 Stack 부분만을 따로 가지고 있는다. 공유되는 자원이 있기 때문에 이전처럼 컨텍스트 스위칭이 일어날 때 캐싱 적중률이 올라가게 된다. 즉, 앞서처럼 모든 영역을 모두 다 빼고 다시 다 넣을 필요가 없다는 것이다.
멀티 프로세스와 멀티 스레드에 대해 알아보기 전에,
먼저 멀티 프로세스와 멀티 스레드 두가지 개념이 모두 처리 방식의 일종이라는 것을 인지하고 넘어가자.
Multi-Process
멀티 프로세스란, 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 의미한다. 한 애플리케이션에서 여러 사용자가 로그인을 요청하는 상황이 있다고 가정해보자.
한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시에 처리할 수 없다. 그래서 부모 프로세스가 fork()
하여, 자식 프로세스를 여러개 만들어 일을 처리하도록 한다. 이때 자식 프로세스는 부모와 별개의 메모리 영역을 확보하게 된다.
Multi-Thread
멀티 스레드란, 하나의 프로세스에서 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것을 의미한다. 스레드는 한 프로세스 내에서 구분지어진 실행 단위이다.
만약 프로세스가 다수의 스레드로 구분되어있지 않다면, 단일 스레드는 하나로 프로세스가 실행된다. 이때 실행 단위는 프로세스 그 자체(=해당 프로세스의 하나 밖에 없는 스레드)가 된다. 프로세스 내에서 분리해서 여러 스레드로 나뉘어서 실행 단위가 나뉘어지면 멀티 스레드가 된다.
예로, 인텔리제이를 사용하면서 테스트도 돌리면서 소스코드도 수정해야한다면, 한 애플리케이션에 대한 작업의 단위가 나뉘게 된다. 이때 각각의 스레드가 각 작업을 담당하게 되는 것이다.
정리하면 다음과 같다.
Multi-Process
- 각 프로세스는 독립적 : 하나의 프로세스가 비정상 종료되더라도 다른 프로세스에 영향이 없다
- IPC를 사용한 통신 : 예) 서로 다른 회의실에서 얘기하다가 논의 할 일이 생기면 밖으로 나와서 얘기하고 다시 들어가는 방식
- 자원 소모적, 개별 메모리 차지
- 컨테스트 스위칭 비용이 큼
- 동기화 작업이 필요하지 않음 : 개별 독립적이기 때문
Multi-Thread
- 스레드 간 긴밀한 연결 : 하나의 스레드가 비정상 종료될 경우, 다른 스레드도 종료될 가능성이 있다
- 공유된 자원으로 통신 비용 절감 : 한 회의실에 앉아서 일을 처리하고 있기 때문에 논의할 일이 생기면 그냥 말만 걸면 된다
- 공유된 자원으로 메모리가 효율적
- 컨텍스트 스위칭 비용이 적음
- 공유 자원 관리가 필요함
- 동기화 작업이 필요
이렇게 봤을 때, 멀티 프로세스보다 멀티 스레드가 훨씬 좋아보일 수 있다. 그렇다면 왜 멀티 프로세스를 이용하는 것일까? 실생활 예시를 들어보자.
예전에 인터넷 익스플로러를 사용하다가 다음과 같이 오류 상황이 났던 적인 다들 한번 쯤 있을 것 같다.
여러개의 탭에 중요한 정보들을 띄워놓고 작업을 하다가, 이런 오류 화면을 만나면 속으로 제발을 몇번 외치다가 창 전체가 꺼져버린다. 이것은 멀티 스레드를 이용했기 때문이다. 긴밀하게 연결되어 있기 때문에 한 스레드, 한 탭에 문제가 생기면 전체 프로세스에 영향이 간다.
반면 구글 크롬은 다소 비효율적인 부분이 있을 수 있지만, 멀티 프로세스를 이용하기 때문에 멀티탭 간의 영향을 덜 받는다. 즉, 다 장단점이 있는 것이다.
Multi-Core
추가적으로, 멀티 코어에 대해서도 알아보자
Single-Core
싱글 코어를 가진 CPU가 실행 단위를 처리할 때는, 동시에 여러 가지가 진행되기 위해서 빠른 텀으로 전환되면서 실행된다. 이 개념이 바로 동시성이다. 빠르게 여러 실행 단위를 번갈아 실행하면서 동시에 일어난 것처럼 보이게 하는 것이다. 즉, 동시성은 짧은 순간에 cpu의 시간을 분할해서 동시에 하는 것처럼 보이게 한다.
- Concurrency(동시성) : 하나의 코어에서 하나 이상의 프로세스(혹은 스레드)가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것
Multi-Core
반면에 멀티 코어는 병렬 처리를 한다. 물리적으로 둘 이상의 코어를 사용해서 동시에 하나 이상의 프로세스(혹은 스레드)가 한번에 진행되게 하는 것이다.
- Parallelism(병렬 처리) : 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 스레드)가 한꺼번에 진행되는 것
Summary
- 프로세스는 프로그램이 실행된 것이다.
- 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이다.
- 한 애플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스, 멀티 스레드)이 있다.
- 동시에 실행이 되는 것처럼 보이기 위해서 실행 단위는 시분할로 cpu를 점유하며 context swiching을 한다.
- 멀티 프로세스는 독립적인 메모리를 가지고 있지만 멀티 스레드는 자원을 공유한다. 그것에 따른 각각의 장단점이 있다.
- 멀티 코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것이다.