파이썬 GIL 깊숙히! (상) 에 대한 몇 가지 변명

지난 번
파이썬 GIL 깊숙히! (상)을 쓴 이후로 그 글을 읽으신 분들의 느낌을
IRC, 오프라인, 블로그 등을 통해 많이 전해 들었습니다.
별 다른 코멘트 없이 사실을 전달하는 정도로만 써서 그랬는지, CPython의 구현에 굉장히 심각한
문제가 내재되어 있는 것처럼 느껴지고, 이것 때문에 파이썬에 크게 실망하신 분들도 있는 것 같습니다.

그렇지만, 파이썬의 GIL은 “문제”라기보다는, “특성” 정도가 훨씬 적당하지 않을까 싶습니다.
파이썬과 같은 높은 수준의 객체 추상화를 사용하는 언어는 필연적으로 객체들의 작업들을 내부적으로
구현하기 위해서 여러가지 lock 방법이 필요합니다. 프로그래밍 언어 뿐만 아니라, 사실 한정된 자원을
공유하는 운영체제, 플랫폼 시스템, 데이터베이스 등등 대부분의 프로그램이 그렇겠죠.

그런데, GIL은 lock을 구현하는 방법 중의 하나일 뿐입니다. GIL에 반대되는 fine-grained lock은
lock을 관리하는 부가적인 자료구조가 필요하고, lock이 세분화 되어있기 때문에 그에 따라 한 번 lock
하면 될 것을 여러 번 lock해서 작업해야하는 경우가 많이 생깁니다. lock 여러개를 왔다갔다 하느라 문맥 전환 오버헤드나 캐시 손실도 발생할 수 있고요. 또한, fine-grained lock은
데드락같은 상황을 해결하기 위한 방법을 추가로 사용해야합니다. 만약 운영체제의 디스크자원,
Bus I/O자원, 그래픽자원 등과 같이 종류도 다양하고 수도 많은 경우라면 당연히 서로 병렬로 작업이
효율적으로 일어나게 하려면 fine-grained lock을 사용해야 합니다. 그렇지만, 파이썬에서 필요한
lock은 대부분 CPU가 주요 자원으로 참여하는 것으로, 사실상 이전의 PC들이 대부분 CPU가 1개
였다는 점에서, GIL을 사용하는 것은 (1) 구현이 쉽고 (2) 프로그램이 효율적이고 (3) 구현의
복잡도가 낮아서 유지보수가 쉬우며 버그도 적게 해 줍니다.

CPython을 구현한 그룹은 기업 규모의 다른 팀들에 비해 상당히 작은 규모이며, 특히 플랫폼에 최적화된 복잡한 JIT와 객체 시스템을 구현한 뛰어난 VM을 Sun이나
MS같이 직접 제작하여 유지보수할
수 있을만한 크기가 전혀 아닙니다. 따라서, 한정된 개발자들이 파이썬 고유의 역량을 그의 특징을
살리는 데 투자하기 위해서는 복잡한 VM을 구현하는 것보다는, 새로운 라이브러리와 언어적 측면들을
발전시키는 것이 더욱 중요했고 그렇게 계속 발전되어 왔습니다. 또한, 이렇게 만들어진 파이썬 언어는
결국 IronPython이나 PyPy같은 더 높은 이상을 추구하는 프로젝트가 나올 수 있게 된 기반이 되었겠죠.

그리고, GIL을 “문제”로 보기 힘든 또 하나의 이유는, 운영체제나 데이터베이스같은 시스템과는 달리
파이썬은 프로그래밍 환경이기 때문에, 사용자가 GIL이 있다고 해도 더 좋은 방법들을 개발하여 쓸 수
있다는 것입니다. 사실 쓰레드 프로그래밍은 프로그램 안에서 여러 문맥을 쓰기 위한 좋은 방법 중의
하나이긴 하지만, 대부분의 경우에 쓰레드를 사용하는 부분을 멀티 프로세스로 처리하는 것도 가능하고,
그게 오히려 더 효율적인 경우가 많이 있습니다. 예를 들어, 과학 계산을 위한 프로그램을 CPU가 20개라서
쓰레드 20개로 돌리게 만들었다면, 이 경우 입력값과 출력값을 관할하는 한 프로세스와 다른 20개 프로세스가
서로 통신하게 분리해서 짜는 것도 가능하고 (통신 방법은 os.system 외에도 무궁무진), 아예 범용으로
코드 객체를 던져주면 그걸 실행해주는 서버를 20개 띄워놓는 방법도 있겠죠. 이렇게 되면, 쓰레드 20개로
띄우던 시절과는 달리, 꼭 컴퓨터 1대에서 다 돌아갈 필요가 없어지고 10개, 10개 나누거나 2개씩 10대로
나누는 등의 설정도 생각해 볼 수 있게 됩니다.

어떤 분들에게는 GIL은 현재 파이썬 구현의 최대약점이라고 보이실 수도 있지만, GIL 때문에 도저히 같이
못 살겠다 해도 그것을 기회로 삼아, 쓰레드 말고 다른 방법으로 구현하는 방법을 배워보시는
계기로 만들어 보시면 좋겠습니다. =3=3=3

