본문 바로가기

Computer Science

[CS] 프로그램과 프로세스와 쓰레드의 차이점

반응형

이번 포스팅에서는 그동안 모르고 지나쳐왔던 프로그램, 프로세스, 쓰레드의 개념에 대해 알아보고 차이점이 각각 무엇인지에 대해서도 알아보자. 언젠간 한 번 정리해야 할 것 같아서 이번 기회에 정리해보려고 한다.

 

프로그램? 프로세스? 쓰레드?


1. 프로그램과 프로세스

프로그램과 프로세스간의 관계는 엄밀히 말하면 상호작용하는 관계(?)라고 볼 수 있을 것 같다. 우리는 바탕화면에 있는 메모장, 게임 앱, 워드 파일, 파워포인트 등을 프로그램이라고 한다. 그 중 내가 게임을 하려고 게임 앱을 클릭하는 순간, 그 게임은 프로그램에서 프로세스가 된다. 다시 말해 프로그램을 실행한 것을 프로세스라고 한다. 이를 도식화해서 정리하면 아래와 같다.

 

프로그램과 프로세스의 차이

 

위 그림을 보면서 하나씩 이해해보자. 우선 프로그램은 컴퓨터의 하드디스크라고 불리는 HDD(Hard Disk Drive)에 저장되어 있는 명령어와 데이터들로 구성되어 있다. 그리고 이 프로그램이 실행되는 순간 1개의 프로세스가 실행된다. 그래서 프로세스는 프로그램 자체와 프로그램 상태가 메모리 상에서 실행되는 작업 단위라고 정의한다.

 

프로세서라고 불리는 CPU는 한 번에 1개의 프로세스만 관리할 수 있다. 그런데 우리는 일상생활에서 컴퓨터를 할 때, 노래를 들으면서 과제를 하거나 하는 등 여러가지 일을 한 번에 처리할 수 있는 것처럼 보인다. 하지만 이는 사실 여러개의 프로세스를 사용은 하되 동시에 여러개의 프로세스를 운영하는 게 아니라 CPU가 순차적으로 나름의 우선순위(이를 스케쥴링이라고 함)에 따라 1번 프로세스 -> 4번 프로세스 -> 3번 프로세스 -> 다시 1번 프로세스 -> ... 등과 같이 순차적으로 프로세스들을 돌아다니면서 운영하는 것이다. 그런데 이렇게 CPU가 돌아다니는 속도가 매우 빠르기 때문에 우리 신체의 눈으로는 동시에 실행되는 것처럼 보이는 것이다.

 

이 때, 추가적으로 알고 넘어가는 PCB(Process Control Block)이라는 개념이 존재한다. 방금도 말했다시피 CPU라는 프로세서는 한 번에 하나의 프로세스만 관리한다고 했다. 그리고 순차적으로 다른 프로세스로 넘어갈 때 이전에 관리하고 있던 프로세스에 대한 정보를 저장해놓아야 한다. 이 때 저장하는 공간을 PCB 라고 한다. PCB에 대한 도식화를 표시하면 아래와 같다. 참고로 프로세스의 상태에는 여러가지가 있는데, 이에 대해서는 여기 블로그를 참고하자.

 

프로세스에서 프로세스로 넘어갈 때 PCB를 활용한다.

 

여기서 쓰레드라는 개념에 대해서도 추가적으로 알아보자. 왜냐하면 프로그램을 실행시킨 프로세스 내부에 쓰레드가 존재하기 때문이다. 쓰레드는 프로세스 내부에서 실행되는 흐름의 단위라고 정의한다. 보통 1개의 프로세스 내부에 1개의 단일 쓰레드가 존재하지만 프로세스가 실행하고 있는 프로그램 환경에 따라 2개 이상의 다중 쓰레드(멀티 쓰레드라고도 함)가 존재하기도 한다. 만약 다중 쓰레드일 때, 쓰레드들 간에 데이터와 명령어가 공유가 가능하다. 데이터와 명령어는 프로그램안에 존재하고 그 프로그램을 프로세스가 실행하고 있으니 프로세스 내부에 있는 쓰레드들은 당연히 그 프로그램의 데이터와 명령어에 접근이 가능하다.

2. 왜 쓰레드를 사용할까?

그렇다면 왜 쓰레드를 사용할까? 쓰레드들 사용하는 방법 말고는 여러개의 프로세스를 순차적으로 실행하는 멀티 태스킹을 사용할 수 있다. 하지만 만약 멀티 태스킹을 사용할 때, 어떤 A, B라는 프로세스 2개가 서로 동일한 데이터를 요구한다고 가정해보자. 그렇게 되면 멀티 태스킹은 A, B 프로세스를 위한 데이터 똑같은 것을 OS가 2개씩 할당할 것이다. 비효율적으로 보인다. 동일한 데이터를 요구한다면 1번만 할당받아서 A, B 프로세스가 동일한 데이터 1개를 공유하면 되지 않을까?

 

그래서 프로그래머들은 프로세스 생성  초기에 데이터를 공유하도록 해주자는 아이디어에서 쓰레드가 등장했다. 즉, 프로세스 내부에서 멀티 쓰레드 간 데이터를 공유하는 것을 가능하게 함으로써 메모리를 절약하게 된다. 또한 프로세스 간 전환하는 속도보다 쓰레드 간 전환하는 속도가 빠르다는 장점도 있다. 하지만 데이터를 전역 변수로서 공유한다는 점이 단점이 되기도 한다.

3. 멀티 프로세싱 VS 멀티 프로그래밍 VS 멀티 태스킹 VS 멀티 쓰레딩

4가지 모두 비슷한 단어이고 동의어 같다. 분명히 차이점이 존재한다. 하나씩 살펴보자.

3-1. 멀티 프로세싱

멀티 프로세싱은 CPU와 같은 프로세서를 떠올리면 된다. 즉, 2개 이상의 프로세서들이 협력을 하여 작업을 병렬적으로 동시에 처리하는 것을 의미한다. 그림으로 나타내면 아래와 같다. 그래서 가끔 머신러닝 라이브러리를 사용할 때 보면 multi_processing = True/False로 옵션을 줄 수 있는데, 이제야 무슨 말인지 이해가 간다..

 

출처 : https://doorbw.tistory.com/26

3-2. 멀티 프로그래밍

특정 프로세스 A가 있다고 가정하자. 이 때 CPU라는 프로세서가 작업을 처리하다가 이벤트가 발생해서 잠시 대기 상태에 있게 되었다. 그렇다면 이 프로세서는 대기하는 시간동안 리소스가 낭비된다. 이 때 멀티 프로그래밍이라는 개념이 등장하는데, 이 낭비되는 시간동안 해당 프로세서가 처리하고 있던 프로세스 A를 떠나 다른 프로세스를 처리해서 리소스를 효율화시키는 것을 의미한다.

3-3. 멀티 태스킹

위에서도 알아보았지만 멀티 태스킹은 여러개의 프로세스를 OS에서 설정한 스케쥴링에 따라 순차적으로 실행하는 것을 의미한다.

3-4. 멀티 쓰레딩

위에서 쓰레드는 프로그램을 실행시키는 프로세스 내부에 존재한다고 했다. 따라서 멀티 쓰레딩은 프로세스 내부에 쓰레드가 2개 이상 존재하여 그 다수의 쓰레드들 간에 데이터 자원을 공유해 해당 프로세스가 실행시키고 있는 프로그램을 병렬적으로 처리하는 것을 의미한다.

반응형