본문 바로가기
Computer Science/운영체제

[OS] 스레드와 동기화 문제란? (스레드 특징과 장단점, 동기화 문제, 멀티프로세스보다 멀티스레드를 사용하는 이유)

by 그적 2024. 1. 17.

목차

  • 스레드란?
  • 스레드 특징과 장단점
  • 동기화 문제란?
  • 스레드 구성 : TCB (Thread Control Block)
  • 프로세스와 스레드 비교
  • 멀티 프로세스와 멀티 스레드
  • 멀티 프로세스보다 멀티 스레드를 사용하는 이유

 


1. 스레드란?

스레드를 설명하기 전 프로그램과 프로세스의 차이를 설명하고, 프로세스에서 더 작은 작업의 단위인 스레드를 설명해보려 한다. 프로그램은 컴퓨터 디스크에 저장되어 있는 정적 프로그램이다. 프로그램을 실행시키고 싶다면 CPU에게 메모리를 할당받는데, 이것을 프로세스라고 부른다. 따라서 프로세스를 실행 중인 프로그램, 혹은 메모리에 올라간 프로그램으로도 부를 수 있는 것이다.

 

프로그램은 명령어들의 집합으로 구성되어 실행되는데, 스레드는 프로세스에서 실행 중인 명령어의 단위이다. 따라서 프로세스는 여러 개의 스레드로 구성될 수 있다. 방금 설명한 스레드는 제어 관점에서 실행에 대한 최소 단위를 이야기한 것이고, 자원 관점에서 자원을 이용하고 있는 소유자로서의 최소 단위를 설명하기도 한다.

 

  • (제어 관점) 명령어 실행에 대한 최소 단위
  • (자원 관점) 이용하고 있는 자원에 대한 최소 단위

 


2. 스레드 특징과 장단점

프로그램이 실행될 때 각 프로세스마다 고유의 메모리 영역을 할당받는다. 이때 스레드끼리 코드, 데이터, 힙 영역을 공유하고, 각각의 스레드는 별도의 스택을 가지게 된다. 스레드마다 고유의 자원(PC, 레지스터 집합, 스택)을 갖고 있는 이유는 각 스레드가 독립적으로 실행될 수 있도록 하기 위해서이다.

 

(특징)

  • 하나의 프로세스가 생성이 되면 하나의 스레드도 같이 생성이 되는데, 이를 메인 스레드라고 부른다.
  • 스레드는 코드, 데이터, 힙 영역을 공유하면서, 각 스레드마다 별도의 스택 공간을 가진다.
  • 스레드마다 PC, 레지스터 집합, 스택과 같은 고유의 자원을 갖는다.
  • 하나의 프로세스는 여러 개의 스레드를 가지며, 여러 스레드를 병렬적으로 처리할 수 있다. (= 멀티 스레드)

(장점)

  • 응답성 향상 : 일부 스레드가 지연되어도 다른 스레드는 작업을 이어갈 수 있다.
  • 경제성 : 자원을 공유하기 때문에 자원 할당 비용과 Context Swithing 비용이 적게 든다.
  • 효율성 : 자원을 공유하기 때문에 불필요한 중복된 자원을 막을 수 있다.
  • 동시성 : 여러 스레드를 처리할 수 있기 때문에 CPU가 처리할 수 있는 작업이 많아진다.

(단점)

  • 스레드 간의 상호 간섭 : 하나의 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.
  • 동기화 문제 : 여러 스레드가 공유된 자원을 사용할 때 동기화 문제가 발생한다.
  • 성능 저하 : 프로세스의 Context Swithing 비용보다는 적지만, 스레드 역시 해당 비용이 발생한다.

 


3. 동기화 문제란?

앞서 스레드의 가장 큰 특징으로 코드, 데이터, 힙 영역을 공유한다고 이야기했다. 만약 동시에 여러 스레드가 하나의 자원에 접근하게 된다면 어떻게 될까? 스레드마다 각기 다른 값으로 데이터에 대한 변경이 발생하고, 데이터의 일관성이 깨지게 된다. 이러한 상황을 경쟁 상태 (Race Condition)라고 부른다.

 

결국 경쟁 상태를 막기 위해 프로세스나 스레드가 공유하는 자원들의 일관성을 보장하는 것이 동기화(Synchronized)이며, 멀티 프로세스나 멀티 스레드 상황에서 동기화 문제를 해결하는 기법들이 필요한 것이다.

 


4. 스레드 구성 : TCB (Tread Control Block)

각 프로세스는 PCB (Porcess Control Block)이라는 프로세스 정보를 갖고 있다. 스레드 또한 각 스레드마다 TCB (Tread Control Block)를 갖고 있으며, PCB와 TCB는 링크드 리스트 형태로 연결되어 있다. 스레드 상태 정보, 스레드 ID, 우선순위, 스케줄링 정보를 저장하며, 스레드 실행이 끝나면 자동으로 메모리 할당이 해제된다.

 


5. 프로세스와 스레드 비교

  프로세스 스레드
  실행 중인 프로그램의 단위 프로세스에서 명령어 실행의 단위
공유 자원 프로세스끼리 메모리를 공유하지 않음 스레드끼리 메모리(코드, 데이터, 힙)를 공유함
PCB/TCB PCB (프로세스 상태, PID, PC, Register, Memory) TCB (스레드 상태, TID, PC, Register)
장점 하나의 프로세스에 문제가 생겨도
다른 프로세스에 영향을 끼치지 않는다.
스레드 교체가 일어나는 Context Swithing에
발생하는 비용이 상대적으로 작다.
단점 프로세스 교체가 일어나는 Context Swithing에
발생하는 비용이 크다.
하나의 스레드에 문제가 생기면
다른 스레드에도 영향을 끼친다.
단점 자원을 공유하지 않기 때문에
별도의 IPC 통신이 필요로 하다.
자원을 공유하기 위해
동기화 문제에 대한 처리가 필요로 하다.

 


6. 멀티 프로세스와 멀티 스레드

멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 작업을 수행하도록 하는 기법이다. 각 프로세스는 독립된 메모리 영역을 할당받으며, 서로에게 영향을 끼치지 않는다. 만약 서로에게 필요한 자원을 사용하기 위해서는 IPC를 사용해야 한다.

 

멀티 스레드는 하나의 프로세스에 여러 개의 스레드로 구성하여 동시에 실행될 수 있도록 하는 기법이다. 각 프로세스에게 할당된 메모리 영역 중 코드, 데이터, 힙 영역을 공유하기 때문에 스레드끼리 빠른 병렬처리가 가능하다. 하지만 이 때문에 자원에 대한 동기화 문제가 발생하기도 하고, 하나의 스레드에 문제가 생기면 다른 스레드 또한 영향을 받는 단점이 있다.

 


7. 멀티 스레드를 사용하는 이유

1) 응답성 향상

 : 코드, 데이터, 힙 영역을 공유하기 때문에 통신에 대한 부담이 적다.

 

2) 시스템 처리량 증가

 : 스레드를 교체할 때 발생하는 Context Swithing 비용이 작아 빠른 처리가 가능하다.

 

3) 자원 효율성 증가

 : 각 독립된 공간을 할당하는 프로세스 생성(시스템 콜)이 줄어 중복된 자원의 생성을 막는다.

 

결과적으로 멀티 프로세스와 비교했을 때 Context Swithing 과정에서 발생하는 비용이나 불필요한 자원 소모가 줄어든다. 따라서 멀티 스레드를 이용해야 하고, 이를 위해 동기화 문제를 잘 해결해야 한다.

 

댓글