Search
🤖

스레드

스레드의 정의

“A thread (or lightweight process) is a basic unit of CPU utilization”
CPU 이용의 기본 단위인 스레드. 여기서는 위문장의 전반부인 lightweight process에 집중해보자.
만약 동일한 작업을 하는 프로세스를 여러개 띄우고 싶다면? 코드와 데이터 중 중복되는 영역이 있을 것이기 때문에, 따로 띄우면 낭비다. 그럴 때 스레드를 활용하면 동일한 프로세스를 병렬로 수행할 수 있다.
병렬 수행이므로 코드 호출간에 영향을 주면 안 되기 때문에 스택 공간을 별도로 활용한다.
즉 스레드는 프로세스에서 공유할 수 있는 것은 최대한 공유하고, 동일 프로세스를 여러개 수행하기 위한 아이디어에서 나온 개념이다.
각각의 스레드는 별도의 PC(프로그램 카운터)를 가진다.
PCB에서 스레드에 필요한 정보 부분
위와 같은 이유로 스레드 개념이 없던 기존 프로세스는 heavyweight process라고 부른다. 하나의 thread를 가지고 있는 task로 볼 수 있다.

스레드의 구성

다른 스레드와 실행시 각각의 스레드가 다른 스레드와 독립적으로 진행이 되어야 하기 때문에, 별도의 스택공간 및 PC를 사용한다.
스레드마다 별도로 있는 부분
Program counter
stack space
register set
스레드가 동일 프로세스 스레드와 공유하는 부분
code section
data section
OS resources

스레드로 인해 얻을 수 있는 효과

다중 스레드로 구성된 태스크 구조에선 하나의 서버 스레드가 blocked (waiting) 상태인 동안에 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.
하나의 스레드가 IO(파일 읽기)를 하는 동안 다른 스레드는 유저의 요청을 처리하는 등
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다.
하나의 코어는 하나의 프로세스만 차지할 수 있음을 기억하는가? 멀티스레드 프로그래밍은 하나의 프로세스가 여러 코어를 동시에 이용하는 것을 가능케 한다.
스레드를 사용하면 병렬성을 높일 수 있다.
공룡책에선 위 내용을 아래와 같이 표현하고 있다.
응답성 (responsiveness)
대화형 프로그래밍(유저와 상호작용)을 다중 스레드화 하면 사용자의 응답성이 증대된다. 사용자가 다운로드 버튼을 누르면 다운로드를 마칠 때 까지 중단되는 브라우저를 상상해보라. 다중 스레드는 프로그램의 응답성을 향상시켜 유저에게 빠른 응답을 제공할 수 있다.
자원 공유 (resource sharing)
프로세스는 공유 메모리와 메시지 전달 기법(IPC)를 통하여야만 자원을 공유할 수 있다. 그러나 스레드는 자동으로 그들이 속한 프로세스의 자원과 메모리를 공유한다.
경제성 (enonomy)
프로세스와 비교했을 때 생성 및 컨텍스트 스위칭 비용이 저렴해진다.
솔라리스의 경우 위 두 가지 오버헤드가 각각 30배, 5배
규모 적응성 (scalability)
MP(multicore programming)에서 장점을 발휘할 수 있다. 다중 스레드는 다중 코어에서 병렬로 수행될 수 있기 때문에, 싱글 코어를 이용할 때와 비교하여 뛰어난 성능을 얻을 수 있다.
다중 코어를 이용했을 때 구체적인 성능 향상률은 암달의 법칙으로 구할 수 있다.

기타

병행성과 병렬성

동시에 실행된다는 뜻을 가진 두 단어는 프로그래밍의 세계에선 약간의 의미 차이가 있다.

병행성(Concurrency)

프로세스가 동시에 실행되는 것처럼 보이는 것.
싱글코어 시스템에서 시분할 시스템을 구현하기 위해 CPU가 CPU 스케줄러를 이용해 빠르게 여러 프로세스를 전환함으로써 동시에 실행되는 듯한 환상을 유저에게 제공했다. 그러나 실제로 동시에 실행되는 것은 아니다.

병렬성(Parallelism)

여러 코어에서 실제로 동시에 여러 작업이 실행되는 것.

레퍼런스

프로세스 2
프로세스 3