Unix 역사상 가장 유명한 코드 주석인 “You are Not Expected to Understand This”의 유래와, 그 주석이 설명하던 컨텍스트 스위칭의 작동 방식을 살펴본다.
2017년 1월 15일 오전 9:00, David Cassel

대표 이미지: Systems We Love에서 열린 Arun Thomas의 발표 중 Sarah Huffman이 작성한 메모.
“이것은 이해할 필요가 없다”라는 문구는 아마도 Unix 역사에서 가장 유명한 주석일 것이다.
그리고 지난달 샌프란시스코에서 열린 Systems We Love 컨퍼런스에서 시스템 연구자 Arun Thomas는 청중에게 그들이 정확히 무엇을 이해하지 않아도 되는지 설명했다.
현장에 있던 컴퓨터 과학 교사 Ozan Onay는 이를 “그날 가장 마음에 든 발표 중 하나”라고 불렀다. 그는 자신의 블로그에 “Dennis Ritchie가 괜찮다고 말하더라도, 그 어떤 것도 블랙박스여서는 안 된다!”라고 썼다.
Thomas는 “나는 시스템, 특히 운영체제를 사랑한다”라고 말하며 발표를 시작했다. 하지만 그조차도 42년 된 이 Unix 소스 코드 주석의 인기에 놀라지 않을 수 없었다. “사람들이 ‘이것은 이해할 필요가 없다’라고 적힌 맨투맨, 티셔츠, 아기 보디슈트를 입고 다니기 시작했어요. 해커 커뮤니티에서 크게 퍼졌죠.” 이후 괴짜들은 계속해서 이를 패러디해 왔다.
이 코드 주석은 원래 제6판 Unix 운영체제에 등장했으며, 컨텍스트 스위칭을 설명했다. Thomas의 표현을 빌리면 이는 “시분할과 멀티태스킹을 가능하게 하는 메커니즘, 즉 본질적으로 여러 동시 사용자와 동시 애플리케이션이 컴퓨터를 함께 사용할 수 있게 하는 방법”이다.
기본적으로 컨텍스트는 Unix 프로세스를 일시 정지하고 다시 실행할 수 있게 하는 스택 포인터와 레지스터의 조합이다. Thomas는 “멋진 기법이고, Unix의 시분할 지원은 그것이 성공한 큰 이유였습니다. 사용성 측면에서 큰 도약이었죠”라고 말했다. “세월이 흐르며 달라진 부분도 있지만, 전체적인 방식은 근본적으로 그대로 남아 있습니다.”
Thomas는 청중에게 Unix 공동 창시자 Dennis Ritchie가 이 주제에 관해 쓴 “그 주석에 대한 주석” 웹페이지를 상기시켰다.
“이 문구는 Unix의 Bell Labs 연구 릴리스에 달린 주석의 양이나 질을 깎아내리는 말로 자주 인용된다. 일반적으로는, 유감스럽지만 아주 부당한 관찰은 아니다. 하지만 이 경우에는 정당화될 수 없다. 우리는 무슨 일이 일어나는지 설명하려고 했다. ‘이것은 이해할 필요가 없다’는 말은 건방진 도전이 아니라 ‘이건 시험에 나오지 않는다’라는 취지의 말이었다.”
Ritchie는 이를 그저 괴짜 문화 역사 속 재미있는 일화로 보았다. 같은 페이지에서 그는 mv 명령이 가끔 “values of β will give rise to dom!”이라는 진단 메시지를 내보내는 이유도 설명했다. 그러나 Ritchie는 자신의 1975년 주석이 열성적인 추종자를 얻었다는 점을 알고 있었다.
“이 문구가 적힌 맨투맨을 두 벌이나 선물 받기도 했습니다”라고 그는 썼다.
Thomas는 여기서부터 이야기를 이어 간다. “Ritchie가 들려준 또 다른 재미있는 사실은, 알고 보니 코드에 실제로 버그가 있었고 Unix 저자들조차도 그것을 완전히 이해하지 못했다는 점입니다.”
“그러니 이 이야기의 교훈은 컨텍스트 스위칭이 Unix 창시자에게조차 까다로울 수 있다는 것입니다.”
Unix v6는 1975년에 출시됐다. Thomas는 “대략 9,000줄의 코드였으니 대학 강의에서 연구할 수 있을 만큼 작았습니다”라고 지적한다. 그는 1979년에 AT&T가 Unix 라이선스 조건을 바꾸어 공식 라이선스 보유자만 코드를 연구할 수 있도록 했던 일을 기억한다.
하지만 제6판 전체 소스 코드는 이미 뉴사우스웨일스 대학교 교수 John Lions가 자신의 해설과 함께 책으로 출간한 뒤였다. 이 때문에 그 책은 유난히 인기를 끌었다. Thomas는 청중에게 “사람들은 복사본을 또 복사하고 있었습니다”라고 말하며, 이 현상이 결국 책 표지에도 기념되었다고 덧붙였다.
이 책의 Wikipedia 문서에는 “이 책은 흔히 컴퓨터 과학 분야에서 가장 많이 복사된 책으로 여겨졌다”고 적혀 있다.
“저는 Papers We Love Boston에서 이 발표의 초기 버전을 했는데, 참석자 중 한 명이 무단 복제한 Lions 책을 들고 왔습니다. 아직도 그 책을 갖고 있고 정말 아끼고 있다는 점이 꽤 멋졌어요.”
하지만 바로 이 책의 인기가 Ritchie의 무심코 던진 주석을 널리 알리는 데도 도움이 됐다.
그렇다면 소스 코드는 우리가 무엇을 이해할 필요가 없다고 했던 것일까? Thomas는 Unix가 프로세스를 가상 프로세서와 그에 연결된 메모리 주소 공간으로 정의하는 방식을 신속하게 살펴보고, 관련 하드웨어를 청중에게 설명했다. 프로세스의 메모리를 격리하는 것은 CPU이며, CPU는 특권 연산이 허용되는지 추적하고 인터럽트와 예외도 지원한다.
필연적으로 프로세스를 전환할 때마다 나중에 복원할 수 있도록 CPU 컨텍스트를 저장해야 하는 지점에 이른다. Thomas는 청중에게 “이 일은 계속 일어납니다. 프로세스는 컨텍스트 스위치되어 빠져나갔다가 다시 들어옵니다”라고 말했다. CPU 시간 할당량을 다 쓰거나 인터럽트 신호, 페이지 폴트, 시스템 호출이 발생하면 컨텍스트가 전환된다. Thomas는 “프로세스는 계속 이리저리 옮겨집니다”라고 말했다.
“운영체제는 CPU 클럽의 경비원이라고 생각할 수 있습니다. 너무 난동을 부리면 쫓겨나죠. 그리고 VIP가 가게 전체를 빌리면 역시 쫓겨나지만, 아마 다음 날에는 다시 올 수 있을 겁니다.”
“운영체제는 Club CPU의 경비원이라고 생각할 수 있습니다. VIP가 들어와 이곳을 통째로 빌리면, 여러분은 나가야 합니다.” — @arunthomas#systemswelove
— Systems We Love (@SystemsWeLove) 2016년 12월 14일
이 모든 일이 일어나는 방식은 조금 더 까다롭다. CPU와 커널이 첫 프로세스의 컨텍스트를 데이터 구조에 저장하고, 스케줄링 결정을 위해 다음으로 우선순위가 높은 프로세스를 식별한 뒤, 다음 프로세스의 컨텍스트를 복원한다.
그러나 Ritchie의 주석을 온전히 이해하기 위해 Thomas는 청중에게 실제 Unix 소스 코드 일부를 보여 주며 1975년으로 돌아가는 시간 여행의 기회를 제공했다.
그곳에서 청중은 swtch() 루틴이 컨텍스트를 저장하는 savu() 서브루틴을 호출하는 모습을 보았다. 이 서브루틴의 책임은 **u_rsav()**라는 커널 데이터 구조에 컨텍스트를 저장하는 것이다. 컨텍스트의 더 많은 부분은 다른 곳에 저장된다. 이후 retu() 서브루틴은 다음 컨텍스트의 일부를 복원하고, sureg() 서브루틴은 가상 주소 공간을 준비하는 데 도움을 준다. “전체 세부 사항은 Lions 책에 있고, 실제로 꽤 복잡합니다. 하지만 흥미롭게 읽을 만합니다.”
하지만 기억하자. 여러분은 이를 이해할 필요가 없다.
**swtch()**를 위한 원래 Unix V6 코드에는 다음과 같은 좀 더 직관적인 주석도 있었다.
/* Remember stack of caller
/* Search for highest-priority runnable process
/* Switch to stack of the new process and
/* set up his segmentation registers.
그러나 안타깝게도 가장 사랑받은 그 주석은 불과 몇 년 뒤인 1979년, Unix v7을 위해 컨텍스트 스위칭 코드가 다시 작성되면서 사라졌다. 하지만 오늘날에도 FreeBSD에서 스위칭 서브루틴을 찾을 수 있다고 Thomas는 설명했다. 이제 CPU별 코드이므로 **cpu_switch()**라고 부르며, 스케줄링 코드는 머신 독립적인 **sched_switch()**로 옮겨졌다.
https://www.youtube.com/watch?v=TPe6UXMDMGM&feature=youtu.be&t=7h25m3s
결국 우리는 모두 우리보다 앞선 괴짜들의 작업 위에 무언가를 만들고 있다. Thomas는 오늘날의 FreeBSD 같은 현대 Unix는 예를 들어 스레드와 동적 링크가 있어 더 복잡하지만, “프로세스 추상화 자체는 근본적으로 동일하다”고 청중에게 상기시켰다. 스케줄링 알고리즘도 더 발전했고 PDP-11 시대 이후 하드웨어 환경도 분명히 달라졌다. 그러나 결국 “현대 운영체제는 프로세스 추상화와 컨텍스트 스위칭을 사용하여 근본적으로 같은 방식으로 시분할을 수행합니다.”
Thomas의 발표는 1975년에 이루어진 모든 고된 작업에 대한 나의 존경심을 새롭게 했으며, 그도 이를 알고 있는 듯했다. 그는 샌프란시스코 청중에게 “시분할을 작동시키는 일은 쉽지 않습니다. 하드웨어는 복잡하고, 제가 그 복잡함을 어느 정도 느끼게 해드렸기를 바랍니다”라고 말한 뒤, 자신만의 마지막 컨텍스트 스위칭을 덧붙였다.
“설령 제가 과제에 실패해 프로세스 추상화와 컨텍스트 스위칭의 중요성을 제대로 전달하지 못했더라도, 적어도 이제 제 티셔츠는 이해하실 겁니다.”