실과 섬유의 차이점은 무엇입니까?


187

실과 섬유의 차이점은 무엇입니까? 나는 루비에서 나온 섬유에 대해 들었고 다른 언어로도 사용 가능하다고 들었습니다. 누군가 스레드와 섬유의 차이점을 간단한 용어로 설명해 줄 수 있습니다.

답변:


162

가장 간단한 용어로, 스레드는 일반적으로 선점적인 것으로 간주되지만 (운영 체제에 따라 항상 그렇지 않을 수도 있음) 섬유는 경량의 협력 스레드로 간주됩니다. 둘 다 응용 프로그램에 대한 별도의 실행 경로입니다.

스레드가있는 경우 : 현재 실행 경로가 언제든지 중단되거나 선점 될 수 있습니다 (참고 :이 명령문은 일반화이며 OS / 스레딩 패키지 등에 따라 항상 적용되는 것은 아닙니다). 이는 데이터 청크를 업데이트하는 도중에 하나의 스레드가 중지되어 데이터 무결성이 나쁘거나 불완전한 상태로 남아 있기 때문에 스레드의 경우 데이터 무결성이 큰 문제입니다. 또한 운영 체제는 동시에 둘 이상의 스레드를 실행하고 개발자가 데이터 액세스를 보호 할 수 있도록하여 여러 CPU 및 CPU 코어를 활용할 수 있습니다.

파이버 사용 : 현재 실행 경로는 파이버가 실행을 수행 할 때만 중단됩니다 (위와 동일한 참고). 즉, 광섬유는 항상 잘 정의 된 장소에서 시작 및 중지되므로 데이터 무결성은 문제가되지 않습니다. 또한 파이버는 종종 사용자 공간에서 관리되기 때문에 값 비싼 컨텍스트 전환과 CPU 상태 변경이 필요하지 않으므로 하나의 파이버에서 다음 파이버로 매우 효율적으로 변경할 수 있습니다. 반면에 두 개의 파이버를 정확히 동시에 실행할 수 없으므로 파이버 만 사용하면 여러 CPU 또는 여러 CPU 코어를 이용할 수 없습니다.


7
여러 스레드를 사용하여 파이버를 병렬로 실행할 수있는 방법이 있습니까?
Baradé

2
@Jason, "광섬유로 현재 실행 경로는 광섬유가 실행을 수행 할 때만 중단됩니다"및 "섬유가 항상 정의 된 위치에서 시작 및 중지되므로 데이터 무결성이 문제가되지 않습니다."라고 말하면 변수를 공유 할 때 "잠금 메커니즘"과 휘발성 변수를 사용할 필요가 없습니까? 아니면 우리가 여전히 그런 일을해야한다는 것을 의미합니까?
Pacerier

@ Baradé 흥미로운 질문입니다. 답변을 찾았습니까?
Mayur

57

스레드는 선제 적 스케줄링을 사용하는 반면 섬유는 협력 적 스케줄링을 사용 합니다.

스레드를 사용하면 제어 흐름이 언제든지 중단 될 수 있으며 다른 스레드가 대신 할 수 있습니다. 다중 프로세서를 사용하면 동시에 여러 스레드를 동시에 실행할 수 있습니다 ( 동시 멀티 스레딩 또는 SMT). 결과적으로 동시 데이터 액세스에 매우 주의하고 뮤텍스, 세마포어, 조건 변수 등으로 데이터를 보호해야합니다. 올바른 일을하는 것은 종종 까다로운 일입니다.

광섬유를 사용하면 일반적으로 이름이 같은 함수 호출을 사용하여 제어 할 때 제어가 전환됩니다 yield(). 따라서 데이터 구조 또는 뮤텍스의 원자성에 대해 걱정할 필요가 없으므로 동시 데이터 액세스가 더 쉬워집니다. 양보하지 않는 한, 선점 되어 다른 파이버가 작업중인 데이터를 읽거나 수정하려고 할 위험이 없습니다 . 결과적으로, 파이버가 무한 루프 상태가되면 다른 파이버를 실행할 수 없습니다.

실과 섬유를 혼합하여 두 가지 문제가 발생할 수 있습니다. 권장하지는 않지만 신중하게 수행하면 때로는 올바른 일이 될 수 있습니다.


