{{위키데이터 속성 추적}}
'''파이버'''(Fiber)는 [[컴퓨터 공학]]에서 특히 가벼운 [[스레드 (컴퓨팅)|실행 스레드]]이다.

스레드와 마찬가지로 파이버는 [[주소 공간|주소 공간]]을 공유한다. 그러나 파이버는 [[선점 스케줄링|협력적 멀티 태스킹을]] 사용하는 반면 스레드는 [[선점 스케줄링|선점형 멀티 태스킹을]] 사용한다. 일반적인 스레드는 커널의 스레드 스케줄러에 의존해 실행 권한이 양도되지만, 파이버는 스스로 실행 권한을 양도한다.

== 파이버와 코루틴 ==
파이버는 본질적으로 [[코루틴]]과 유사하다. 차이점은 코루틴의 경우 프로그래밍 언어 수준에서 구현되는 [[제어 흐름]]인 반면, 파이버는 시스템 수준에서 구현되며 동시에 실행되지 않는 스레드의 모음인 것이다 두 개념 중 어느 것이 먼저 나왔는지에 대한 이견이 있다. 코루틴을 시스템 수준으로 구현한 것인가<ref name="flounder">[http://www.flounder.com/fibers.htm A Fiber Class]</ref>, 코루틴을 구현하기 위한 기반으로 만들어진 것인가에 대한 분쟁이다.<ref name="msdn-wrap">{{웹 인용|url=http://msdn.microsoft.com/msdnmag/issues/03/09/CoroutinesinNET/default.aspx|제목=Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API|성=Shankar|이름=Ajai|날짜=September 2003|웹사이트=MSDN Magazine|출판사=Microsoft|보존url=https://web.archive.org/web/20030819040842/http://msdn.microsoft.com/msdnmag/issues/03/09/CoroutinesinNET/default.aspx|보존날짜=19 August 2003|url-status=dead|확인날짜=24 December 2006|인용문=This article shows how coroutines can be implemented for the .NET Framework by using the Fiber API and Managed Extensions for C++, and how they can be easily used with other .NET-compliant languages}}</ref>

== 장점과 단점 ==
파이버가 협력적으로 멀티 태스킹하기 때문에 [[스레드 안전|스레드 안전성]]은 선점형 스레드보다 문제가 적으며, [[스핀락]] 및 [[선형화가능성|원자성 작업]]을 포함한 동기화 구성은 파이버 단위가 자체적으로 양도를 하는 특성 덕분에 동기화되므로 불필요하다. 그러나 많은 라이브러리는 [[비동기 입출력|비동기 I/O]]를 수행하기 위해 암시적으로 파이버를 생성한다.

단점은 파이버가 선점형 스레드를 사용하지 않고는 [[다중 처리|다중 프로세서]] 시스템을 사용할 수 없다는 것이다. 그러나 CPU 코어보다 더 많은 선점 스레드가 없는 M : N 스레딩 모델은 순수 파이버 또는 순수 선점 스레딩보다 더 효율적일 수 있다.

일부 서버 프로그램에서 파이버는 자체적으로 소프트 블록(soft block)을 사용하여 단일 스레드로 작동하는 상위 프로그램이 계속 작동할 수 있도록 한다. 이런 설계에서 파이버는 CPU 처리가 필요없는 I/O 액세스에 주로 사용된다. 그래서 메인 프로그램이 기존에 수행중인 작업을 계속할 수 다. 파이버는 단일 스레드 메인 프로그램에 대한 제어를 양보하며 I/O 작업이 완료되면 파이버가 중단 된 지점에서 계속된다.

== 운영 체제 지원 ==
파이버는 스레드에 비해 [[운영 체제|운영 체제의]] 지원이 상대적으로 덜 필요하다.

모던 유닉스(Unix) 시스템에서는 [[:en:GNU_Portable_Threads|GNU Portable Threads]]처럼 <code>ucontext.h</code> 라이브러리에서 제공되는 [[:en:Setcontext|getcontext, setcontext와 swapcontext]] 함수를 이용해 구현하거나 [http://www.boost.org/doc/libs/release/libs/fiber/doc/html/index.html boost.fiber]처럼 어셈블러를 사용하여 구현할 수 있다.

[[마이크로소프트 윈도우|Microsoft Windows]]에서 파이버는 <code>ConvertThreadToFiber</code> 및 <code>CreateFiber</code> 호출을 통해 스레드에 사용가능한 파이버를 생성할 수 있고, 스레드 로컬 스토리지와 유사한 파이버 로컬 스토리지는 변수(variable)의 고유한 복사본을 생성할 수 있다.<ref name="msdn-fibers">[http://msdn2.microsoft.com/en-us/library/ms682661.aspx Fibers], [[MSDN Library]]</ref>

[[심비안 OS|Symbian OS]]의 Active Scheduler는 Fiber와 유사한 구조로 갖고 있다. 하나의 파이버를 갖고 있는 Symbian OS의 [https://en.m.wikipedia.org/wiki/Active_object_(Symbian_OS) 활성 객체(Active obejct)]는 비동기 호출이 완료되면 Active Scheduler를 통해 실행된다.

여러 Active Object는 우선순위에 따라 실행되기까지 대기 상태일 수 있으며, 각각의 Active Obejct는 실행시간에 제한을 갖는다.

== 같이 보기 ==

* [https://en.m.wikipedia.org/wiki/Setcontext setcontext / getcontext library routines] ([[영어 위키백과]])
* [https://en.m.wikipedia.org/wiki/Green_threads Green threads] ([[영어 위키백과]])
* [[call-with-current-continuation]]

== 참고 문헌 ==
<references />

== 참고 ==

* [https://www.gnu.org/software/pth/ GNU Portable 스레드]
* [http://freshmeat.sourceforge.net/projects/libpcl/ "Portable Coroutine Library"] (출처 : Freecode).
* [https://web.archive.org/web/20100305204752/http://www.thinkmeta.de/en/fiberpool_overview.html Fiber Pool] Microsoft Windows 용 Fiber를 기반,  멀티 코어를 지원하는 C ++ 프레임워크
* [http://state-threads.sourceforge.net/index.html 상태 스레드(State Threads)]
* [http://dunkels.com/adam/pt/ 프로토 레드(Protothreads)]
* [https://github.com/Adaptv/ribs2 ribs2]
* [http://www.boost.org/doc/libs/release/libs/fiber/doc/html/index.html boost.fiber]
[[분류:스레드]]
[[분류:제어 흐름]]