Technology/Computer Architecture

프로세스 vs 스레드 그리고 멀티 태스킹 vs 멀티 스레드

ikjo 2022. 9. 19. 16:20

프로세스와 스레드

자바 스터디의 일환으로 자바의 멀티 스레드 프로그래밍을 학습하던 중 이를 다루기 위해서는 앞서 프로세스와 스레드의 차이 그리고 더 나아가서 멀티 태스킹과 멀티 스레드의 차이에 대해 명확히 알아야 할 필요성을 느꼈다. 우선 프로세스와 스레드의 차이에 대해 알아보자.

 

프로세스란?

먼저 프로세스란 무엇일까? 일반적으로 프로그램은 저장장치(하드디스크 등)에 저장되어 있는 정적인 상태(코드로 구성된 파일)을 뜻하는 반면, 프로세스는 실행 중인 프로그램(동적인 상태)으로서 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 뜻한다.

 

참고로 프로그램이 실행 시에는 운영체제가 실행에 필요한 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성 및 부여하고, 작업에 필요한 메모리 영역을 확보한 후 준비된 프로세스를 준비 큐에 삽입하는 등의 일련의 작업들을 수행한다. 이처럼 프로세스는 운영체제 입장에서의 작업 단위(task)이다. 이때 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 스레드로 구성되는데, 모든 프로세스에는 최소한 하나 이상의 스레드가 존재한다.

 

스레드란?

앞서 언급한 프로세스라는 개념은 최초 운영체제를 설계하던 당시에 만들어졌다고 한다. 초기의 운영체제에선 작업의 단위가 프로세스 하나뿐이었기에, 스레드의 개념이 없고 사실상 1개의 스레드를 가진 프로세스만 있었던 셈이었다.

※ 이처럼 스레드가 1개인 일반 프로세스를 무거운 프로세스라고 한다.

 

이후 '멀티 코어 CPU'가 생겨나면서 운영체제가 '멀티 스레드'를 지원하기 시작했지만 이러한 상황에서 프로세스에 하나의 스레만 있다면 여러 코어에 나누어 동시에 작업하는 것이 불가능했다. 이를 위해 현대의 운영체제는 프로세스를 다양한 스레드로 나누어 여러 개의 코어로 배분함으로써 시스템의 효율성을 높이고 있다.

 

이때 스레드란 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위를 뜻하는데, 프로세스의 자원을 이용해서 실제로 작업을 수행하는 역할을 하며 운영체제(CPU 스케줄러)가 CPU에 작업 요청을 하는 실행 단위(operation)이기도 하다. 즉, CPU 입장에서의 작업 단위는 '스레드'인 것이다.

※ 스레드는 경량 프로세스라고도 한다.

 

멀티 태스킹과 멀티 스레드

프로세스와 스레드의 차이를 다루었으니 이제 멀티 태스킹과 멀티 스레드의 차이에 대해서도 알아보자.

 

멀티 태스킹이란?

멀티 태스킹은 운영체제가 CPU에 작업(스레드)을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 이처럼 여러 스레드에 시간을 잘게 나누어주는 시스템을 '시분할 시스템(time-sharing system)'이라고도 한다. 운영체제의 이러한 멀티 태스킹 지원으로 사용자 입장에서는 여러 개의 프로세스들이 '마치 동시에' 실행되는 것처럼 보이게 된다. 하지만 CPU의 코어(core)는 한 번에 단 하나의 작업만 수행할 수 있으므로, 실제로는 아주 작은 시간으로 분할되어 실행되는 것일 뿐이다.

 

멀티 태스킹의 장점

이러한 멀티 태스킹의 예로는 크롬(웹 브라우저)가 있다. 크롬의 경우 창을 여러개 띄워 작업을 동시에 진행하곤하는데, 창이 새로 생길 때마다 fork() 시스템 호출을 통해 부모와 똑같은 프로세스(자식 프로세스)를 생성하도록 한다. 

 

이때 각 프로세스(크롬 탭)는 독립적이기 때문에 특정 프로세스에 문제가 생겨도 다른 프로세스에는 영향을 주지 않는다. 이와 대조되는 것으로 멀티스레드로 구현된 인터넷 익스플로어의 경우에는 여러 창을 띄워도 모두 하나의 프로세스 내에서 동작하기 때문에 특정 창에서 발생한 문제가 다른 창에 영향을 주게 된다.

 

