IT박스

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

itboxs 2020. 5. 31. 21:04
반응형

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


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


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

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

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


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

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

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

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


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

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

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


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

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

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

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

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


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

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

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


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


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

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


Threads were originally created as lightweight processes. In a similar fashion, fibers are a lightweight thread, relying (simplistically) on the fibers themselves to schedule each other, by yielding control.

I guess the next step will be strands where you have to send them a signal every time you want them to execute an instruction (not unlike my 5yo son :-). In the old days (and even now on some embedded platforms), all threads were fibers, there was no pre-emption and you had to write your threads to behave nicely.


Win32 fiber definition is in fact "Green Thread" definition established at Sun Microsystems. There is no need to waste the term fiber on the thread of some kind, i.e., a thread executing in user space under user code/thread-library control.

To clarify the argument look at the following comments:

  • With hyper-threading, multi-core CPU can accept multiple threads and distribute them one on each core.
  • Superscalar pipelined CPU accepts one thread for execution and uses Instruction Level Parallelism (ILP) to to run the the thread faster. We may assume that one thread is broken into parallel fibers running in parallel pipelines.
  • SMT CPU can accept multiple threads and brake them into instruction fibers for parallel execution on multiple pipelines, using pipelines more efficiently.

We should assume that processes are made of threads and that threads should be made of fibers. With that logic in mind, using fibers for other sorts of threads is wrong.

참고URL : https://stackoverflow.com/questions/796217/what-is-the-difference-between-a-thread-and-a-fiber

반응형