1. 단어
thread. 실을 뜻하는 영어 단어다. '쓰레드'라고도 적는다.2. 컴퓨터 관련 용어
2.1. 인터넷 게시판 글의 형식
자세한 내용은 스레드(인터넷 용어) 문서 참고하십시오.2.2. 컴퓨터 실행 체계의 단위
#!syntax cpp
#include <pthread.h> // pthread_t, pthread_create(), pthread_join() ...
void* func0000(void* args0);
void* func0001(void* args1);
int main(void){
pthread_t tid[2];
int args[2];
int status;
pthread_create(&tid[0], NULL, func0000, (void*)&args[0]);
pthread_create(&tid[1], NULL, func0001, (void*)&args[1]);
pthread_join(tid[0], (void**)&status);
pthread_join(tid[1], (void**)&status);
return 0;
}
▲ POSIX Thread (pthread)를 사용하여 두 개의 스레드를 만들고, 각각의 스레드가 서로 다른 함수를 실행하게 만드는 프로그램.
최신 운영체제의 필수요소 중 하나. 프로세스보다도 작은 실행 흐름의 최소 단위이다.
예전에는 프로그램을 실행하는 흐름이 오로지 프로세스뿐이었으나, 소프트웨어가 진보하면서 하나의 프로그램에서 복잡한 동시 작업을 요구하기 시작하였다. 이를 위해서는 하나의 프로그램이 여러 개의 프로세스를 만들어야 했는데 프로세스 특성상 하나의 프로그램이 이러한 동시 작업을 수월하게 할 수가 없었다.[1]
그래서 프로세스보다 더 작은 실행 단위 개념이 만들어지게 되는데 이것이 스레드이다. 하나의 프로세스에서 여러개의 스레드가 메모리를 공유하여 작동할 수 있으며, 그래서 생성과 속도가 빠르고, 적은 메모리를 점유하며, 정보 교환이 쉽고 Context Switching[2] 부하가 적지만 그 대가로 자원 선점과 동기화 문제를 얻게 되었다. 대다수 OS의 스케줄러는 스레드를 최소 단위로 하여 작동한다.
CPU 사양상에서 4 코어 8 스레드 등으로 언급되는 스레드는 위에서 언급한 것과 같으나 단위로서의 뉘앙스가 더 강하다. 4개의 코어로 최대 8개의 작업을 동시 처리할 수 있다든지. 일반적으로 하나의 코어는 한번에 하나씩의 작업만 처리할 수 있지만 SMT[3]를 통해 하나의 코어가 어느 정도 다중 처리 능력을 가지게 할 수 있으며 이럴 경우 물리적 코어 개수와 처리 가능한 스레드의 숫자가 다르게 된다. 사실 멀티코어 CPU 이전부터 존재하던 개념이었다. 문서를 작업하고 있는데 데스크탑 시계가 안 가거나 느리게 가면 큰일나기 때문이다.
2.2.1. 스레드와 프로세스의 차이점
프로세스: 각각의 은행 지점
스레드: 은행 지점 하나에 속한 고객 창구 여러 개
프로세스는 서로 완벽히 독립적인 공간을 가진다. 각자가 자기만의
스택과 데이터 영역을 가지고, 보호받는다. 프로세스는 시작할 때 운영체제에서 PCB[4]와 메모리 공간을 할당받고 초기화하는 과정이 필요하다. 다른 프로세스의 영역을 들여다볼 수 없기 때문에 프로세스끼리 통신하기 위해서 프로세스 간 통신[5]을 활용하거나 공유
메모리를 생성해 데이터를 주고 받는 등의 번거로운 과정을 거쳐야만 한다. 은행 지점을 하나 새로 세우려면 부동산을 계약하고 내부 인테리어 공사를 진행하며, 은행 지점끼리 연락하기 위해서는 사람이 직접 가거나 전화를 해야 하는 상황을 생각해보면 된다. 반면 한 프로세스가 비정상적으로 종료해도 다른 프로세스에는 영향이 거의 없다.[6] 은행 지점 하나가 화재 등으로 손상되어도 다른 지점에서 업무를 볼 수 있는 것과 비슷하다.스레드: 은행 지점 하나에 속한 고객 창구 여러 개
스레드는 스택은 따로따로이지만, 코드 영역과 데이터 영역은 하나를 공유한다. 데이터 영역에 속하는 변수[7]를 통해서 쉽고 빠르고 편하게 통신할 수 있다. 같은 은행 지점에서는 옆 창구에 말만 하면 바로 알아들을 수 있는 것과 비슷하다. 단, 스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료한다면 같은 프로세스에 소속된 다른 스레드들까지 모두 강제로 종료된다. 또한 스레드를 강제로 종료할 경우 해당 스레드와 같은 자원을 공유하던 다른 스레드에 영향을 줄 가능성이 있기 때문에 스레드에 대해서 교육할 때도 강제로 종료시키는 것은 자제하라고 교육하는경우가 많고 C/C++/Rust와 같은 언매니지드 언어[8] 들의 경우 강제 중단된 스레드가 메모리를 할당 받아서 사용하고 있던 경우 바로 메모리 누수로 이어지게 되므로 프로그래밍 언어 설계적인 면에서도 임의대로 종료시키지 못하게 하는 방향으로 가고 있다.[9]
리눅스 커널 2.2까지는 프로세스로 스레드를 에뮬레이트했기 때문에 정상 상황이라면 훨씬 가볍게 작동해야 할 멀티스레드 프로그램이 도리어 더 무거워지는 기현상이 있었다. 커널 2.4 이후로는 이런 문제가 없다.
2.3. 통신 프로토콜
홈페이지
IoT 기기를 위한 IPv6 기반 저전력 매시 네트워킹 프로토콜이다. IoT 제품군에서 사용되는 프로토콜 중 하나인 Zigbee와 유사한 것이라고 생각하면 된다. Thread 기기들은 매시 구조로 상호 연결되기 때문에 Philips Hue의 Hue Bridge와 같은 허브나 브릿지가 필요하지 않다. 다만 이는 IoT 기기들간의 이야기고, 홈 네트워크나 인터넷에 이 기기들을 연결시키려면 Apple TV나 HomePod 등 Thread 경계 라우터가 필요하다. 매시 네트워크의 장점 덕분에 Thread 기기들이 촘촘하게 배치되어 있다면 HomePod과 100m 떨어진 Nanoleaf 전구가 상호 연결이 된다.
2023년 기준 Thread를 지원하는 제품군으로는 도어락, Wi-Fi 라우터, 스마트 스피커, 조명, 모션 센서, 온습도계 등이 있으며, 2023년 하반기 공개된 Apple의 iPhone 15 Pro 시리즈에도 새로이 탑재되면서 최근 주목받고 있다. Thread 인증 기기 목록은 Thread Certified Products에 있다.
Thread에 대해 자세히 알아보고 싶다면 The Verge의 인터뷰를 보도록 하자.
3. 메타의 소셜 네트워크 서비스 Threads
자세한 내용은 Threads 문서 참고하십시오.4. 모험왕 비트의 등장인물
자세한 내용은 스레드(모험왕 비트) 문서 참고하십시오.
[1]
프로세스는 서로의 메모리가 별도로 관리되므로 생성시에 필요한 정보를 죄다 복사해 줘야 하다 보니 생성 및 제거가 느리고 프로세스간 정보 교환이 어려운 데다 상당량의 메모리를 중복해서 지녀야 한다. 또한 숫자가 늘어날수록 Context Switching 부담이 상당해진다.
[2]
멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)을 교체하는 작업
[3]
인텔의 하이퍼 스레딩이 이것의 일종.
[4]
Process Control Block
[5]
IPC: Inter Process Communication
[6]
아예 없지는 않다. 서로 공유하는 파일을 깨먹는다거나 하면...
[7]
보통 일반적으로 글로벌 위치에 놓은 변수를 사용하나, 힙도 가능.
[8]
C#과 같은
.NET 계열 언어들과
Java,
Kotlin과 같이 JVM 위에서 돌고 이런 언어들은 메모리를 유저 코드가 아닌 런타임이 관리하므로 강제 종료된 스레드가 할당한 자원이 GC가 동작하면서 자동으로 해제되지만 이러한 스레드가 상기한 언매니지드 언어로 작성된 라이브러리 코드를 불러와 쓰는 경우 까지는 해결해 주지 못한다.
[9]
대표적으로 .NET 계열 언어에서는 닷넷 5.0부터는 쓰레드를 임의대로 종료시키는
Thread.Abort 메소드를 지원 중단하겠다고 선언했다.