글타래: Darwin이란 무엇인가
Darwin이란 무엇인가 (그리고 Mac OS X에서는 어떤 힘을 발휘하는가)
따온 글 -What Is Darwin (and How It Powers Mac OS X)
by Matthew Russell
09/27/2005
Darwin
Darwin은 Unix에서 파생된 핵심 요체로 Mac OS X의 기저를 받치고 있으면서 OS 운영의 기반이 되는 기능들을 제공하고 있습니다. Darwin의 핵심은 XNU kernel이며, 성능상의 이유로 FreeBSD의 일부분을 추가하면서 수정된 Mach 3.0 기반의 microkernel로 구성되어 있습니다. Darwin에는 장치 드라이버들을 생성해 주는 기능, 확장된 Virtual File System (VFS) 설계를 바탕으로 한 다중 파일 시스템 지원, 그리고 무설정 네트워킹 기술인 Bonjour와 같은 고급 네트워킹 기능들을 포함하고 있습니다. Apple은 현재 Darwin을 Apple Public Source License (APSL) 2.0 형태로 무료 배포하고 있으며, OpenDarwin.org 그리고 GNU-Darwin과 같은 단체들에서는 일반 사용자들의 참여를 유도하기 위해 이 소스를 사용해서 주기적으로 그들만의 수정본을 배포하고 있습니다.
Mac OS X가 소개된 이후로, 내재한 Objective-C 기반 Cocoa framework 덕분에 개발자들은 비교적 아주 짧은 시간을 투자해서 몇몇 훌륭한 소프트웨어들을 개발할 수 있었습니다. 시장 안의 이런 모든 획기적인 결과물로, 화면 위 눈에 보이는 것들에만 관심이 집중된 이유로, 정작 이 모든 것들을 가능하게 만든 뒤에 숨어 있는 경이로운 기술들은 잊게 하였습니다. 이제, OS X의 핵심(Darwin)으로 파고들어서 우리에게 세상에서 가장 훌륭한 컴퓨터 환경을 제공해주는 그 알맹이 속을 들여다보겠습니다.
Darwin의 진화
Mac OS X의 개발은 과거 1996년으로 돌아가서 Apple이 NeXT를 인수한 직후부터 시작되었습니다. 인수 후에, Mac OS X가 공식적으로 발표된 2001년 이전까지, Mac OS X의 전신이 되는 이 개발 프로젝트는 Rhapshody라는 코드명 갖게 됩니다.
Rhapsody의 개발 동안, 코드는 따로 떨어져 나와서 오늘날 Darwin으로 알려진 공개 소스로 배포됩니다. 결국, 2000년 4월경, Apple의 개발자들은 첫 1.0 버전의 개발을 완료하게 됩니다. 이미 Darwin의 소스 코드를 배포한 후였지만, 완성된 1.0 버전은 오늘날 XNU로 알려진 새로운 hybrid core에 기초한 것이었기 때문에 특별하게 중요한 것이라 하겠습니다. XNU는 Free Software Foundation의 반복 두문자어 형태인 GNU와도 비슷하게 "XNU is Not Unix"를 뜻합니다.
대략적인 OS X의 구조
이제 Darwin의 과거를 대략적으로나마 아셨으니, 자세한 내용에 들어가기 전에 먼저 Darwin이 전체 OS X 구조에서 어떠한 부분을 차지하고 있는지 살펴보겠습니다. 일반적으로 말해서, 대부분의 Darwin은 핵심 OS라고 불리는 하드웨어 바로 위에 맞닿아 있으면서 kernel, 장치 드라이버, 그리고 기타 OS의 기초적 수준의 자원들을 구성/관리하고 있습니다. 그리고 핵심 서비스, 애플리케이션 서비스, 그래픽, 멀티미디어를 포함하는 기타 구성 층들은 핵심 OS와 Aqua로 정의된 사용자 환경 사이에 있습니다. (여기서 Aqua란 사용자 인터페이스의 전체적인 모양과 Mac OS X 애플리케이션들의 동작을 정의하는 표준을 말합니다.) 이것과 관련하여 어떻게 모든 OS X 기술들이 서로 짜져 있는지에 관한 세세하고 완전한 정보는 Mac OS X Technology Overview 문서를 읽어 보시기 바랍니다. 비 오는 날 시간 보내기에는 꼭 안성맞춤이랍니다.
OS X System 구조를 나타내는 두 가지 다른 관점의 그림들. "Core OS" 안 대부분의 기술은 Darwin에 속합니다.
XNU--Darwin의 Kernel
OS를 논할 때 가장 좋은 출발점은 바로 kernel입니다: 여기서 kernel은 밑에 깔린 활용 가능한 모든 하드웨어로의 접근과 관리를 지원하는 OS의 핵심 요소라 할 수 있습니다. Darwin을 완전하게 이해하려 한다면, 성능상의 이유로 kernel 공간 안에 FreeBSD의 일부분을 추가해서 Mach 3.0 microkernel로 융합한 Darwin의 kernel(XNU)에 대한 정체를 짚고 넘어가야 합니다. Mach의 기초는 Pittsburgh에 있는 Carnegie Mellon University에서 시작되었으며, FreeBSD는 BSD(Berkeley Software Distribution)의 자손격으로 BSD의 태생은 짐작하셨겠지만, Berkeley에 잇는 University of California에서 시작되었습니다.
XNU는 kernel 설계에서 서로 다른 두 접근 방식(monolithic 그리고 microkernel 방식)들의 장점들만을 합치려는 노력의 결과로 볼 수 있습니다. 이미 여기서 쓰인 용어가 복잡하게 들릴 수도 있겠지만, 두 가지 방식의 주요 차이점은 아주 단순해서, 기본적으로 어떤 프로그램이 kernel 자체 안에서만 돌아가게 되고, 또 어떠한 프로그램이 kernel 밖에 있는 userland에서 돌아가느냐의 차이입니다. 일반적으로 monolithic kernel은 같은 주소 공간 안에서 모든 하드웨어를 제어하는 비교적 완전한 형태의 풍부한 요체들로 정의되어 있지만, microkernel의 경우에는 kernel 안에는 비교적 최소한의 핵심 서비스들을 제공하면서 다른 주요 서비스들은 userland에서 실행되는 daemon(server)형태의 서비스들을 사용하는 경향이 있습니다.
monolithic kernel(왼쪽)과 microkernel(오른쪽) 설계의 개념도
이 두 접근 방식들 사이에는 아직도 자주 논쟁이 되는 장단점들이 있지만, 이 모든 논쟁의 중심이 되는 것은 결국은 효율성에 관한 주제로 돌아오게 됩니다. 하드웨어와 아주 밀착된 성질을 가진 monolithic kernel은 시스템 기반의 하드웨어들을 아주 효율적으로 사용할 수 있도록 해주지만, 한편으로는 monolithic kernel은 작성하기가 매우 어려우며, kernel 코드 안의 단 한 가지의 실수로 말미암아 시스템 전체를 멈추게 할 수도 있습니다.
반면에, microkernel은 더 많은 핵심 작업들을 userland에서 실행시키며, 이 때문에 다른 한편으로는 실제 kernel 설계를 단순화시켜서 전체 시스템의 안전성을 향상하는데 큰 보탬을 줄 수도 있습니다. 하지만, 불행히도 이 방식은 microkernel이 많은 정보를 kernel 공간으로 보내고 받아야 하는 context switch로 알려진 작업을 통해야만 하는 단점이 있습니다. Context switch는 심각한 작업 하중을 불러일으키며, 이것은 결국 성능을 저하하는 결과를 가져오게 됩니다.
이쯤 와서, 여러분은 두 kernel 설계 중에서 하나를 선택해야 한다면 풀어야만 하는, 논쟁을 떠받치고 있는 문제의 요점을 이해하기 시작하셨을 겁니다. 이런 모든 논쟁 중에서도 아마도 가장 유명한 것은 Linus Torvalds씨와 Andrew Tanenbaum씨 사이에 있었던 것일 겁니다. Torvalds씨는 monolithic kernel 방식을 선호했고, 반면에 Tanenbaum씨는 microkernel 접근법을 옹호했었습니다. 여러분은 1992년 당시, 세계적으로도 유명한 불꽃 같은 논쟁의 한 부분이었던 두 사람 간의 원래 서신을 이 곳에서 읽으실 수 있습니다. (이것을 보면 Darwin kernel을 위한 결정은 이미 끝났다는 것이 얼마나 다행스러운지 모르겠습니다.)
Darwin 이외의 것들
이제까지 XNU의 대략적인 내용을 살펴보았습니다만, kernel을 제쳐놓고라도 Darwin에 관해서는 아직도 많은 이야깃거리가 남아 있습니다. 몇 가지 언급할 만할 가장 주요한 것들로는 I/O Kit을 통해 제공되는 기능들, Virtual File System (VFS), 그리고 네트워킹 지원에 관한 것들이 있습니다.
I/O Kit
Darwin의 I/O Kit(Input/Output Kit)은 Mach 기반 장치 드라이버 framework로 이루어져 있습니다. 이것은 독립적이고, 확장 가능하며, 또한 실제 환경에서 유동적인 장치 관리를 위해 쉽게 변용해서 적용될 수 있습니다. Objectiv-C로 쓰인 Cocoa와는 달리, I/O Kit은 C++의 아류라고 볼 수 있는 Embedded C++로 쓰였습니다. I/O Kit을 위한 언어로 C++가 선택된 이유 중에는 대부분 C++의 검증된 compiler와 오랫동안 시스템 프로그래밍을 지원해 왔다는 점에 기초한다고 볼 수 있습니다.
Mach 기반 kernel 방식에 맞추기 위해, I/O Kit에서 가져온 장치 드라이버들은 특정 장치 혹은 동 종류 장치들 전체를 다루는 데 필요한 정보를 제공하는 특별한 형식의 kernel 확장자들로 이루어져 있습니다. 장치 드라이버를 직접 만들거나 혹은 하드웨어의 가장 밑부분을 제어해야 할 경우가 아니라면, I/O Kit을 신경 쓰실 필요가 없을 겁니다. 하지만 혹시라도 작업하는 데 필요한 정보를 얻으시려면, I/O Kit Fundamentals를 보시면 좋은 안내서가 될 수 있을 겁니다.
파일 시스템과 네트웍 지원
Darwin의 파일 시스템과 네트워크 지원은 풍부한 BSD 재산을 물려받았습니다. VFS 설계로 긴 파일 이름의 지원과 같은 기능 등을 가능하게 했으며, URL 기반 볼륨 마운팅, 그리고 journaling 기능이 도입될 수 있었습니다. Darwin의 파일 시스템은 Mac OS 확장/표준, UFS, UDF, NTFS, 그리고 FAT와 같이 현재 사용되는 거의 모든 파일 시스템들을 다룰 수 있습니다. 웹이 점차 실생활에 근접해 지면서, 파일 시스템 지원을 보충하기 위한 네트워킹 지원 또한 필수 요소이며, 이 점에 관해서는 실망하지 않으실 겁니다.
전에 Windows 상자의 네트워킹을 설정해 본 경험이 있으시다면, 종종 악몽과도 같은 경험이 될 수도 있다는 것을 눈치채셨을 겁니다. 어떤 때는, 여러 개의 tab 속에 있는 갖가지 설정들을 변경한 후에도, 각 tab을 누르면 또다시 새로 열리는 창 속의 여러 tab과 함께 딸려오는 여러 설정 항목들, 그리고 형편없는 도움말 시스템들과 맞닥뜨리게 될 겁니다. 하지만 Darwin에는, 그런 일은 없습니다. Darwin의 BSD 기반 확장 가능한 네트워킹 프로토콜 층은 일반 네트워킹과 관련된 거의 모든 혼란을 없애주는 무설정 네트워킹 수단인 Bonjour와 같은 OS X의 여러 기능에 힘을 실어주는 요인이 되고 있습니다. 이 점에서는 정말로 이보다 더 간편한 방법은 없을 겁니다. 물론 이런 기능들은 당연시 여겨질 수도 있겠지만, 이런 것들이야말로 전체 Darwin 설계에서 자랑거리라 할 수 있습니다.
Darwin과 Open Source
Apple에서는 새로운 버전의 Darwin을 OS X의 주요 갱신 때마다 그들의 오픈 소스 사이트에 배포하고 있으며, Apple의 배포 직후 얼마 안 있어 OpenDarwin.org 진영에서도 그에 대응하는 버전을 내놓고 있습니다. OpenDarwin은 간단하게 Apple의 최근 배포 버전에 Apple에서는 제공하지 않는 약간의 추가 기능들을 첨가한 것이라고 볼 수 있습니다. 이러한 추가 기능들에는 보통 X11 GUI 지원, 장치 드라이버, 여러 도구들, 그리고 여러 하드웨어 지원 등 통상 Mac OS X에서는 직접적으로 지원하지 않는 기능들이 있습니다.
비록 2.0 버전 이전의 APSL(Apple Public Source License)에 의해 배포된 Darwin은 FSF에 의해 비판받기도 했지만, 2.0 버전의 APSL은 무료 소프트웨어 라이센스로 인정받았으며, 대부분의 Darwin은 이 라이센스 하에서 배포되고 있습니다. 하지만, FSF는 아직도 APSL 2.0이 두 가지의 허점들을 가지고 있는 것으로 여기고 있습니다: 완전한 소유권 하에 있는 다른 파일들과의 연결을 유지하고 있으며, 일반적으로 GPL과는 호환되지 않습니다. 제 생각에는 앞으로 QuickTime, Spotlight, 혹은 Cocoa 프레임워크들과 같은 것들이 오픈 소스화 되는 어떠한 비밀 협약이 있을 거라고는 생각하지 않습니다. 그러므로 이 점에 관해서는 불안해하지 않으셔도 됩니다.
만약 Mac OS X의 내부를 파헤쳐 보고 싶으시다면 Apple 버전의 Darwin 혹은 OpenDarwin의 것을 내려받으실 수 있습니다. 그리고 또, 약간의 추가 기능들과 소프트웨어 수정본들로 무장된 또 다른 가능성에 관심이 있으시다면, 가장 자유로운 버전의 Darwin을 목표로 한 프로젝트인 GNU-Darwin을 살펴보시기 바랍니다.
Intel로의 전환
스티브 잡스가 Intel로의 전환을 발표했을 때, 많은 사람은 어떻게 전체 OS가 그렇게 짧은 시간 안에 완전히 다른 구조에서 실행되도록 옮겨갈 수 있을지 놀라워하면서도 또 한편 궁금해하였습니다. 하지만 많은 사람은 OS X가 처음 구상되기 시작한 후로 Mac OS X의 진화와 더불어서 Darwin도 x86에서 컴파일링 되어 왔다는 사실은 아마 몰랐을 겁니다 - 의심의 여지를 없애려면 돌다리도 두드려 보라는 가르침을 염두에 두었을 겁니다. 실제, Darwin의 1.0 버전 개발 과정에 관한 내용은 옛 Advogato씨의 일지 중, 바로 이곳에서 읽어 보실 수 있습니다. 여기에는 심지어 과거 NeXT 시절에서부터 시작해서 최근에도 여러 번 듣게 되는 기술인 fat binaries(universal bianries)에 관한 언급도 보실 수 있습니다.
잠깐의 재밋거리로, 다음 글도 한번 읽어 보시기 바랍니다: 나는 스티브가 절대 그런 짓은 안 하겠다고 말하는 것을 직접 들었다 - 2000년도의 옛 Wired 뉴스 기사에 관한 소감을 weblog에 올린 글로, 여기에는 오늘날 우리가 알고 있는 Intel로의 전환 사실에 비추어 보면 재미있는 몇 가지 인용구들이 소개되어 있습니다.
이젠 아시겠죠
이제는 터미널을 열 때마다 보이는 "Welcome to Darwin!"이라는 작은 문구가 어떤 의미를 가졌는지를 다시는 궁금해하실 필요가 없을 겁니다. 아무쪼록 이것으로 Mac OS X가 어떻게 동작하고, 어디에서 왔으며, 그리고 OS X에게 어떤 힘을 실어주는지 더 깊은 이해를 구하는 데 도움이 되었으면 하는 바람입니다. 자, 이제 어서 Darwin 소스를 내려받고, OS X 내부가 어떻게 작동하는지를 한번 살펴보시기 바랍니다.