파이버 (컴퓨터 과학)

파이버(Fiber)는 컴퓨터 공학에서 특히 가벼운 실행 스레드이다.

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

파이버와 코루틴 
파이버는 본질적으로 코루틴과 유사하다. 차이점은 코루틴의 경우 프로그래밍 언어 수준에서 구현되는 제어 흐름인 반면, 파이버는 시스템 수준에서 구현되며 동시에 실행되지 않는 스레드의 모음인 것이다 두 개념 중 어느 것이 먼저 나왔는지에 대한 이견이 있다. 코루틴을 시스템 수준으로 구현한 것인가, 코루틴을 구현하기 위한 기반으로 만들어진 것인가에 대한 분쟁이다.

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

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

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

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

모던 유닉스(Unix) 시스템에서는 GNU Portable Threads처럼 ucontext.h 라이브러리에서 제공되는 getcontext, setcontext와 swapcontext 함수를 이용해 구현하거나 boost.fiber처럼 어셈블러를 사용하여 구현할 수 있다.

Microsoft Windows에서 파이버는 ConvertThreadToFiber 및 CreateFiber 호출을 통해 스레드에 사용가능한 파이버를 생성할 수 있고, 스레드 로컬 스토리지와 유사한 파이버 로컬 스토리지는 변수(variable)의 고유한 복사본을 생성할 수 있다.

Symbian OS의 Active Scheduler는 Fiber와 유사한 구조로 갖고 있다. 하나의 파이버를 갖고 있는 Symbian OS의 활성 객체(Active obejct)는 비동기 호출이 완료되면 Active Scheduler를 통해 실행된다.

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

같이 보기 

 setcontext / getcontext library routines (영어 위키백과)
 Green threads (영어 위키백과)
 call-with-current-continuation

참고 문헌

참고 

 GNU Portable 스레드
 "Portable Coroutine Library" (출처 : Freecode).
 Fiber Pool Microsoft Windows 용 Fiber를 기반,  멀티 코어를 지원하는 C ++ 프레임워크
 상태 스레드(State Threads)
 프로토 레드(Protothreads)
 ribs2
 boost.fiber
스레드
제어 흐름