※ 프로세스끼리는 약하게 연결되어 있는 반면 스레드끼리는 강하게 연결되어 있다는 것을 기억하자!

 

멀티 태스킹의 단점

하지만 fork() 시스템 호출은 부모 프로세스를 복사하는 작업으로, 소요되는 시간도 많을 뿐더러 코드 영역이나 데이터 영역의 일부가 메모리에 중복적으로 존재하는 등의 낭비적인 요소가 많다. 

 


멀티 스레드란?

멀티스레드는 앞서 멀티 태스킹의 낭비적인 요소를 개선코자 나온 것으로, 운영체제가 하나의 프로세스 내 작업을 여러 개의 스레드로 분할하는 '프로세스 운영 기법'이다. 이를 통해 하나의 프로세스 서비스를 운영함에 있어서도 다수의 요청을 처리할 수 있게 되는데, 대표적으로 웹 서버 프로그램이 있다.

 

만일 싱글 스레드로 서버 프로그램을 작성하면 사용자의 요청마다 새로운 프로세스를 생성해야할 것이다.(혹은 앞선 사용자가 사용을 마칠 때까지 대기) 하지만 앞서 언급했듯이 프로세스를 생성하는 것은 스레드를 생성하는 것에 비해 더 많은 시간과 메모리 공간을 필요로하는 작업이다.

 

멀티 태스킹의 단점을 극복한 멀티 스레드

이때 멀티 스레드로 서버 프로그램을 작성하면 코드나 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상시킬 수 있을 뿐만 아니라, 공유되는 자원이 있기에 멀티 태스킹 대비 컨텍스트 스위칭이 일어날 때 캐싱 적중률이 상승하는 효과도 있을 수 있다.

 

또한 사용자의 여러 요청을 동시에 처리할 수 있는데, 특정 사용자의 요청을 처리하는 스레드가 입출력으로 인해 작업이 진행되지 않더라도, 다른 스레드가 작업을 계속함으로써 사용자의 작업 요구에 빨리 응답할 수 있게 되는 것이다. 더욱이, 2개 이상의 CPU를 가진 컴퓨터에서 멀티 스레드를 사용 시 CPU 사용량 증가와 함께 프로세스 처리 시간을 단축시킬 수도 있다. 

 

이처럼 둘 이상의 쓰레드를 가진 프로세스를 '멀티쓰레드 프로세스'라고 하며, 각각의 스레드들은 작업을 수행하기 위해 개별적인 메모리 공간(호출스택 등)을 필요로 하기에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정된다.

 

멀티 스레드의 단점

하지만 멀티 스레드 역시 장점만 있는 것이 아니다. 일단 멀티 스레드가 무조건 싱글 스레드 보다 좋은 것만은 아니다. 예를 들면, 단순히 CPU만을 사용하는 계산 작업 같은 경우에는 멀티 스레드 보다 싱글 스레드로 프로그래밍하는 것이 더 효율적이다. 왜냐하면 멀티 스레드의 경우 컨텍스트 스위칭(context switching, 작업 전환)이 발생하여 시간이 더욱 걸리기 때문이다.

 

아울러, 모든 스레드가 자원을 공유함으로써 자원의 중복 사용을 절감할 순 있으나, 이로 인해 동기화(synchronization) 작업을 처리해주어야 하며, 더 나아가서는 교착 상태(dead lock), 기아 현상(starvation), 경쟁 상태(race condition) 등의 문제를 해결해주어야 한다. 즉, 멀티 스레드로 프로그램을 구현하는 것은 난이도가 높다.

 

결국엔 개발자가 직접 특정 작업별로 그리고 특정 절차에 따라 여러 개의 스레드가 생성되도록 하고 각 작업들을 처리해주도록 구현해야한다는 것이다.

 

이제 본격적으로 자바를 통한 멀티쓰레드 프로그래밍에 대해 알아보자.

 

 

참고자료

  • 도우출판 "자바의 정석"
  • 한빛미디어 출판 "쉽게 배우는 운영체제"
  • https://ko.wikipedia.org/wiki/프로세스
  • https://www.youtube.com/watch?v=1grtWKqTn50