본문 바로가기

운영체제(OS)

Fiber는 뭐고 thread와의 차이점이 뭘까 (feat: Java의 Project Loom)

간단한 설명: 초경량 스레드인데, 스레드와 달리 협력적인 멀티태스킹을 한다

OS의 스레드가 뭔지는 알고 있으니 설명은 넘어가고 문제점부터 바로 집어 보자면

무겁고 자원의 관점에서 비싸다(프로세스보다 경량화된게 스레드인데, 이걸로도 부족한가 보다 개발자들은)

스레드마다 각 고유의 스택 영역을 차지하고 있어 너무 많은 스레드를 생성하게 되면 메모리 부족 에러가 발생할 수 있다.

그리고 IO 연산이 잦다면 CPU가 놀고 있는 idle현상이 빈번해져 비효율적이다 (network, disc IO 등) IO 뿐 아니라 임계영역에 대한 접근이나, latch같은 concurrent utils에 의해서도 block이 발생할 수 있다.

 

멀티스레딩의 대안으로 Reactive API가 나오긴 했지만, 스레드를 넘나들며 요청이 처리되고 이것이 stack trace에 쌓이지 않아 디버깅 하는데 어려움이 있다.

또한 비동기 프로그래밍에 익숙하지 않다면 배우는데 진입 장벽이 있고 무엇보다도 프그래밍 패러다임을 강제하는 단점이 있다(return type이 Future인 함수를 호출하는 함수도 Future를 return해야 하는 등) 

 

그 이후 Fiber가 등장하게 되었는데 동작 방식을 살펴보자면

1. Fiber는 OS의 스레드에 task로서 mount되게 되고, Lock을 걸어 해당 스레드를 점유한다

2. 그리고 IO 작업을 하게 된다면 unlock을 하여 스레드에서 unmount되고 당시의 state를 저장한다

(이게 스레드와의 차이점중 가장 큰 것인데 스레드가 선점형으로 우선순위에 의해 CPU에서 동작하는 기존 스레드를 interrupt 시킬 수 있다면, Fiber는 이미 실행 중인 본인 task가 '스스로' unlock하여 자원(스레드)를 해제해야 다른 Fiber가 자원을 쓸 수 있다 - 협력적 멀티태스킹)

3. unmount한 스레드가 생기면, 제어권이 Fiber 스케줄러로 넘어가고, 이 스케줄러는 ready 상태의 다른 Fiber를 해당 스레드에 할당하고, IO 작업을 마친 Fiber는 unmount된 시점의 state를 가지고 다른 스레드에 재할당 되고 나머지 작업을 이어간다

Fiber가 강점을 발휘하는 영역으로는 IO blocking이 잦은 연산들을 여러개를 동시에 실행시키는 경우이다.

그리고 스레드보다 훨씬 가벼워서 스택 메모리 영역을 적게 차지해 더 많은 fiber를 생성하고 운용해도 전혀 지장이 없다.

이 Fiber를 이용한 JAVA API인 project loom이 현재 개발 중이라고 한다. 블로킹 방식으로 코드를 작성하지만 내부적으로는 논블로킹으로 동작하고, 기존의 Thread API와 매우 유사하여 멀티스레딩 코드 패턴을 사용하여 성능향상을 기대할 수 있다는 것이다

참고 자료:

http://gunsdevlog.blogspot.com/2020/09/java-project-loom-reactive-streams.html

 

Java의 동시성 개선을 위한 Project Loom은 reactive streams를 대체할 것인가?

Java Project Loom 동시성 개선

gunsdevlog.blogspot.com

https://medium.com/@jooyunghan/%EC%BD%94%EB%A3%A8%ED%8B%B4%EA%B3%BC-%ED%8C%8C%EC%9D%B4%EB%B2%84-9e93c12bce30

 

코루틴과 파이버

이전 글: 코루틴을 구분해보자

medium.com

https://www.youtube.com/watch?v=VwBnPZQl5m8&t=1s 

 

'운영체제(OS)' 카테고리의 다른 글

CPU 스케줄러  (0) 2022.07.15
Context Switching  (0) 2022.07.14
PCB 자료구조  (0) 2022.07.14