Process와 Thread 이야기
안녕하세요. 오늘은 Process와 Thread에 대한 이야기를 해보고자 합니다.
기술면접에서 가장 자주 등장하는 주제중 하나인데요. 대답하기 조금 어렵게 느껴지고 아무래도 멀티스레드 환경에서 프로그램을 짜는 경험이 상대적으로 많지가 않기 때문에 신입 혹은 첫 경력이직을 도전해보시는 분들께서는 선뜻 정확한 답을 내기가 어려운 주제인것 같습니다.
일단 단어들의 간단한 정의부터 보겠습니다.
용어정리
Program : 짜여진 코드들. 어떤 작업이 있고 해당 작업을 나타내는 실행 가능한 파일. 운영체제 위해서 동작할 수 있는 파일.
Process : 짜여진 Program 코드를 실행한 상태. 즉, Program을 실행하면 컴퓨터는 Process라는 실행흐름을 할당하여 작업을 처리한다.
Thread : 짜여진 Program을 실행하는 Process를 구성하는 여러가지 작업단위들. 소규모 실행단위.
Processor : 프로세스를 실행할 수 있도록 하는 하드웨어(e.g. CPU)
CPU(프로세서)는 한번에 하나의 프로세스만 처리할 수 있다. 그럼 컴퓨터의 멀티태스킹은 어떻게 가능한가?
우리는(개발자들) 흔히 유튜브를 보면서 코딩을 하거나 자신이 짠 코드를 실행하는 동안 다른 레퍼런스를 참조할 수 있는 활동을 할 수 있습니다.(구글링)
하지만 이는 실제로 CPU가 여러번 프로세스들을 왔다갔다 하면서 자원을 바꾸며 일을 하고 있습니다.(Context Switching) 우리는 그저 동시에 일어났다고 느끼고 있을 뿐입니다.
이는 CPU(프로세서)가 프로세스의 상태를 파악하며 여러번 작업을 왔다갔다 할 수 있는 것인데요. 이는 PCB(Process Control Block) 라는 공간에 저장된 데이터를 기반으로 처리됩니다.
A process control block (PCB) is a data structure used by computer operating systems to store all the information about a process. - 위키백과
PCB는 운영체제에서 프로세스에 대한 정보를 저장하기 위한 자료구조입니다. 프로세서는 현재 실행중인 모든 프로세스의 식별자를 기준으로 상태, 다음에 실행할 명령, 이전에 작업했었던 내용, 스케줄링정보(우선순위 등)와 같은 프로세스의 실행정보를 저장하고 CPU에 의해서 PCB에 있는 데이터를 기반으로 여러가지 프로세스를 마치 동시에 실행하듯이 바꿀 수 있게 되는것이죠.(이 부분은 매우 단편적인 설명이고 상당히 코어적인 부분이기 때문에 여기까지)
멀티 프로세스와 멀티 스레드
프로세스는 각각의 고유한 Stack, Heap, Data, Code 이라는 영역을 가지게 됩니다.
Stack - 호출된 함수 주소, 지역 변수 등 임시적인 공간
Heap - 동적으로 할당받은 영역. 동적으로 생성된 데이터들의 영역이다. (e.g. 생성자를 통한 객체생성)
Data - 전역변수 공간 static
Code - CPU에서 직접 수행되는 코드공간
멀티 프로세스 환경에서의 경우, CPU는 하나의 프로세스만 실행할 수 있고, 즉 하나의 프로세스의 자원영역만을 가진채 프로그램을 실행할 수 있지만 자주 왔다갔다 하는 환경이 구성되게 됩니다.
이렇게 왔다갔다 하는 행위, 즉 자원을 교체하는 행위를 Context Switching이라고 합니다.
멀티 프로세스의 경우, A 프로세스를 실행하다가 잠시 쉬고 PCB에 데이터를 적재한 후, B 프로세스를 실행시키기 위해서는 B 프로세스에서 가지고 있던 데이터들을 모두 가져와야 합니다.
CPU가 전체적인 프로세스의 자원을 바꿔주어야 하므로 context switching에서의 비효율이 상당합니다.(물론 하드웨어가 훌륭한 경우, 사용자는 느끼기 어렵습니다.)
이러한 프로세스의 비효율적인 문제점을 스레드라는 개념을 통해서 해결하게 됩니다.
스레드는 프로세스를 구성하는 여러가지 작은 작업단위 실행흐름 중 하나입니다. CPU내에서 관리되는 여러 프로세스가 각각 고유의 자원영역을 가지는 반면, 프로세스 내의 스레드들은 stack 영역을 제외한 세개의 영역(heap, data, code)은 공유하게 됩니다.
그로인해 적은 context switching의 비용과 응답의 효율성, 메모리 부하 등 여러가지 측면에서 멀티 프로세스보다 멀티 스레드의 이점으로 인해서 스레드에 대한 활용도가 올라가게 됩니다.
멀티 스레드와 멀티 프로세스의 특징
멀티 프로세스 | 멀티 스레드 | |
특징 | - 한 작업단위를 여러 프로세스를 활용하여 처리 - context switching 비용이 큼 - 하나의 프로세스가 문제가 생겨도 다른 프로세스에 영향을 미치지 않음.(Chrome 의 탭) - 예 ) Google Chrome |
- 프로세스의 자원을 공유하였기 때문에 빠른 응답성 - context switching 비용이 적음 - 자원을 공유하기 때문에 충돌 발생 가능(동기화 처리 필요) - 예 ) 웹서버 |