0. 🚶들어가며

 프로세스와 스레드 3편입니다. 이번 글에서는 프로세스와 항상 같이 나오는 개념인 스레드(Thread)에 대해 알아보겠습니다.


1. 📕스레드의 개념

1) 스레드의 정의

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위이다.

 이전 글에서 살펴보았듯 CPU를 할당받은 프로세스는 작업을 수행합니다. 이때 CPU가 처리하는 작업 단위가 프로세스로부터 전달받은 스레드(lightweight process)입니다. 집을 짓는 작업을 프로세스로 비유하면 스레드는 집을 짓는 세부 작업들인 설계, 공사, 인터레어 정도로 비유할 수 있습니다.

 

 위 글만 보면 프로세스와 스레드가 어떤 차이인지 감이 잘 오지 않습니다. 따라서 프로세스와 스레드의 차이점에 대해 더 살펴보겠습니다.

2) 프로세스와 스레드의 차이

 프로세스끼리는 약하게 연결되어있는 반면 스레드끼리는 강하게 연결되어 있습니다. 이 말이 무엇이냐.. 스레드는 프로세스 내부에서 존재하며 스레드끼리는 자원을 공유하고 있습니다.

 

좀 더 자세히 살펴보죠..

 

 프로세스 간의 관계를 예로 들면 크롬 브라우저 작업을 하며 워드 작업을 하는 경우가 있습니다. 멀티 태스킹의 상황이죠. 이때 크롬이 문제가 생겼다고 워드 작업에 문제가 생기는 경우는 거의 없습니다. 프로세스끼리는 약하게 연결되어 있기 때문입니다. 또한 프로세스 간의 통신은 IPC(Inter Process Communication)를 사용하는데 이에 대한 내용은 추후 다뤄보도록 하겠습니다.

 

 반면 스레드의 관계는 워드 프로세스 내에서 문서 편집, 맞춤법 검사, 그림판 등의 작업을 동시에 하는 경우로 예를 들 수 있습니다. 이러한 상황을 멀티 스레드라고 합니다. 워드 내에서 문서 편집을 하다 문제가 생겼을 때 워드 전체에 문제가 생기는 경우는 종종 있습니다. 이는 워드 프로세스 안에 스레드끼리 강하게 연결되어있기 때문입니다.

 

 메모리 관점에서 다시 살펴보면 스레드끼리는 프로세스에 할당된 메모리 중 코드, 데이터 영역 등을 공유하고 있습니다. 스택 부분만 각 쓰레드가 별도로 가지고 있게 되는 것이죠. PCB에서는 Program Counter, register set 정도를 쓰레드 별로 가지고 있구요!

 

 프로세스 내에 여러 개의 스레드가 존재할 수 있는 것이고 이를 멀티 스레드라고 합니다.

3) 스레드 관련 용어

 멀티 스레드에 대해 더 알아보기 전에 용어정리를 먼저 하고 글을 나아가겠습니다. 운영체제에서는 멀티 스레드와 비슷해 보이는 용어들이 많아 헷갈리기 쉽습니다.

1. 멀티 스레드

 멀티 스레드는 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법입니다.

2. 멀티 태스킹

 멀티 태스킹은 이전 글에서도 살펴봤듯 운영체제가 CPU에게 작업을 줄 때 시간을 잘게 나누어 배분하는 기법(시분할 시스템)입니다. 이를 통해 우리는 컴퓨터를 사용할 때 동시에 여러 개의 작업을 한다라는 느낌을 받을 수 있습니다.

3. 멀티 프로세싱

 멀티 프로세싱은 CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경입니다. 이전 글에서는 싱글코어를 가정하며 글을 작성했는데 CPU가 여러 개라면 실제로 동시에 여러 작업을 수행할 수 있습니다.


2. 📗멀티 스레드의 구조와 예

 아래의 그림을 보면 멀티 태스킹과 멀티 스레드의 구조를 확인할 수 있습니다.

 비슷한 작업을 하는 프로세스 두 개를 실행시킨다고 가정해봅시다. 이때 프로세스 두 개를 만들어 실행시키는 것이 그림 좌측에 멀티 태스킹입니다. 하지만 두 프로세스의 정적 영역(코드, 데이터 등)이 같다면 중복되는 부분이 생기고 여기서 비효율이 발생할 수 있습니다.

 

 따라서 우측과 같이 멀티 스레드 방식을 사용하기도 하는데 멀티 스레드에서는 하나의 프로세스 내에 여러 개의 스레드를 만들어 정적 영역을 공유하게 됩니다. 이런 맥락에서 스레드를 가벼운 프로세스라고도 부릅니다.


3. 📘멀티 스레드의 장단점

1) 장점

 - 멀티 스레드 구조에서도 살펴본 바와 같이 멀티 스레드를 사용하면 프로세스 내 공유 가능한 부분을 중복 생성하지 않아 효율적입니다. 또한 모든 스레드가 자원을 공유할 수 있어 작업을 원활히 진행할 수 있습니다.

 

  - 응답성 역시 향상시킬 수 있습니다. 한 예로 동영상 플레이어를 생각해봅시다. 동영상 플레이어는 재생 파일을 저장장치에서 가져오는 입출력 부분과 가져온 데이터를 화면에 재생하는 재생부로 나뉠 수 있습니다. 이때 싱글 스레드를 사용하면 프로세스가 입출력 요청 시 대기 상태에 빠지게 됩니다. 이러면 화면 재생부에도 영향을 미칠 수 있겠죠. 따라서 두 작업을 멀티 스레드로 구분하여 입출력과 상관없이 재생부에 대한 작업을 할 수 있게 해 준다면 응답성을 향상시킬 수 있습니다. 즉, 하나의 스레드가 Wait 상태인 경우에도 동일한 태스크 내의 다른 스레드가 Running 상태가 되어 일을 처리할 수 있는 것 입니다.

 

-  생성과 Context switch에 대한 오버헤드가 적습니다. 쓰레드를 생성하는 경우와 프로세스를 생성하는 경우를 비교할 때 쓰레드를 생성하는 경우가 Overhead가 훨씬 적습니다. 또한 Context switch Overhead 역시 쓰레드가 훨씬 적습니다.

 

2) 단점

 모든 스레드가 프로세스 내에서 자원을 공유하기 때문에 한 스레드에 문제가 생기면 이것이 프로세스 전체에 영향을 미치게 됩니다. 또한 모든 스레드가 프로세스 내의 자원을 공유하기 때문에 동기화 문제를 처리해주어야 합니다.


4. 💨나가며

 멀티 스레드 모델에 관련된 내용도 공부해보았지만 아직 와닿지 않는 것 같아 운영체제 전반을 다 훑어본 후 다시 정리하는 시간을 가져봐야할 것 같습니다.

 

 자바를 공부하며 스레드 부분에서 잠시 막혀있었는데  많은 도움이 된 배경지식이었습니다.

반응형
복사했습니다!