예고대로 (하)편에서는 GIL을 다루는 (피해가는?) 여러 방법에 대해서 소개해 드리겠습니다. ^_^

16년 전, 책 한권

잡지 같은 데서 유명한 사람들 인터뷰를 보면 “나를 만든 책” 이라면서 어릴 때
읽은 책 한 권이 큰 영향을 미쳤다고 소개하는 경우를 종종 봅니다. 근데, 저는
암만 생각해 봐도 어릴 때 책은 안 보고 맨날 오락이나 하고 놀아서 잘 생각이
나지 않았는데, 마침 이번에 이사하면서 대청소를 하다가 반가운 책을 하나 발견하고
자랑해 봅니다. ^_^;


91년에 친구가 5색 칼라 디스켓 경품을 준다는 말에 꼬여서 동네 컴퓨터학원에 간 후로
시키는 대로 잘 되는 것이 신기해서 이 책도 사고 저 책도 사고 했는데 이 책도
그 중의 하나입니다. 내용은 당시 컴퓨터 잡지에 늘 나오던 BASIC 언어 소스가
가득한 그냥 그런 내용인데, 소재로 게임이 대부분이긴 했지만, 장르도 다양하고
“수명 점치기”, “엘리자와 대화”, “성격 테스트”, “일정 관리” 같은 아주 간단한
여러 프로그램들이 있어서 100~200줄 정도만 열심히 치면 짠! 하고 책에 나왔던
프로그램이 진짜로 모니터에서 보였습니다. 감동~ =)

뭐 사실 이런 책이 알고리즘 같은 것을 배우는 데는 큰 도움은 안 되었겠지만,
코딩을 계속 재미로 할 수 있는 동기를 만들어주는 소재의 원천이 된 것이
큰 도움이 되지 않았나 합니다. 수명 점치기는 한글판으로 사전 찾아가며
번역하고 지문도 추가하고 UI도 만들고 해서 친구들한테 디스켓에 복사해 줘서
결과 파일 받아다가 통계도 내고 그랬었는데, 생활 속에서 늘 이런 저런 소품
프로그램을 만들어서 놀고 그런 것이 이때가 시작이었던 것 같네요. 으흐흐~

그 때 봤던 컴퓨터 잡지는 “학생과학” 이라고 하는 잡지 부록인 “컴퓨터랜드”를 봤는데요,
맨날 본권인 학생과학은 보지도 않고 던져놓고 컴퓨터랜드 뒤에 나오는 BASIC 소스만
사자마자 며칠 밤을 새서 치고 그거 고치면서 노느라 학교에서 43/50 등도 자주 해 보고.. 으흐흣 -ㅇ-;
위의 사진은 컴퓨터랜드에 응모해 본다고 만든 디스켓에 나름대로 장식이랍시고 디스켓 껍데기를
저렇게 만들었는데 –; 지금 보니 완전 유치하네요. ^^;; 당시에는 그래도 멋지다고 쓴 것 같은데;;;;;
디스크 레이블지에 보면 HELP를 HALP라고 커다랗게 써 놓았는데, 당시에 대구에서는 저걸 “암호”라는
전문용어로 불렀는데 그 뜻은 “실행파일명”이라지요. ^_^;;

요즘은 컴퓨터를 처음 시작할 때 일반적인 아이들이 배우는 과정에서는 조그만 장난감이
적은 편인데, 아무래도 앞으로 교육과정이 많이 발전하여 우리나라에서도 피코크리킷이나
비스킷 같은 재미있는 것들이 많이 도입 되었으면 좋겠습니다. 그렇지만, 당시에는 그래도
어른들이 평소에 쓰는 프로그램 비슷하게 아이들도 만들기가 쉬웠는데, 요즘은 거의 불가능하다는
점이 시간의 흐름이 아쉽긴 합니다.

대전으로 이사 완료~

9년동안 살았던 정들었던 신촌을 떠나서 대전으로 이사를 마쳤습니다.
하하 뭐 이사한다고 2달동안 글을 안 쓴 것은 아니고요, 왠지 손이 안 가서
-ㅇ-;;

대전 공기는 맑지만 기숙사 방은 문은 녹슬어있고 샤워실 타일은 온통 곰팡이에
장판은 너덜너덜 일어나려고 그러고 있긴 하지만.. 뭐 그래도 그나마도 없는 것보다는
낫다는 생각에 잘 적응해 보려고 마음 굳게 먹고 있습니다;;

23일에 입학하고 26일에 졸업하니 23~25일 간에는 학생^2인 셈입니다. 백수 생활도
못 하고 ㅡ.ㅜ;

이제 대전으로 터를 옮겼으니, 조만간 파이썬과 루비에 관한 세미나를 대전에서
한 번 해 볼까 생각중입니다. 얼마 전에 생물정보학S/W워크샵 2007
에서 루비를 사용했었는데, 루비도 상당히 재미있더군요. ^.^;;

그럼 조만간 대전에서 번개를 한 번~ 🙂