SQL 사용자 Tip & 강좌
오늘 오프라인 세미나에서 나왔던 파이버, 다른 이름으로는 경량(light weight) 쓰레드라 불리는 것이 있는데요.
이건 SQL SERVER의 전용 기능은 아닙니다. 기본적으로 WINDOWS운영체제에서 지원을 해주는 기능이며 APP개발자들을 위해서 API가 지원되고 있습니다. (CreateFiber, DeleteFiber, ConvertThreadToFiver, SwitchToFiber)
쓰레드와 파이버의 가장 큰 차이점은 누가 스위칭을 관리하느냐에 달려 있습니다.
일반적으로 알고있는 쓰레드는 OS에서 활성화할 쓰레드를 관리해 줍니다. 개발자나 DBA분이 신경을 쓰지 않아도 OS의 알고리즘에 의해서 적당하게 CPU시간을 나눠서 사용할 수 있게 스케줄링 되고 있는 것입니다.
하지만 파이버는 현제 동작하고 있는 파이버가 종료 되거나 SwithToFiber를 통해 수동으로 선택될 때까지는 실행이 되지 않습니다. 이때 스위칭 비용은 쓰레드 스위칭 비용보다 싸다고 합니다(비용이 더 싼 이유중에 하나는 쓰레드는 커널모드로 관리되고 파이버는 유저 모드로 관리됩니다. 유저 모드가 커널모드보다 관리 비용이 더 싸다고 생각 하시면 됩니다. 더 들어가면 OS쪽 아키텍처로 빠저서 혼란만 줄거 같아서 이렇게 이해하시고 읽으시면 됩니다.)
대신 스케줄링중 발생하는 문제에대한 책임도 파이버를 사용하는 쪽에서 가지게 됩니다. 결국 파이버를 잘못 사용해서 데드락이 생기면 결국 쓰레드간 데드락이 생기는 것과 같습니다. 파이버도 자신을 실행해줄 쓰레드가 있어야 하며, 파이버가 종료되거나 다른 파이버를 선택해주지 않으면 결국 그 쓰레드는 무한히 대기상테가 되며 사용할 수 없게 됩니다. 그리고 어떻게 적당히 CPU시간을 파이버들이 나누어 사용할 수 있게 하는것도 큰 문제입니다.
아마 이런 문제들, 특히 CPU시간을 쓰레드 스위칭을 통한 분배 알고리즘만큼 효율적으로 만들기 어렵기 때문에 SQL SERVER에서는 파이버가 기본 설정이 되어 있지 않으며, 스레드 스위칭 비용이 아주 높을 경우같은 특정한 상황에 대해서 선택적으로 사용하라고 하는것 같습니다.
WINDOWS INTERNALS에도 아주 짧게 나와 있네요. 쉽게 잊고 쓰지 말라는 의도인지...
또한 쓰레드는 프로세서가 증가되면 쉽게 성능을 향상 시킬 수 있지만, 파이버는 프로세서가 증가되는 것보단 단일 프로세서의 파워가 높은게 더 효과적으로 생각됩니다. 현재 실행되고 있는 파이버가 빨리 작업이 끝나서 다른 파이버를 불러주거나 종료가 되야 하니 프로세서 하나의 파워도 중요합니다.
결국... 기능을 유지하는걸 보면은 필요한 곳이 있으니 테스트를 해보고 사용하라는 결론이 내려지네요.
그리고 이건 프로그래밍쪽 이야기입니다만 파이버가 있는 이유중에 또 하나는 유닉스의 프로그램의 포팅 때문이라고도 합니다.
이쪽에 관심이 있으신분은 "Windows via C/C++" 책을 참고해 보셔도 좋습니다.
게임 서버 프로그래머로서 짧은 지식이지만 도움이 되었으면 합니다.
참고 URL

DB를 좋아하는 게임서버 프로그래머 입니다.

jevida(강성욱)

좋은 정보 잘 읽었습니다 ^^