Process와 Thread
공부 배경
‘프로그램… 프로세스… 스레드…‘
‘멀티 프로세스, 멀티 스레드 모두 멀티 태스킹과 관련된 것 같은데 맞는 걸까?
개발 공부를 하며 정말 많이 들어봤지만 정확한 개념이 정리되어있지 않은것 같았다. 이번기회에 개념을 확실하게 정리하고 공부해 보겠다.
프로그램(Program) 과 프로세스(Process)
프로그램: 코드가 구현되어 있는 파일, 코드 파일
프로세스:프로그램을 실행시켜 사용하는 것.
프로그램이 프로세스가 되면서 어떤일이 일어날까?
- 프로세스가 필요로 하는 재료들이 메모리(Memory)에 올라간다
여기서 재료는Code
,Data
,Heap
,Stack
이 해당된다.
- 해당프로세스에 대한 정보를 담고 있는 PCB블럭이 프로세스 생성시 함께 만들어진다.
PCB 블럭
프로세스(Process) 와 스레드(Thread)
프로세스와 스레드의 차이를 알아보기에 앞서, 동시성의 개념을 살펴보자.
동시성
동시성이란? 한순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는것 처 럼 보이는 것.
평소의 우리를 예로 들어보자. 나는 컴퓨터 게임을 할 때를 예로 들어보겠다.
나는 평소에 게임을 하기위에 컴퓨터를 켜면, Youtube
에서 노래를 틀고, 축구 게임을 하기 위해 FC Online4
를 켠다. 또, 친구들과 연락을 하기 위해서 카카오톡
켜 놓는다.
이처럼 우리는 하나의 프로세스를 사용하기 보다는 여러가지를 동시에 사용하고 싶어한다. 하지만, 우리는 동시에 사용하고 있는 것이 아니다.
CPU는 한순간에 한가지 일만 처리하도록 설계되어있다. 즉 한 프로세스가 실행되면, 그 프로세스는 CPU를 점유하게 되어 다른 프로세스가 실행 될 수 없다.
그런데도 어떻게 우리는 동시에 사용한다고 느끼게 될까?
우리가 여러개의 프로세스를 사용할 때, CPU에서는 하나의 프로세스가 실행상태에 있으면 다른 하나는 실행 준비상태로, 그 다른 하나가 실행상태에 올라오면 원래있던 다른 하나를 실행 준비상태로 스위칭 시키는데, 이를 컨텍스트 스위칭(Context Switching)이라고 한다. 이런 컨텍스트 스위칭이 시분할로 즉, 매우 짧은 텀을 반복하며 실행되기 때문에 우리는 여러 프로그램을 동시에 사용하고 있다고 느끼게 되는 것이다. 그리고 이것이 바로 동시성이다.
그렇다면 이제 프로세스와 스레드에 차이에 대해 알아보자
프로세스 vs 스레드
프로세스와 스레드는 한 애플리케이션에 대한 두가지 다른 처리 방식이다.
우선 스레드는 경량화된 프로세스 버전이다. 스레드는 Code
, Data
, Heap
영역을 공통된 자원으로 사용한다. 이는 Multi-Process와 Multi-Thread의 차이로 이해하기 쉽다.
Multi-Process vs Multi-Thread
Multi-Process | Multi-Thread |
---|---|
별개의 메모리를 사용하기 때문에, 각 프로세스는 독립적이다. 동기화 작업이 필요없다. | Code ,Data ,Heap 영역을공통된 자원으로 사용한다. 즉, 컨텍스트 스위칭이 일어날 때, 캐싱 적중률이 올라간다 쉽게 말해 다 빼고 다 넣고가 아닌, 일부만 넣고 뺀다. 공유 자원 관리가 필요하다. |
IPC를 사용한 통신 | 공유된 자원으로, 통신 비용이 절감된다. |
개별 메모리를 차지하기 때문에, 자원 소모적이다. | 공유된 자원으로, 메모리 효율적이다. |
컨텍스트 스위칭 비용이 크다 | 컨텍스트 스위칭 비용이 적다. |
프로세스가 다수의 스레드(Multi-Thread)로 구분되어 있지 않다면 👉 단일 스레드 = ‘프로세스’그 자체가 된다.
Multi-Core
프로세스와 스레드는 처리 방식의 일종이기 때문에 소프트웨어 분야*에 가깝고,
멀티 코어는 하드웨어 측면에 가깝다.