Posts 스레드란?
Post
Cancel

스레드란?

스레드

스레드를 이해하기 위해서는 프로그램, 프로세스를 이해할 필요가 있다.

프로그램과 프로세스

프로그램은 파일이 저장 장치에 되어있지만, 메모리(RAM)에 올라가 있지 않은 정적인 상태이다.

  • 메모리에 올라가지 않았다는 것은 운영체제가 프로그램에게 독립적인 메모리 공간을 할당하지 않았다는 의미이다. 모든 프로그램은 운영체제가 자원을 할당해주어야 실행이 가능하다.
  • 정적인 상태라는 것은 아직 실행되지 않고 가만히 있다는 의미이다.

즉, 프로그램은 바탕화면에 저장된 .exe 파일이나 .dmg 파일을 사용자가 실행하기 전의 파일 그 자체이다. 프로그램은 실행되기 전에는 그저 코드 덩어리일 뿐이다.

프로그램이 실행되는 순간 프로그램은 운영체제에게 자원을 할당 받으며, 실행한 파일이 메모리에 적재된다. 이 상태를 동적인 상태라 하며, 동적인 상태의 프로그램을 프로세스라 한다.

프로그램과 프로세스를 그림으로 표현하면 다음과 같다.

1.png

정리하면, 프로그램은 코드 덩어리, 프로그램을 실행시킨 것이 프로세스다.

프로세스와 스레드

프로세스와 스레드의 사전적 정의는 다음과 같다.

  • 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
  • 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위

스레드의 등장 배경

과거에는 CPU 성능의 한계로 운영체제는 오로지 하나의 프로세스만 실행할 수 있었다. 즉, 게임을 다운받고 있으면 게임을 전부 다운받기 전까지 동영상을 재생하거나 음악을 듣는 것은 불가능 했다는 것이다.

하지만, 하나의 프로세스가 끝나기 전까지 다른 프로세스들이 기다리는 것은 비효율적이었다. 그래서 많은 작업을 동시에 수행하기 위해 여러 프로세스를 동시에 또는 병렬적으로 처리하는 방법이 등장했다.

하나의 CPU가 프로세스를 동시에 수행(concurrency)하는 것을 멀티 태스킹이라 한다. 사람 1명이 여러 가지 일을 조금씩 수행해나가는 것과 동일하다. 현재 처리하던 프로세스에서 다른 프로세스로 바꾸는 작업을 Context Switching이라 하는데, 이 과정이 사람이 인식하는 속도보다 빠르게 진행되다보니 각각의 프로세스를 조금씩 수행하는 것이 아닌 동시에 여러 프로세스를 처리하는 것처럼 보이는 것이다. 그림으로 표현하면 다음과 같다.

2.png

한편, 병렬적(parallelism)으로 프로세스를 처리하는 것은 CPU 하나에 여러 개의 코어가 각각 동시에 작업을 수행하는 것이다. CPU의 속도가 발열 등의 물리적 제약 때문에 예전만큼 빠르게 발전하지 못해서 대안으로 코어를 여러 개 달아서 작업을 분담할 수 있도록 한 것이다. 그림으로 표현하면 다음과 같다.

3.png

이처럼 하나의 CPU가 여러 프로세스를 동시적 또는 병렬적으로 수행할 수 있게 되었지만, 하나의 프로세스 안에서도 여러 일을 수행해야 하는 경우가 생기게 되었다.

예를 들어, 브라우저에서 게임을 다운 받는 사이에, 유튜브 영상의 데이터를 받아오면서 받아진 데이터로 영상을 실행할 수도 있어야 하는 것이다.

한 프로세스 안에서도 여러 갈래의 작업들이 동시에 실행되어야 하는데, 이 갈래를 스레드라고 한다.

한 프로그램을 처리하기 위한 프로세스를 여러 개 만들지 않는 이유는 운영체제가 안정성을 위해 프로세스는 각자 할당받은 메모리 내의 정보만 접근할 수 있도록 제약을 두고 있고, 이를 벗어나는 메모리에 접근하면 오류가 발생하기 때문이다.

4.png

컴퓨터는 프로세스마다 자원을 할당해서 처리하는데, 프로세스에게 할당된 자원을 여러 스레드가 공유해서 사용하면 속도와 효율적으로 처리할 수 있게 되는 장점이 생긴다.

하지만, 자원을 공유하기 때문에 생기는 단점도 존재한다. 예를 들어, 동일한 변수에 대해 여러 스레드가 동시에 접근해서 값을 변경하는 경우가 있다. N이라는 변수에 10이 저장되어 있는데, 변수 N에 대해 A 스레드는 +1 을 하고, B 스레드는 -1을 수행한다고 해보자. 과연 결과는 어떻게 될까? 두 스레드가 거의 동시에 접근했지만, 누가 먼저 접근했는지 보장할 수 없으므로 결과를 예측하는 것은 힘들다. 이처럼 여러 스레드나 프로세스가 공유자원에 동시에 접근하려고 할때 일어나는 경쟁 현상을 데이터 레이스(Date race)라고 한다.

이처럼 한정된 자원에 대해 동시에 접근했을 때 발생하는 문제를 해결하는 것은 복잡하며, 코드를 짜는 것도, 디버깅을 하는 것도 어려워진다. 하지만 이러한 문제를 해결하는 방식들(Closure, 함수형 프로그래밍 등)이 이미 존재하고 있다.

프로세스와 스레드는 무슨 차이일까?

운영체제는 프로세스에게 시스템 자원을 할당할 때, 독립된 메모리 영역에 Code, Data, Stack, Heap 으로 구분지어 할당한다. 그래서 각 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

5.png

하지만 스레드는 프로세스 내에서 메모리를 서로 공유하는데, 정확하게는 Code, Data, Heap 은 공유하고, 각각의 스레드는 별도의 Stack을 가지게 된다.

6.png

만약, 한 프로세스가 실행 중에 오류가 발생해서 강제로 종료된다면 다른 프로세스에 어떤 영향을 줄까? 프로세스 간에 공유하는 파일을 손상시키는 경우가 아니라면 아무런 영향이 없다.

참고자료

This post is licensed under CC BY 4.0 by the author.

[42Seoul] push_swap 구현 과정

프로그래머스 Level 1 - 콜라 문제 (JavaScript)