강좌 & 팁
유닉스 역사 이야기 - 마지막 편
[Mach와 허드, 넥스트스텝과 Mac OS Ⅹ]
유닉스 시스템이 인기를 끌었던 중요한 원인 중 하나는 매우 작고 간단하다는 것이었다. 유닉스가 개발될 당시에는
결코 덩치 큰 운영체제가 아니었다. 유닉스가 점점 많은 기능을 통합하고 복잡해져 감에 따라 유닉스의 원래 매력인
작고 간단한 시스템으로 돌아가고 싶어하는 사람들이 하나 둘 나타났다.
1980 년대 중반에 CMU의 연구원들은 Mach라는 새로운 운영체제를 만들기 시작했다. 이 운영체제 프로젝트는 마이크로
커널을 개발하는 것이었다. 마이크로 커널은 스케줄러와 핵시적 자원 관리를 하는 부분을 수행하는 작은 부분과 운영체제
유지에 필요한 다른 작업을 수행하는 하부 구조를 지원한다. 초기에는 인터페이스 통합을 위해 4.2BSD의 인터페이스를
이용했으며 단일 혹은 다중 CPU를 지원하고 분산 처리에도 적합하도록 설계했다. 재설계를 통해 유닉스의 고질적 문제를
해결할 수 있으리라고 보았다.
Mach 는 마이크로 커널을 지향했으나 초기의 2.5 버전에서는 구현되지 않았다. 따라서 기저부에는 복잡한 모노리딕
커널이 수행되고 그 위에 BSD 인터페이스를 구현한 형태로 상대적으로 느린 시스템이었다. 넥스트스텝이나 OSF/1 같은
초기의 Mach 기반의 운영체제들은 2.5 기반이었으며 Mach 3.0부터 마이크로 커널로 구현됐다.
Mach에 대한 초기 논문은 다음과 같은 것들이 있다. 이 중에서 두 번째와 세 번째는 매우 선구적인 글이며 가상
메모리 관리에 대한 중요성을 배울 수 있다.
◆ M. Acetta, R. Baron, W. Bolosky, D. Golub, R. Rashid, A. Tevanian, and M. Young,
"Mach: A new kernel foundation for UNIX development", In Proc. Usenix Summer '86 Conf.,
pages 93--113, Atlanta, June 1986.
◆ Rashid, R., Tevanian, A., Young, M., Golub, D., Baron, R., Black, D., Bolosky, W.,
and Chew, J., "Machine Independent Virtual Memory Management for Paged Uniprocessor and
Multiprocessor Architectures," Proc. ASPLOS II, Palo Alto CA, Oct. 1987, 31--39.
◆ Avadis Tevanian, Jr. Architecture-Independent Virtual Memory Manager for Parallel and
Distributed Environments: The Mach Approach. PhD thesis, Carnegie Mellon University,
December 1987.
현 재 CMU는 더 이상 Mach 커널을 개발하지 않는다. 개발자들은 다른 학교나 마이크로소스프트와 애플로 옮겨 갔다.
이들은 매우 독창적인 방법으로 운영체제를 설계했으며 같은 시기의 썬과 비슷하거나 동급의 독창적인 설계를 발표했다.
썬의 쓰레드와 필적하는 Mach 쓰레드가 있었으며 강력한 다중 CPU용 스케쥴러도 있었다. Mach의 가상 메모리 관리자
역시 잘 설계된 것으로 장치 독립적인 부분과 장치 의존적인 부분으로 분리된다. Mach는 BSD 인터페이스 외에도
DOS나 다른 운영체제를 인터페이스로 사용한 적도 있었다. 심미적으로나 기능적으로 Mach는 매우 아름답지만 조금
복잡해 보인다.
[애플 Mac OS Ⅹ과 다윈]
스티브 잡스(Steve Jobs)는 애플 컴퓨터를 그만두고 넥스트(NeXT)라는 새로운 컴퓨터 회사를 설립했다. 넥스트의
운영체제인 넥스트스텝(NeXTStep)은 Mach 아키텍처와 4.2BSD API를 기반으로 만든 객체 지향적 유닉스 호환
운영체제다.
넥스트는 결국 하드웨어 제작을 그만두고 넥스트스텝의 이름을 오픈스텝(OpenStep)으로 바꾸고 다른 운영체제에도
동작하도록 했다. 1997년 애플은 넥스트를 인수하면서 넥스트스텝의 구조와 디자인들을 반영해 새로운 운영체제를
만들기로 하는데 지금의 Mac OS Ⅹ이 그 결과물이다.
Mac OS Ⅹ의 기초에 해당되는 부분은 CMU의 Mach 업데이트 버전이다. 4.4BSD 시스템의 인터페이스를 유지하며
유닉스용 사용자 유틸리티들은 FreeBSD와 NetBSD에서 도출했다. 특히 아쿠아(Aqua)라는 인터페이스는 이 운영체제를
위해 새로 만들어진 것이다.
애 플은 다윈(Darwin)이라는 운영체제의 베이스 소스를 공개해 개발자들에게 새로운 시스템 릴리즈 이전에 그것을
습득할 수 있는 기회를 주고 피드백을 받을 수 있었다. 다윈은 애플의 매킨토시 하드웨어에서뿐만 아니라 인텔 기반
컴퓨터에서도 사용할 수 있다(http://gnu-darwin.sourceforge.net에 가보면 매우 활발하게 활동하는 사용자
모임을 만날 수 있다).
개 인적인 의견이지만 Mac OS Ⅹ이 Mach 커널의 중요한 시험장이 될 것으로 본다. Mach는 몇 년 후면 개발된지
20년이 된다. 그들이 설계했던 병렬(Parallel) 처리, 분산 처리, 다중 CPU 지원 등이 다윈에서 적절하게 구현될 뿐만 아니라 허드(Hurd)에서 테스트했어야 할 일들까지도 수행하게 되기를 바란다.
마 이크로 커널을 싫어하는 사람들도 많다, 그 주된 이유는 기능(functionality)이 아닌 성능(performance)
문제다, 그런 사람들 중 한 명이 바로 리누즈 토발즈(Linus Tovalds)다. 하지만 그가 싫어한다고 해서 마이크로
커널의 중요성이 감소되는 것은 아니다. GNU의 허드가 개발이 잘 진행되지 않는다고 해서 그 디자인 자체가 나쁘다고
비난할 수 없다. Mac OS Ⅹ이나 다른 Mach 기반 구현들의 미래는 앞으로 더 살펴보아야 할 것 같다.
[무에서 만들어진 운영체제, 리눅스]
가 장 많이 설치된 공개 운영체제 중 하나가 리눅스다. 요즘 리눅스 CD가 여기저기 널려 있는 것을 보면 1980년대에
커널 코드를 보고 싶어도 설치할 서버가 없던 때가 생각난다. 필자는 펭귄을 보면 조건 반사적으로 리눅스를 떠올리기도
한다.
리 눅스는 특별한 조상이 없다. 1991년 미닉스를 공부하던 한 학생이 시작한 프로젝트인 것이다. 리눅스는 잘 알려진
것처럼 리누스 토발즈라는 헬싱키 대학생이 만들었다. 1991년에 리누스는 자유 소프트웨어 재단의 개발 도구를 사용해
386 PC를 위한 공개 유닉스 커널을 개발하기 시작했다. 초기의 연속적인 성공은 인터넷을 통해 해커들을 끌어들여
그가 완전히 자유롭고 재배포 가능한 소스로 구성된 제대로 된 유닉스 클론인 리눅스를 개발하도록 도왔다.
리 눅스에게도 경쟁자가 없지는 않았다. 거의 같은 시기에 윌리엄과 라인 졸리츠(William & Lynne Jolitz)는
실험적으로 386에 BSD를 이식했다. BSD 기술과 리누스의 미숙한 초기 노력을 비교하던 대부분의 관찰자들은 BSD
포트(port)가 PC의 가장 중요한 공개 유닉스가 될 것이라 예측했다. 하지만 진화의 방향은 알 수가 없다는 특징이
있다. 예상을 깨고 리눅스가 큰 성공을 거둔 것이다(리눅스의 가장 중요한 특징은 기술적인 것이 아니라 사회적인
것이었다고 한다. 에릭 레이몬드는 리눅스는 인터넷 시대 그 자체의 요구를 반영하며 소스트웨어 공학의 새로운
유형으로 규정하기도 했다. 그의 「성당과 시장」은 fetchmail과 리눅스를 비교하는 배짱(?)을 보이기는 하지만
분명히 새로운 시각을 제시한다).
리 눅스는 다른 유닉스들과는 완전히 다른 방식으로 발달했다. 맨 처음부터 인터넷에 의해 조정되는 수많은 자원자에
의해 ‘우연히’ 해킹됐다. 품질은 엄격한 표준이나 독재에 의해 이뤄지지 않았으며, 릴리즈되면 며칠 내에 수백 명의
사용자로부터 피드백을 받고, 개발자들이 지속적으로 변화를 소개하는, 다윈주의적인 적자생존의 선택을 할 수 있게
하는 그런 단순한 전략에 의해 관리됐다. 1993년 후반 리눅스는 안정성과 신뢰성에서 상용 유닉스와 경쟁할 수
있었으며 많은 소프트웨어를 운영했다. 이러한 인기는 1994년과 그 이후에도 계속된다.
최 초의 리눅스 커널은 1991년 발표한 0.01 버전이었다. 여러 해의 개발 기간을 거쳐 1994년 3월 1.0 커널이
완성됐다. 이후 1.1, 1.2, 1.3을 거쳐 1996년 7월 2.0, 1999년 1월 2.2를 거쳐 지금의 2.4에 이르렀다.
리눅스는 점점 대형화하고며 엔터프라이즈 서버로 새로운 자리 잡기를 시도하고 있다. 불과 10년 전 386에서
간신히 돌아가던 유닉스 비슷한 그 무엇이 이제는 주류가 되어가는 것이다. 그러면서 다른 운영체제의 거대화에
수반됐던 많은 문제가 반복되고 있다. 리눅스 역시 코드가 수만 줄에서 수백만 줄로 증식하며 복잡한 미래에
부딪히고 있다.
[리눅스에 대한 단상]
리 눅스가 발표된 지 10년이 지났다. 10년 전의 386 PC는 느린 클럭으로 동작했고 리눅스의 코드도 조악했다.
처음에는 PC의 리얼타임 클럭에 접근하는 법이나 인터럽트 처리 문제 같은 쉬운 문제들조차 정립되지 않은 상태였으며
리눅스에서 FPU를 동작시키는 간단한 방법론마저도 불안정했다. 네트워크 코드도 없었고 X 윈도우도 없었다.
1990년대 초기에는 바이오스(BIOS)와 하드웨어 모두가 불안정했다. 운영체제의 디버깅과 하드웨어의 문제점 찾기를
구분하기 어려운 문서들도 있었다. 그러나 이런 문제들이 모두 빠른 시간 내에 해결되면서 리눅스의 열기는 고조됐다.
네 트워크 코드와 파일 시스템이 전부 리눅스 특유의 오리지널 코드를 갖게 된 것은 놀라운 일이었다. SVR4조차
BSD에서 유래된 ufs를 사용하던 당시에 리눅스는 Remy Card의 ext2 파일시스템을 사용하기 시작한다. ext2파일
시스템은 masix에 사용하려고 설계했던 파일 시스템이다. 네트워크 코드 역시 다시 작성한 것이다. 그 외에도 수
없이 많은 코드가 처음부터 다시 작성됐다. 지금은 빛이 바랜 표현이 됐지만 ‘리눅스 민간신앙’이나
‘리눅스는 종교다’하는 말로 리눅스에 빠진 사람들을 빗대기도 했다. 아무런 보상이 없어 보이는 이러한 작업의 열기와
리눅스의 놀라운 성공은 리눅스의 문서화(LDP)나 인터넷을 통한 집단적 작업에도 의존했다.
이 러한 작업들과 성과에도 불구하고 정작 리눅스 커널에 관한 좋은 문서나 서적이 별로 없었다는 것은 놀라운
일이다. 필자가 리눅스 커널을 분석하려고 했을 당시에는 「Kernel Hacker's guide」 외에는 쓸만한 자료가
별로 없었다. 처음에는 필자의 머리 탓을 많이 하기도 했지만 나중에야 다른 운영체제도 별반 다를 것이 없다는
것을 알게 됐다. NetBSD의 UVM에서도 BSD VM을 다룬 문서를 구할 수가 없었던 것이 초기 작업의 가장 어려운
점이었다고 한다. 리눅스의 VM 역시 문서가 별로 없는 편이다(http://www.linux-mm.org). 장치 드라이버와
달리 VM이나 VFS는 매우 높은 수준의 주제이고 관련된 지식을 많이 필요로 한다. 결국 이러한 자료 부족 문제는
소스 코드만으로는 알 수 없는 관련 배경 지식의 형성까지 포함해 진입 장벽으로 남을 것이고 결국 개발자의 수를
더 제한하는 것이다.
리 눅스의 인기와 수요에도 불구하고 책은 더 부족한 상태였다. 리눅스 커널에 대한 책은 별로 볼만한 것이 없었다.
최근에 D.Bovet이 쓰고 오라일리에서 출판된 『Understanding the Linux Kernel』은 자신들의 말에 따르면
기계 의존적(machine-dependent) 리눅스 커널 해설서라고 한다(이 책은 최근 한빛미디어에서 번역본으로
출판됐다. 이 책의 번역은 대체로 매우 높은 수준이다. 어쩌면 이전 원서에서 언어 장벽 때문에 이해하지 않고
넘어갔던 부분들이 다시 눈에 들어올지도 모른다). 많은 사람이 이 책을 통해 리눅스 커널을 더 깊이 이해하겠지만
운영체제의 전반적인 부분에 대한 리뷰를 더 필요로 하게 될 것이다.
이 번호에서 유닉스 역사를 다룬 것은 유닉스를 효과적으로 이해하려면 서로 다른 유닉스 기술을 전반적으로
이해해야 한다는 것을 강조하기 위해서였다. 코드를 그대로 쓰는 것이 불법이 아니라면 B라는 개발자가 A라는
개발자의 아이디어를 자신의 코드로 구현하고 개량하는 것이 발전의 한 방법일 수도 있다는 것을 유닉스의
역사가 보여주고 있다. 이러한 식으로 서로 영향을 주면서 유닉스 계열의 운영체제는 발전하고 있다.
- 끝 -