컴퓨터 시스템

[컴퓨터 시스템] 스레드

우디혜 2020. 10. 14. 21:51

스레드 ( Thread )

하나의 프로세스에 여러 개의 쓰레드 생성이 가능하다. 또한 동시에 여러 개의 쓰레드를 병렬적으로 실행할 수 있다. 프로세스 안에 있기 때문에 프로세스의 데이터에 모두 접근이 가능하기 때문에 자원을 효율적으로 공유할 수 있다. 쓰레드는 프로세스(가상 메모리) 내부에서 별도의 stack 영역, stack pointer 등을 포함하는 별도의 쓰레드 컨텍스트를 가진다. 이외에 Heap, bss, data, code 세그먼트는 모든 쓰레드가 공유하고 있다. (리눅스에서는 Light weight process라고도 불린다).

멀티 스레드 ( Multi Thread )

소프트웨어 병행 작업 처리를 위해 이용하는 기법이다. 프로세스를 여러개의 Thread로 분할하고 분할된 thread들을 병렬적으로 실행한다.

헷갈리지 말자

멀티 쓰레드는 쓰레드들을 병렬 실행하는 것이고 멀티 프로세스는 프로세스들을 병렬 실행하는 것이다. 주체가 다르다.

 

스레드 VS 프로세스

쓰레드 프로세스
프로세스의 subset 독립적
쓰레드 간에 자원 공유가 가능 각각 독립적인 자원을 가짐
주소 영역을 공유 사적 주소공간
별도의 통신 방식 X IPC 통신

스레드 장단점

(+) 효율적인 자원 활용 및 공유 · 응답속도 증가

IPC 통신을 이용하는 프로세스와 달리 별도의 기법없이도 스레드 간 통신이 가능하기 때문에 더 빠른 통신이 가능하다(응답속도 향상). 또한 프로세스와 달리 스레드 생성시 가상메모리를 새로 생성하는 등 별도의 메모리 할당 과정이 없기 때문에 시스템 리소스가 절약되어 메모리 효율성도 증가한다.

 

(-) 오버헤드 가능성

스레드 수가 많아지게되면 context switching 시간 또한 함께 증가하게되는데, 최악의 경우 스레드 처리 시간보다 스케줄링 시간이 더 소요되는 오버헤드가 발생할 수 있다.

 

(-) 스레드 하나의 문제 == 전체 프로세스 문제

스레드는 프로세스의 일부분이기 때문에 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 줄 수 있다. 이와 달리, 프로세스는 독립적이기 때문에 하나의 프로세스에서 문제가 발생하더라도 다른 프로세스에 영향을 주지 않는다.

 

(-) 동기화 문제(Synchronization)

race condition 즉, 두 개 이상의 thread가 하나의 데이터를 놓고 경쟁하게 되면 데이터가 원하지 않은 방향으로 훼손될 수 있다. 

 

예를 들어, 아래와 같은 코드가 있다면

 

count = 0
def addition(count):
	count + =1

내부적으로는

1. count 로드
2. count 연산 -> register에 연산 결과 저장
3. count 값 업데이트

 

세 과정을 거친다.

 

Thread A와 Thread B가 각각 addition()을 실행한다고 가정했을때,

 

Thread A

1. count 로드 count = 0
2. count 연산 count = 0
context switching
Thread B 1. count 로드 count = 0
2. count 연산 count = 0
context switching
Thread A 3. count 업데이트 count = 1
context switching
Thread B 3. count 업데이트 count = 1

 

여러 thread가 동일한 자원을 동시에 접근할 때 이런 문제가 발생한다. thread는 동일 프로세스 내의 모든 thread와 데이터를 공유할 수 있기 때문이다. 따라서 이런 경우에는 동기화 처리로 핸들해주어야한다. 상호 배제 방식(Mutual Exclustion)를 통해 동시실행을 하면 안되는 영역(임계영역, critical section)을 설정하여 데이터(임계자원, critical resource)를 보호한다.

동기화 : 작업들 사이에 시기를 맞추는 것