3
무한 루프는 수정해야 할 버그 일 뿐이며 무한 루프가있을 때 스레드는 상당히 모호한 이점 만 있습니다. 관련된 비버 기 개념은 사용자가 취소 할 수있는 장기 실행 프로세스가있는 경우입니다. 이 경우 스레드를 사용하든 섬유를 사용하든 장기 실행 프로세스는 협조적이어야합니다. 스레드를 강제 종료하면 일부 데이터 구조가 엉망이 될 수 있으므로 장기 실행 프로세스 스레드가 주기적으로 확인하는 것이 더 좋은 방법입니다 중단 된 경우. 이것은 주기적으로 생산되는 섬유와 크게 다르지 않습니다.
Evgeni Sergeev

43

Win32에서 광섬유는 일종의 사용자 관리 스레드입니다. 파이버에는 자체 스택과 자체 명령 포인터 등이 있지만 OS에서 파이버를 예약하지 않습니다. SwitchToFiber를 명시 적으로 호출해야합니다. 반대로 스레드는 운영 체제에 의해 사전 예약됩니다. 따라서 대략적으로 말하면 파이버는 실제 OS 스레드가 아닌 응용 프로그램 / 런타임 수준에서 관리되는 스레드입니다.

결과적으로 파이버가 저렴하고 응용 프로그램이 스케줄링을 더 많이 제어 할 수 있습니다. 앱이 많은 동시 작업을 생성하거나 실행시 밀접하게 최적화하려는 경우에 중요 할 수 있습니다. 예를 들어, 데이터베이스 서버는 스레드 대신 파이버를 사용하도록 선택할 수 있습니다.

(같은 용어에는 다른 사용법이있을 수 있습니다. 언급 한 바와 같이 이것이 Win32 정의입니다.)


37

먼저 프로세스와 스레드의 차이에 대한 설명을 배경 자료로 읽는 것이 좋습니다 .

일단 당신이 그것을 읽는 것은 매우 간단합니다. 스레드는 커널, 사용자 공간에서 구현되거나 두 가지가 혼합 될 수 있습니다. 파이버는 기본적으로 사용자 공간에서 구현되는 스레드입니다.

  • 일반적으로 스레드라고하는 것은 커널에서 구현 된 실행 스레드입니다. 커널 스레드입니다. 커널 스레드의 스케줄링은 커널이 독점적으로 처리하지만, 커널 스레드는 원하는 경우 절전 모드로 CPU를 자발적으로 해제 할 수 있습니다. 커널 스레드는 차단 I / O를 사용할 수 있고 커널이 스케줄링에 대해 걱정하게 할 수 있다는 장점이 있습니다. 가장 큰 단점은 스레드 전환이 커널에 트래핑을 필요로하기 때문에 상대적으로 느리다는 것입니다.
  • 파이버는 단일 프로세스에서 하나 이상의 커널 스레드에 의해 사용자 공간에서 스케줄링이 처리되는 사용자 공간 스레드입니다. 이것은 파이버 스위칭을 매우 빠르게 만듭니다. 단일 커널 스레드의 컨텍스트에서 특정 공유 데이터 세트에 액세스하는 모든 파이버를 그룹화하고 단일 커널 스레드에서 스케줄링을 처리하는 경우, 파이버가 직렬로 효과적으로 실행되고 완료되므로 동기화 문제를 제거 할 수 있습니다 그들의 일정을 제어합니다. 관련 커널을 단일 커널 스레드로 그룹화하는 것이 중요합니다. 실행중인 커널 스레드는 커널에 의해 선점 될 수 있기 때문입니다. 이 점은 다른 많은 대답에서 명확하지 않습니다. 또한 파이버에서 차단 I / O를 사용하는 경우 전체 커널 스레드는 해당 커널 스레드의 일부인 모든 파이버를 포함하여 블록의 일부입니다.

최신 운영 체제의 11.4 "Windows Vista의 프로세스 및 스레드"섹션에서 Tanenbaum은 다음과 같이 말합니다.

파이버가 협력 적으로 스케줄링되지만 파이버를 스케줄링하는 다중 스레드가있는 경우 파이버가 서로 간섭하지 않도록하기 위해 많은주의 깊은 동기화가 필요합니다. 스레드와 파이버 간의 상호 작용을 단순화하려면 프로세서를 실행하는 프로세서 수만큼 스레드를 작성하고 사용 가능한 프로세서 세트 또는 프로세서가 하나 뿐인 스레드에서만 각 스레드에 스레드를 지정하는 것이 유용합니다. 그런 다음 각 스레드는 파이버의 특정 하위 집합을 실행하여 스레드와 파이버 사이의 일대 다 관계를 설정하여 동기화를 단순화합니다. 그럼에도 불구하고 섬유에는 여전히 많은 어려움이 있습니다. 대부분의 Win32 라이브러리는 광섬유를 완전히 인식하지 못하며 마치 마치 스레드 인 것처럼 광섬유를 사용하려는 응용 프로그램은 다양한 오류가 발생합니다. 커널은 파이버에 대한 지식이 없으며 파이버가 커널에 들어가면 실행중인 스레드가 차단 될 수 있으며 커널은 프로세서에서 임의의 스레드를 예약하여 다른 파이버를 실행할 수 없게합니다. 이러한 이유로 섬유에서 제공하는 기능이 명시 적으로 필요한 다른 시스템에서 코드를 이식 할 때를 제외하고는 섬유가 거의 사용되지 않습니다.


