쓰레드란 무엇인가?

JP·2021년 11월 27일
0

컴퓨터

목록 보기
1/2

프로세스와 쓰레드

프로세스란 간단히 말해 실행중인 프로그램이다.
프로그램을 실행하면 OS로부터 실행에 필요한 메모리를 할당받아 프로세스가 된다.

프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다.
프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다.

멀티 쓰레드

프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스 라고 한다.

프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출 스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정된다.

CPU의 코어가 한 번에 단 하나의 작업만 수행할 수 있으므로, 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치한다. 그래서 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니며, 하나의 쓰레드를 가진 프로세스보다 두 개의 쓰레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있다.

멀티 쓰레드를 사용함에 있어 얻을 수 있는 이점으로는
1. 자원을 효율적으로 사용할 수 있다
2. CPU의 사용률을 향상시킨다

우리가 채팅 프로그램에서 채팅을 하면서 동시에 이미지를 다운받거나 하는 일을 동시에 할 수 있는 것도 바로 이와 같이 멀티 쓰레드로 프로세스가 작성되어 있기 때문이다.

하지만 장점은 있는 것은 아니다. 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화, 교착상태와 같은 문제들이 있기에 멀티 쓰레드 프로그래밍은 항상 주의해야 한다.

동기화(Synchronization)

싱글쓰레드 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티쓰레드 환경에서는 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다.

예를 들어 쓰레드A가 작업하던 도중에 쓰레드B에게 제어권이 넘어갔을 때 쓰레드A가 작업하던 공유데이터를 쓰레드B가 임의로 변경하고, 이를 다시 쓰레드A가 받게 되어 작업을 마치게 된다면 원래 의도했던 것과는 다른 결과를 얻을 수 있다.

이러한 일을 방지하기 위하여 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다.
그래서 도입된 개념이 바로 임계 영역(critical section)잠금(lock) 이다.

공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정해놓고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계 영역의 코드를 수행할 수 있게 된다.

이처럼 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 쓰레드의 동기화(Synchronization)이라고 한다.

교착상태(deadlock)

두 개 이상의 쓰레드가 서로가 가지고 있는 락이 해제되기를 기다리면서 작업이 더 이상 진행되지 않고 무한정 대기 상태에 빠지는 것을 말한다.


예제, 설명 추가 예정

profile
to Infinity and b

0개의 댓글