스레드 (r20220720판)

문서 조회수 확인중...

1. 일반
2. 용어
2.1. 스레드, 인터넷 게시판 글의 형식
2.2. 스레드, 컴퓨터 실행 체계의 단위
2.2.1. 스레드와 프로세스의 차이점
3. 인명
3.1. 스레드, 모험왕 비트의 등장인물


1. 일반[편집]


thread. 을 뜻하는 영어 단어이다. '쓰레드'라고도 적는다.


2. 용어[편집]



2.1. 스레드, 인터넷 게시판 글의 형식[편집]


파일:나무위키상세내용.png   자세한 내용은 스레드(인터넷 용어) 문서를 참고하십시오.



2.2. 스레드, 컴퓨터 실행 체계의 단위[편집]


#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 Switcing [2] 부하가 적지만 그 대가로 자원 선점과 동기화 문제를 얻게 되었다. 대다수 OS의 스케줄러는 스레드를 최소 단위로 하여 작동한다.

CPU 사양 상에서 4코어 8스레드 등으로 언급되는 스레드는 위에서 언급한 것과 같으나 단위로서의 뉘앙스가 더 강하다. 4개의 코어로 최대 8개의 작업을 동시 처리할 수 있다든지. 일반적으로 하나의 코어는 한번에 하나씩의 작업만 처리할 수 있지만 SMT[3]를 통해 하나의 코어가 어느정도 다중 처리 능력을 가지게 할 수 있으며 이럴 경우 물리적 코어 개수와 처리 가능한 스레드의 숫자가 다르게 된다. 사실 멀티코어CPU 이전부터 존재하던 개념이었다. 문서작업하고있는데 데스크탑 시계가 안가거나 느리게가면 큰일나기 때문이다.


2.2.1. 스레드와 프로세스의 차이점[편집]


프로세스: 각각의 은행 지점

스레드: 은행 지점 하나에 속한 고객 창구 여러 개


예를들어 포장 일을 하는데 일손이 부족하다고 치자. 그리고 선택지는 블리치 노이토라 지르가마냥 팔을 더 돋아나게해서 일처리를 늘리는 방법과, 아예 나루토마냥 분신술을 쓰는 방법 두가지가 있다고 하자. 작업장의 크기가 한정되어 있다라고 가정하면 무엇이 더 효율적일까? 당연히 공간과 차크라(영압)을 적게먹는 노이토라가 노동생산성이 더 좋은 우수노동자임은 당연하다. 이렇게 멀티스레드(노이토라)멀티프로세스(나루토)를 쉽게 비유할수 있다. 하지만 따로생각하고 따로일하는 그림자분신과 달리 단순히 팔만 늘리고 뇌는 1개인 노이토라는 손이 꼬이거나 또는 어떤 손을 사용할까 하고 팔에 작업분배를 헷갈려서 문제가 생길 여지가 있다.(병목현상, 데드락 등) 많아진 손을 적재적소에 놀지않고 부지런히 일하려면 본인의 두뇌도 좋아야 한다라는 제반조건이 생긴다.

프로세스는 서로 완벽히 독립적인 공간을 가진다. 각자가 각자의 스택과 데이터 영역을 가지고, 보호받는다. 프로세스는 시작할 때 운영체제에서 PCB[4]와 메모리 공간을 할당받고 초기화하는 과정이 필요하다. 다른 프로세스의 영역을 들여다볼 수 없기 때문에 프로세스끼리 통신하기 위해서 프로세스간 통신[5]을 활용하거나 공유 메모리를 생성해 데이터를 주고받는 등의 번거로운 과정을 거쳐야만 한다. 은행 지점을 하나 새로 세우려면 부동산을 계약하고 내부 인테리어 공사를 진행하며, 은행 지점끼리 연락하기 위해서는 사람이 직접 가거나 전화를 해야 하는 상황을 생각해보면 된다. 반면 한 프로세스가 비정상적으로 종료해도 다른 프로세스에는 영향이 거의 없다.[6] 은행 지점 하나가 화재 등으로 손상되어도 다른 지점에서 업무를 볼 수 있는 것과 비슷하다.

스레드는 스택은 따로따로이지만, 코드 영역과 데이터 영역은 하나를 공유한다. 데이터 영역에 속하는 변수[7]를 통해서 쉽고 빠르고 편하게 통신할 수 있다. 같은 은행 지점에서는 옆 창구에 말만 하면 바로 알아들을 수 있는 것과 비슷하다. 단, 스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료한다면 같은 프로세스에 소속된 다른 스레드들까지 모두 강제로 종료된다. 또한 스레드를 강제로 종료할경우 해당 스레드와 같은 자원을 공유하던 다른 스레드에 영향을 줄 가능성이 있기 때문에 스레드에 대해서 교육할때도 강제로 종료시키는것은 자제하라고 교육하는경우가 많고 프로그래밍 언어 설계적인 면에서도 임의대로 종료시키지 못하게 하는 방향으로 가고있다[8]

리눅스 커널 2.2까지는 프로세스로 스레드를 에뮬레이트했기 때문에 정상 상황이라면 훨씬 가볍게 작동해야 할 멀티스레드 프로그램이 도리어 더 무거워지는 기현상이 있었다. 커널 2.4 이후로는 이런 문제가 없다.


3. 인명[편집]



3.1. 스레드, 모험왕 비트의 등장인물[편집]


파일:나무위키상세내용.png   자세한 내용은 스레드(모험왕 비트) 문서를 참고하십시오.


[1] 프로세스는 서로의 메모리가 별도로 관리되므로 생성시에 필요한 정보를 죄다 복사해줘야 하다보니 생성 및 제거가 느리고 프로세스간 정보 교환이 어려운데다 상당량의 메모리를 중복해서 지녀야 한다. 또한 숫자가 늘어날수록 Context Switching 부담이 상당해진다.[2] 멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값(Context)을 저장하고 CPU가 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(Context)를 교체하는 작업[3] 인텔의 하이퍼 스레딩이 이것의 일종.[4] Process Control Block[5] IPC: Inter Process Communication[6] 아예 없지는 않다. 서로 공유하는 파일을 깨먹는다거나 하면...[7] 보통 일반적으로 글로벌 위치에 놓은 변수를 사용하나, 힙도 가능[8] 대표적으로 .NET 계열 언어에서는 닷넷 5.0 부터는 쓰레드를 임의대로 종료시키는 Thread.Abort 메소드를 지원 중단하겠다고 선언했다.


파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2022-07-08 01:05:45에 나무위키 스레드 문서에서 가져왔습니다.