스레드의 개념
스레드의 정의
- CPU가 처리하는 작업의 단위이다.
- 운영체제의 입장의 작업 단위는 프로세스, CPU 입장의 작업 단위는 스레드
- 운영체제의 입장의 스레드는 CPU에 작업 요청하는 실행 단위
일반적으로 작은 단위의 일(operation)이 모여 하나의 작업이 된다.
작업을 상대 적인 크기순으로 나열하면 처리(job) > 프로세스(task) > 스레드 (operation)이 된다. 여러 개의 스레드가 모여서 프로세스를 이루고 여러 개의 프로세스가 모여 처리가 된다.
프로세스와 스레드 차이
- 프로세스는 약하게 연결되있지만 스레드는 강하게 연결되어 있다.
- 각각의 프로세스는 서로에게 큰 영향을 끼치지않는다.
- 스레드는 실행 순서 및 실행 결과가 다른 스레드에 영향을 미친다.
- 스레드는 프로세스 내부에서 서로 강하게 연결되어 있다.
멀티태스크와 멀티스레드
스레드 관련 용어
- 멀티 스레드
- 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영기법
- 멀티 태스킹
- 운영 체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법
- 시분할 시스템
- 시분할 시스템에서 운영체제가 CPU에게 전달하는 작업은 프로세스가 아니라 스레드다.
- 멀티 프로세싱
- CPU를 여러개 사용하여 여럭 개의 스레드를 동시에 처리하는 작업환경을 말한다.
- 하나의 CPU내 여러 개의 코어에 스레드를 배정하여 동시에 작동하는 것도 멀티 프로세싱이다.
- CPU 멀티 스레드
- 운영체제가 소프트웨어적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법을 멀티스레드, 하나의 CPU에서 여러 스레드를 동시에 처리하는 것은 CPU 멀티 스레드라고 부른다.
멀티스레드의 구조와 예
멀티스레드의 구조
- 멀티스레드는 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드, 데이터 등을 공유하면서 여러 개의 일을 하나의 프로세스 내에서 하도록한다.
- 정적인 영역은 프로세스가 실행 되는 동안 바뀌지 않는 영역으로 스레드들이 공유하는 값이다.
- 동적인 영역은 스레드가 작업을 하면서 값이 바뀌거나 생성되거나 사라지는 영역이다 (레지스터 값, 스택, 힙)
- 자원의 낭비를 막고 효율성을 향상시킬 수 있다.
- 스레드는 가벼운 프로세스(LWP: Light Weight Process)라고 부르며, 반대로 스레드가 1개인 일반 프로세스는 무거운 프로세스 (HWP: Heavy Weight Process)라고 불린다.

멀티스레드의 장단점
멀티스레드의 장점
- 프로세스 내 공유가 가능한 부분을 제외하고 실행과 관련된 부분을 스레드로 나누어 관리하면 중복 사용을 피함으로 낭비를 막을 수 있다.
- 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있다.
- 응답성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않아도 다른 스레드가 작업을 계속하여 사용자의 작업요구에 빨리 응답할 수 있다.
- 자원 공유 : 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원할하게 진행 할 수 있다.
- 효율성 향상 : 여러 개의 프로세스를 생성할 필요가 없어 불필요한 자원의 중복을 막음으로써 시스템 효율이 향상된다.
- 다중 CPU 지원 : 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.
멜티스레드의 단점
- 멜티스레드는 자원을 공유하기 떄문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.
- 현대에는 메모리가 넉넉하고 멀티 코어 CPU를 지원하면서 다른 스레드가 영향받는 것을 최소화하기 위해 낭비 요소가 있더라도 멀티태스킹을 이용하는 경우가 많다.
멀티스레드 모델
- 프로세스가 커널 프로세스와 사용자 프로세스로 구분되는 것처럼 스레드도 커널 스레드와 사용자 스레드로 나뉜다.
- 커널 스레드 : 커널이 직접 생성하고 관리하는 스레드
- 사용자 스레드 : 라이브러리에 의해 구현된 일반적인 스레드
- 커널 스레드와 사용자 스레드의 대응방식은 1 to N모델, 1 to 1 모델, M to N 모델로 구분된다.
사용자 스레드 (1 to N모델)

- 커널이 멀티스레드를 지원하지 않은 초기의 스레드 시스템에서 사용되었다.
- 사용자 스레드는 사용자 레벨에서 라이브러리를 사용하여 스레드를 구현한다.
- 사용자 스레드 라이브러리는 커널이 지원하는 스케줄링이나 동기화 같은 기능을 대신 구현해 준다.
- 커널 입장에서는 사용자 스레드 1개가 1개의 프로세스처럼 느껴진다.
- 사용자 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되기 때문에 1 to N 모델이라고 한다.
- 장점
- 라이브러리가 직접 스케줄링하고 작업에 필요한 정보를 처리하기 때문에 커널에서 문맥 교환이 필요없다.
- 단점
- 여러개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 모든 사용자 스레드가 같이 대기하게 된다.
- 커널의 입장에서는 하나의 프로세스이기 때문에 일부 스레드만 대기 상태로 보낼 수가 없다.
- 한 프로세스의 타임 슬라이스를 여러개의 스레드가 공유하면서 멀티코어 환경에서 병렬로 실행될 수 없다. (멀티 스레드를 지원하는 커널의 경우는 가능하다.)
- 보안에 취약하다. 공유변수를 보호르르 커널이 아닌 라이브러리에서 구현하기 때문이다.
커널 스레드(1 to 1 모델)

- 커널 스레드는 커널이 멀티 스레드를 지원하는 방식이다.
- 하나의 사용자 스레드가 하나의 커널 스레드와 연결된다.
- 커널 스레드는 독립적으로 스케줄링되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속 할 수 있다.
- 커널이 제공하는 보호 기능을 사용 할 수 있다.
- 장점
- 하나의 스레드가 대기 상태에 있어도 다른 스레드는 작업을 계속할 수 있다.
- 보안에 강하고 안정적으로 작동한다.
- 단점
- 문맥교환을 할 때 오버헤드 때문에 느리게 작동
멀티레벨 스레드 (M to N모델)
- 하이브리드 스레드라고도 한다.
- 사용자 스레드와 커널 스레드를 혼합한 방식이다.
- 커널 스레드의 개수가 사용자 스레드보다 같거나 적다.
- 대기 상태에 들어간 커널 스레드 대신 다른 스레드가 대신 작업하여 사용자 스레드보다 유연하게 작업을 처리할 수 있다.
- 하지만 커널 스레드를 같이 사용하기 때문에 여전히 문맥교환 오버헤드 발생
- 빠르게 움직여야하는 스레드는 사용자 스레드로, 안정적으로 움직여야하는 스레드는 커널 스레드로 작동한다.