프로세스와 스레드의 차이
서론
프로세스와 스레드의 차이를 설명해보라고 하는건 면접에서 자주 등장하는 단골 문제입니다. 둘 다 비슷한 개념이고 어찌보면 하는일이 비슷하기 때문에 이를 확실하게 구분하여 알고있는지 면접관 입장에서는 물어보기 좋은 질문 중 하나여서 그런 것 같기도 합니다.
그럼 이렇게 혼동하기 쉬운 개념인 프로세스와 스레드는 뭐가 다른걸까요??
프로그램의 동작 방식
우리가 컴퓨터를 사용할 때, 당연히 하나의 프로그램을 사용하지 않습니다. 노래도 좀 틀어놓고, 브라우저로 웹서핑도 하면서 다른 프로그램 다운 받을게 있으면 다운받고, 이런식으로 여러개의 프로그램을 한번에 사용할 것입니다.
컴퓨터가 상용화되고나서는 이게 아주 당연한 일이고, 이게 불가능 하다면 애초에 컴퓨터가 상용화 됐을지가 의문일 정도로 중요한 기능인데요, 우리가 당연하다고 생각하는 이 기능은 사실, 초기의 컴퓨터에서는 불가능 한 기능이었습니다.
명령어 입력이 끝나야만 다른 작업을 할 수 있고, 프로그램을 다운로드 하면 다운로드가 끝나야만 다음 작업을 할 수 있고 이런 식이었죠. 지금 처럼 여러개의 프로그램을 한번에 컴퓨터가 수행 할 수 있는 것은 바로 멀티태스킹 덕분 입니다.
하나의 프로그램이 동작할때의 컴퓨터가 수행하는 작업의 단위를 프로세스라고 하는데요. 윈도우를 기준으로 .exe 확장자의 파일을 실행시키게 되면 컴퓨터는 해당 프로그램의 프로세스를 실행합니다.
윈도우의 작업관리자를 실행시켜보면, 현재 컴퓨터가 어떤 프로세스들을 실행하고 있는지 확인 할 수 있습니다.
하지만 멀티태스킹을 사용한다고 해서, 프로세서가 여러개의 프로세스를 동시에 실행하고 있는 것은 아닙니다. 하나의 프로세서는 반드시 하나의 프로세스만을 실행 할 수 있기 때문이죠.
그렇다면 컴퓨터는 어떠한 방식을 사용하길래 여러개의 프로세스를 동시에 실행하는 멀티태스킹이 가능한 걸까요??
프로세스
멀티 태스킹을 한다는 것은, 병렬적 혹은 동시적으로 이 프로세스를 실행하는 것을 뜻합니다. 기존에는 프로세스를 순서대로 하나씩 처리했다면, 여러개를 처리 할 수 있도록 하는 것이죠. 이 두 방법은 아래와 같이 프로세스를 처리합니다.
동시성 프로세스
먼저 동시성 프로세스는 프로세서 하나가 우리가 마치 동시에 움직이는 것으로 느낄 정도로 아주 빠르게 1번 프로세스 조금, 2번 프로세스 조금 이런식으로 마치 동시에 보이는 것처럼 여러 프로세스를 바꿔가면 조금씩 처리합니다. 이렇게 프로그램을 바꾸는 것 을 컨텍스트 스위칭 (Context Switching)이라고 하는데, 이 개념은 프로세스와 스레드를 설명하는 중요한 키워드이기 때문에, 따로 한번 더 자세히 설명하도록 하겠습니다.
작업 1과 작업 2가 있다면, 동시성 프로세스에서는 위 그림처럼 두 작업을 아주 빠르게 번갈아가면서 프로세스를 처리합니다.
병렬성 프로세스
병렬성 프로세스는 동시에 여러 프로세스들을 처리합니다. 우리가 cpu를 구매 할때 듀얼코어, 쿼드코어등의 제품들을 들어 본적이 있을 것입니다. 이는 말그대로 프로세스를 처리 하는 프로세서에 이를 처리하는 코어가 여러개 붙어있어서, 여러 프로세스를 코어마다 맡아서 조금씩 처리 할 수 있게 되는 것이죠.
위 그림을 보면 여러개의 코어가 하나의 프로세스 씩을 맡아 동시에 처리하고 있습니다. 어쩌면 실제로는 병렬성 프로세스가 동시성이란 말에 더 가깝다는 생각도 조금 드네요.
그럼 프로세스를 이해했으니, 이제 스레드에 대해서 이해해보록 합시다. 스레드가 왜 다른 개념으로 프로세스와 구분되어 있는지를 이해하기 위해서는 먼저 아까 등장했던 컨텍스트 스위칭에 대해서 알아야 합니다.
컨텍스트 스위칭
앞서서 프로세스가 엄청난 속도로 작업을 바꿔가며 마치 동시에 작업을 실행하는 것처럼 보이게 할때, 이 프로세스에서 다른 프로세스로 작업을 변경하는 것을 컨텍스트 스위칭이라고 한다고 했습니다.
우리가 프로그램을 실행하게되면, 프로세스에 필요한 요소들이 메모리에 올라가 공간을 차지하게 됩니다.
메모리는 4가지 영역으로 나누어져 있는데, 아래와 같습니다.
Code | Data | Heap | Stack |
---|---|---|---|
실행 명령을 포함하는 코드들 | Static 변수 혹은 Global 변수 | 동적 메모리 영역 | 지역변수, 매개변수, 반환 값 등등 일시적인 데이터 |
어떤 프로세스가 실행 되려면 해당 프로그램의 정보들이 위에서 설명한 메모리의 영역들을 차지해야만 프로세스가 실행 가능합니다.
또, 프로세스를 여러개 바꿔가면서 실행하려면, 작업 1에서 작업 2를 진행하고 다시 작업 1로 갈때, 아까 전 작업때 어느정도 작업을 처리 했는지, 정보를 기록해놔야 다시 이어서 작업을 할 수 있을 것입니다. 따라서 프로세스 컨트롤 블럭 (Process Contorl Block), PCB라는 특정한 프로세스를 관리하기 위해 필요한 정보를 담아 저장합니다.
- Pointer
프로세스의 현재 위치를 저장하는 포인터 정보입니다.
- Process State
프로세스의 각 상태 (생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated))를 저장합니다.
- Process Number (PID)
모든 프로세스에는 프로세스 식별자를 저장하는 프로세스 ID 또는 PID라는 고유 한 ID가 할당됩니다.
- Program Counter
프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장합니다.
- Registers
누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보입니다.
- Memory Limits
이 필드에는 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보가 포함됩니다. 여기에는 페이지 테이블, 세그먼트 테이블 등이 포함될 수 있습니다.
- List of open files
이 정보에는 프로세스를 위해 열린 파일 목록이 포함됩니다.
따라서 컨텍스트 스위칭을 한번 하기 위해서는, 이전 작업의 PCB를 불러오고, 메모리 공간을 비운 뒤 새로 작업할 프로세스가 필요한 정보를 다시 메모리 공간에 할당하는 작업들이 필요한 것입니다.
그렇기 때문에 당연히 컨텍스트 스위칭이 많으면 많을수록, 시간과 비용이 많이 소모됩니다.
만약 이 과정을 줄일 수 있다면, 훨씬 효율적으로 멀티태스킹이 가능 할 것입니다. 이러하니 비효율을 줄이기 위해 등장한 것이 바로 스레드입니다.
스레드
만약 프로세스 내에서 로그인을 처리한다고 가정해봅시다.
하나의 로그인을 처리하는 건 하나의 프로세스로 가능 하겠지만, 로그인이 만약 여러개가 한번에 들어온다면 어떻게 될까요??
프로그램을 하나 실행시키면 무조건 해당 프로그램에서의 작업은 하나의 프로세스가 모두 처리 하는 것이 아닙니다. 프로세스 안에서도 처리해야할 일이 여러개라면, 프로세스가 자신과 똑같은 프로세스를 fork()하여 (복제하여) 자식 프로세스를 만들어서 또 다시 컨텍스트 스위칭을 해가며 일을 처리합니다.
이렇게 만들어서 처리한다면 어떻게 될까요?
같은 로그인 작업인데도, 다른 프로세스로 처리되기 떄문에 어차피 같은 작업을 해야하는데 또 메모리를 정리하고 새로운 PCB를 가져오게 되기 때문에 컨텍스트 스위칭 때마다 많은 자원과 시간이 소모됩니다.
이러한 비효율을 개선하기 위해 사용하는 것이 바로 스레드입니다.
스레드는 한 프로세스 내에서 일어나는 작업들이 공통으로 필요로하는 부분은 컨텍스트 스위칭할때 굳이 바꾸지 않습니다. 예를들어 책상에서 공부를 하다가 다른 과목으로 바꾸려고 한다면, 기존의 프로세스는 책뿐만 아니라 연필 지우개 독서대등을 모두 다시 갖다놓고 다시 가져왔다면, 스레드는 책만을 바꾸고 어차피 또 사용할 연필이나 지우개, 독서대등은 그대로 냅두고 책만 바꾸는 것이죠
아래 그림을 보면, Code와 Data, Heap 공간은 어차피 모두 공통으로 사용하기 때문에 다 함께 공유하고, Stack만을 바꿔가면서 컨텍스트 스위칭을 하고 있는 것을 볼 수 있습니다.
이렇게 하면 훨씬 효율적으로 작업을 수행할 수 있기 떄문에, 기존 멀티 프로세스 방식에서 낭비 되던 자원과 시간을 절약할 수 있을 것 입니다.
마무리하며…
이렇게 간단하게 프로세스와 스레드의 차이점에 대해서 공부해 보았습니다. 언뜻보면 비슷한 개념이지만, 왜 스레드가 필요하게 되었는지를 알고나면 보다 명확하게 이 두 개념을 구분할 수 있을 것입니다.
면접 단골 질문인 만큼, 잘알아두고 혹여나 면접에서 물어본다면 기쁜 마음으로 설명해보도록 합시다.
댓글남기기