이 커멘트 를 위한 해설:
일단 스레드랑 크리티컬 섹션, 뮤텍스 등을 쓰는 전통적인 스레드 기반 프로그래밍 모델은 이해하고 있을 거라고 생각하고.. 요즘 많이들 하는 게 이벤트 기반으로 멀티스레드 어플리케이션을 작성하는 거야. 간단하게 말하자면 메시지 큐를 유지하고, 이것을 동기화하는 작업 등등을 직접 구현하는 게 아니라 프레임워크에서 이같은 작업을 하도록 하고, 우리는 메시지가 왔을 때 메시지를 처리하고, 결과 메시지를 다른 애들에게 보내고 종료하는 함수들만을 제공하는 거지. 이와 같은 작업들을 언어 차원에서 지원하는 가장 대표적인 예가 Erlang 이고. Scala 도 이것과 비슷한 모델을 쓸 수 있는 라이브러리를 표준 라이브러리에서 제공하고 있지.
Stackless Python 은 이와 같은 모델을 파이썬에서 사용할 수 있도록 만든 실험적인 구현인데 (하는 일이 액터 모델과 완전 같은 건 아니지만) 거기에서 가장 큰 문제는 얘가 스레드를 안 쓴다는 것... 파이썬은 Global Interpreter Lock (구글 요망) 때문에 여러 개의 스레드를 돌린다고 해서 속도가 올라가는게 아니거든. 그래서 얘는 싱글 스레드 위에서 여러 개의 가상 스레드 (tasklet) 를 사용해 컨텍스트 스위칭에 들어가는 부하를 줄이는 데 더 중점을 두고 있지. 문제는 근데 알고스팟 저지에서는 많은 작업들이 블러킹 I/O 로 처리되기 때문에 (외부 프로그램 실행/컴파일/네트워크 접근 등이 가장 많은 시간이 드는 작업) 만약 얘들이 블러킹되어버리면 다른 애들까지 실행할 길이 막혀버리지... 반쪽짜리 파이썬 스레드라고 해도, 블러킹 I/O 가 있을 경우에는 다른 스레드를 실행할 수 있게 해 주는데. 때문에 stackless 도 사용할 수 없단 얘기.
블러킹 I/O 와 넌블러킹 I/O 를 간단히 설명해 보면.. I/O 결과를 기다릴 때 해당 스레드가 멈춰 있느냐 계속 움직이느냐의 차이인데. scanf() 나 fread() 등등은 블러킹 I/O 의 가장 전형적인 예지. 데이터를 다 읽어온 후에야 함수가 반환되니까.. 반면 넌블러킹 I/O (Asynchronous I/O) 에서는 함수는 곧장 반환하고, 입출력이 끝나면 해당 스레드에 메시지나 시그널을 보내주는 형식으로 구현되지.. 이거는 결국 운영체제 차원에서 지원할 수밖에 없는데 윈도우의 IOCP, 리눅스의 epoll, BSD 의 kqueue 같은 게 있고.. 특히나 네트워크 같은 경우 CPU 보다 한없이 느리기 때문에, 넌블러킹 I/O 를 잘 이용해서 CPU 자원을 최대한 활용할 수 있도록 하는 게 중요하지.. 그래서 각종 네트워크 라이브러리 (루비의 이벤트머신, 파이썬의 트위스티드, C++ 의 ACE-_-; 와 부스트의 asio, 자바의 네티 등등..) 에서는 이런 것들을 거의 다 지원하고 있지.
다른분들 틀린거 있음 지적바랍니다. 'ㅅ' 맥주 먹었더니 알딸딸 아 자야지




2. 가상 스레드 -> 유저레벨 스레드. 근데 딱히 유저레벨 스레드 구현물들이 스레드에 뭔가 특별한 제약사항을 두지 않는다면(ex, floating point 사용금지), 부하를 줄이는데 중점을 둔다 해도 효과는 미비할거야 -ㅁ-