4
이것이 가장 완전한 답입니다.
Bernard

12

스레드 및 섬유 외에도 Windows 7에는 사용자 모드 예약이 도입되었습니다 .

UMS (사용자 모드 예약)는 응용 프로그램이 자체 스레드를 예약하는 데 사용할 수있는 간단한 메커니즘입니다. UMS 스레드가 커널에서 차단되는 경우 응용 프로그램은 시스템 스케줄러를 사용하지 않고 사용자 모드에서 UMS 스레드간에 전환 할 수 있습니다. UMS 스레드는 각 UMS 스레드가 단일 스레드의 스레드 컨텍스트를 공유하는 대신 자체 스레드 컨텍스트를 갖는다는 점에서 광섬유와 다릅니다. 사용자 모드에서 스레드 간을 전환 할 수 있으므로 시스템 호출이 거의 필요하지 않은 많은 수의 단기 작업 항목을 관리하는 데 스레드 풀보다 UMS가 더 효율적입니다.

스레드, 파이버 및 UMS에 대한 자세한 정보는 Dave Probert : Inside Windows 7-User Mode Scheduler (UMS)를 참조하십시오 .


7

스레드는 OS에 의해 예약됩니다 (예비). 스레드는 OS에 의해 언제라도 중지되거나 재개 될 수 있지만, 파이버는 다소 자신을 관리하고 (협동) 서로에게 양보합니다. 즉, 프로그래머는 파이버가 처리하는시기와 처리가 다른 파이버로 전환되는시기를 제어합니다.


7

스레드는 일반적으로 스레드를 중단하기 위해 커널에 의존하므로 스레드 또는 다른 스레드가 실행될 수 있습니다 (선점 형 멀티 태스킹이라고 함). 광섬유는 작동 시간을 포기하는 광섬유 자체 인 경우 협동 멀티 태스킹을 사용합니다. 다른 섬유가 작동 할 수 있습니다.

내가했던 것보다 더 잘 설명하는 유용한 링크는 다음과 같습니다.


7

스레드는 원래 경량 프로세스로 작성되었습니다. 비슷한 방식으로, 섬유는 가벼운 스레드로, 제어에 의해 서로 일정을 잡기 위해 섬유 자체에 (단순 적으로) 의존합니다.

다음 단계는 명령을 실행할 때마다 신호를 보내야하는 스트랜드가 될 것입니다 (5yo 아들과 달리 :-). 예전에는 (그리고 지금은 일부 임베디드 플랫폼에서도) 모든 스레드는 광섬유였으며 선점이 없었으며 스레드를 잘 작성하여 작성해야했습니다.


3

Win32 섬유 정의는 실제로 "Micro Thread"정의는 Sun Microsystems에서 확립되었습니다. 사용자 코드 / 스레드 라이브러리 제어 하에서 사용자 공간에서 실행되는 스레드와 같은 스레드에는 광섬유라는 용어를 낭비 할 필요가 없습니다.

논증을 명확히하기 위해 다음 주석을보십시오.

  • 하이퍼 스레딩을 사용하면 멀티 코어 CPU는 여러 스레드를 수락하여 각 코어에 하나씩 배포 할 수 있습니다.
  • 슈퍼 스칼라 파이프 라인 CPU는 실행을 위해 하나의 스레드를 허용하고 ILP (명령 레벨 병렬 처리)를 사용하여 스레드를 더 빠르게 실행합니다. 하나의 스레드가 병렬 파이프 라인에서 실행되는 병렬 파이버로 분리되어 있다고 가정 할 수 있습니다.
  • SMT CPU는 파이프 라인을보다 효율적으로 사용하여 여러 스레드를 수용하고 여러 파이프 라인에서 병렬 실행을 위해 명령 파이버로 제동 할 수 있습니다.

프로세스는 스레드로 만들어지고 스레드는 섬유로 만들어야한다고 가정해야합니다. 이러한 논리를 염두에두고 다른 종류의 스레드에 섬유를 사용하는 것은 잘못되었습니다.


이건 재미 있네.
JSON
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.