4월이 다 가기 전에 책 한 권을 더 읽었습니다. 평소에 독서를 즐겨하는 편은 아니지만, 작년보다는 책을 더 읽으려고 노력 중입니다. 근데 잘 안 되네요…
아무튼 도서관에서 볼만한 책이 있나 살펴봤는데, 문득 이 책에 눈길이 머물렀습니다. 개인적으로는 아스키 아트로 뽑은 책 표지가 터미널 감성을 잘 살리는 것 같아서 이쁘더군요.
최신 기술을 다루는 실용서도 좋긴 하지만, 안 그래도 작년에 운영체제를 비롯한 CS 공부를 집중적으로 해서 그런지 유닉스라는 주제에 대해서도 관심이 가더군요. 리눅스를 비롯한 다양한 운영체제가 유닉스 계열이라는 것도 들어보았기 때문에, 유닉스의 탄생 배경에 대해서도 호기심이 생겼습니다.
이번 포스트를 통해 유닉스 탄생의 배경, 발전, 그리고 남겨진 유산에 대해 궁금하신 분들에게 도움이 되었으면 좋겠습니다.
책 소개
원서의 제목은 『UNIX: A History and a Memoir』 입니다. 저자 브라이언 커니핸은 미국 AT&T의 벨 연구소에서 유닉스의 탄생과 발전, 번성과 쇠퇴를 직접 지켜본 사람으로서 탄생 50주년을 맞아 이 책을 발표했다고 합니다.
장르는 회고록에 가깝고, 책은 다음과 같은 순서로 이루어져 있습니다.
- 유닉스가 만들어지기 전 벨 연구소를 둘러싼 시대적 배경 소개
- 유닉스 개발 과정
- 유닉스가 컴퓨터 기술 발전에 미친 영향
- 유닉스의 파생과 진화
- 벨 연구소의 분리로 인한 유닉스의 쇠퇴
AT&T의 벨 연구소
유닉스가 어떻게 만들어졌는지 이해하려면 벨 연구소를 알아야 한다. 특히 벨 연구소가 일한 방식과 창조적인 연구 환경을 이해해야 한다.
- 33p
본문은 위와 같은 문장으로 시작됩니다. 왜냐하면 유닉스는 AT&T의 벨 연구소 내 1127 센터에서 만들어졌기 때문입니다. 책 초반부는 여기에 대한 역사적 환경을 서술합니다.
- AT&T(American Telephone and Telegraph Company): 미국 전역에서 많은 지역 전화 회사를 합병하면서 생긴 당시 미국 최대의 통신 회사, 현재는 반독점법 규제로 인해 여러 회사로 분할됨
- 벨 연구소(Bell Telephone Laboratories): AT&T 전화 시스템의 과학적/공학적 문제 해결을 위한 연구소
- 1127 센터: 벨 연구소는 연구 분야에 번호를 매기는 방식으로 관리 체계를 구성했는데, 당시 컴퓨팅 과학 연구소가 1127번이었음
벨 연구소는 당시 모회사 AT&T의 막대한 영향력(?)을 바탕으로 연구원들에게도 최적의 연구 환경을 제공했는데, 그 내용이 책 마지막 부분에 정리되어 있었습니다.
- 안정적인 환경을 제공: 벨 연구소의 연구원들은 자금에 상관 없이 연구하고 싶은 분야를 자유롭게 연구할 수 있었음
- 문제가 풍부한 환경: 컴퓨터 과학은 새로운 분야였고 이론과 실제 측면에서 탐구할 아이디어가 많았음
- 최고의 인재 채용: 인적 자원을 매우 세심히 관리하고, 채용 전문가가 아니라 연구자 면접에 참여하는 채용 문화
- 기술적 관리: 관리자들은 자신이 관리하고 있는 업무들을 완전히 파악했고 다른 부서와의 협력을 적극적으로 도움
- 협력하는 환경: 연구원들은 각 분야에서 세계를 선도할 정도의 전문가였고, 이들끼리 서로 협력하는 문화가 갖춰짐
- 300p ~ 308p
당시 1127 센터에서 연구원으로 있던 켄 톰프슨, 데니스 리치, 더글러스 매킬로이가 유닉스의 탄생을 가능하게 한 인물들입니다.
유닉스 탄생 배경
벨 연구소가 멀틱스 프로젝트에서 빠져나왔을 때, 거기에 참여했던 사람들은 다른 할 일을 찾아야 했다. 켄 톰프슨은 여전히 운영체제 개발을 하고 싶어 했다.
- 80p
사실 유닉스가 탄생하기 전에도 운영체제는 있었습니다. 당시에는 각 하드웨어 제조사가 직접 운영체제를 만들어 제공했는데, 그러다보니 제조사가 다른 하드웨어끼리는 서로 간의 호환성이 없었습니다. 하드웨어 별로 어셈블리어가 모두 다르게 동작했기 때문이었죠. 때문에 여러 컴퓨터에서 돌아가는 소프트웨어를 만들기는 불가능에 가까운 일이었습니다.
그러던 1960년, MIT에서 CTSS라고 불리는 시분할 기법이 적용된 최초의 운영체제를 만들었습니다.
당시 컴퓨터는 엄청나게 크고 비쌌기 때문에 한 대의 컴퓨터에 여러 사용자가 접속하는 방식으로 사용해야 했습니다. CTSS는 로그인된 여러 사용자에게 시분할 기법을 이용해 컴퓨팅 자원을 분배했는데… 이것이 마치 혼자서 컴퓨터를 쓰고 있다고 느낄 정도로 쾌적한 사용자 경험을 제공했습니다!
이것이 너무나 생산적이었기에 MIT는 벨 연구소와 함께 CTSS를 발전시킨 새로운 운영체제, 멀틱스(Multics) 를 만들기로 했습니다. 하지만 새로운 기능을 추가하는 동시에 너무 많은 문제를 한꺼번에 해결하려 하다보니 지나치게 복잡한 프로젝트가 되고 말았습니다. 결국 벨 연구소는 이 프로젝트에서 손을 떼게 됩니다.
1127 센터의 켄은 여전히 운영체제 개발을 하고 싶어했지만, 벨 연구소의 경영진과 관리자들은 멀틱스에 한 번 데인 경험 때문에 운영체제 개발을 허락하지 않았습니다. 그래서 켄은 별 수 없이 다른 연구를 시작했죠. 켄은 구식이 되어버린 PDP-7 컴퓨터 한 대를 구해 디스크 처리율 극대화를 위한 알고리즘 연구를 시작합니다.
켄은 어떤 디스크에서든 처리율을 극대화하기 위한 디스크 스케줄링 알고리즘을 작성했다. 이제 문제는 ‘알고리즘을 어떻게 시험할 것이냐’였다. 시험을 하려면 디스크에 데이터를 적재해야 했고, 켄은 디스크에 대량의 데이터를 넣을 프로그램이 필요하다고 결정했다.
…
“어느 순간 저는 3주 더 작업하면 운영체제가 만들어지리라는 걸 깨달았습니다.”
- 81p
이렇게 작성한 알고리즘을 테스트하기 위해서 켄은 디스크에 파일을 적재할 프로그램을 작성합니다. 코드를 작성할 에디터, 하드웨어에서 실행 가능한 기계어로 변환하는 어셈블러, 그리고… 커널이었죠!
컴퓨터 기술 발전에 대한 기여
이렇게 우연한 계기로 유닉스가 탄생했지만, 유닉스는 벨 연구소에서 시작한 공식 프로젝트가 아니었기 때문에 1127 센터의 일부 연구원들만 사용하는 운영체제였습니다. 유닉스 프로젝트가 벨 연구소로부터 공식적인 지원을 받기 위해서는 경영진을 설득해야 했는데, 이것이 쉽지 않았습니다.
결국에는 벨 연구소 내부 구성원들을 위한 소프트웨어인 특허 출원용 문서 편집기를 탑재한다는 조건을 걸어서야 경영진들을 설득할 수 있었고, 그 후터는 본격적인 지원을 받게 되었습니다.
이 때부터 유닉스의 버전이 올라감에 따라 컴퓨터 기술에 대단한 발전이 있었기에, 일부를 소개하고자 합니다.
- 파일 시스템: 디스크같은 보조기억장치를 파일과 디렉토리 구조로 계층화
- 시스템 호출: 커널의 동작(하드웨어 접근, 프로세스 관리, 네트워크 연결 등)을 추상화하고 인터페이스로 제공
- 셸: 사용자가 명령어를 실행하도록 해주는 프로그램이자 사용자와 운영체제 간의 주된 인터페이스, 셸 스크립트로 프로시저 자동화
- 파이프: 어떤 프로그램의 출력을 다른 프로그램의 입력으로 받는 메커니즘
- 정규표현식: 텍스트 패턴을 명시하는 표기법
- C언어: PDP-7용 유닉스를 PDP-11로 이식하는 과정에서 생긴 불편함을 해결하기 위해 데니스 리치가 개발한 언어
- 랫포: C언어의 문법을 적용된 혼종 포트란 을 유효한 포트란으로 변환해주는 컴파일러
한편으로는 유닉스 사용자들의 생산성 향상을 위한 다양한 도구가 추가되었습니다.
- Yacc: 구문 분석기를 생성하는 프로그램
- PCC: Yacc를 이용해 재작성한 이식성 있는 C언어 컴파일러
- Lint: 프로그램 소스코드의 유효성 검사를 위한 프로그램
- Eqn, Lex: 수식 표현용 언어
- Lex: 어휘 분석기를 생성하는 프로그램
- Make: 여러 프로그램들의 의존 관계를 설정하는 프로그래밍 언어
- Roff: 유닉스에서 생성된 최초의 텍스트 포매팅 프로그램
- Nroff: Roff를 개선하여 특허 출원서를 요구되는 형식에 맞게 출력해주는 프로그램
- Troff: Nroff를 개선하여 가변 글꼴, 특수문자 입력 등을 지원하는 프로그램
이 중에서 문서 생성용 도구들을 좀 더 주의깊게 살펴봅시다. 1127 센터의 구성원들은 직접 개발한 소프트웨어를 이용해 영향력있는 책을 많이 출간한 것으로 유명합니다. 저자는 이렇게 할 수 있었던 이유를 다음과 같이 설명합니다.
첫째, 벨 연구소 연구자들은 글쓰기를 진지하게 대했고, 스스로 글을 공들여 썼으며, 다른 사람들이 쓴 글을 읽고 훌륭한 비평을 제시했다. 모두 서로의 글을 읽는 데 시간을 할애했고, 동료가 쓴 글에 대해 상세한 의견을 제공하는 것은 문화의 일부였다. 이런 문화는 어디서나 늘 있는 것은 아니었고, 벨 연구소를 훌륭한 일터로 만들어준 요인 중 하나였다.
…
둘째, 연구소 경영진이 책 쓰기를 지지해주었다. 우리는 경영진의 지원에 힘입어 6개월간 책 쓰는 데 전적으로 시간을 투자할 수 있었다. 벨 연구소 저자들이 쓴 출판물은 인력 채용에 중요한 역할을 했다.
…
세 번째 요인은 더 기술적이다. 프로그래밍 환경으로서 C와 유닉스, 연구 분야로서의 문서 생성, 컴퓨터 기술을 주제로 한 글쓰기를 주요 활동으로 삼은 것 간의 공생관계다. 문서를 쉽게 수정할 수 있어서 더 나은 글쓰기가 가능해졌다는 점은 분명하다.
- 203p
연구원들끼리 글쓰기를 장려하는 문화가 있다는 것이 놀랍고 대단하게 느껴졌습니다. 글을 쓰는 건 사실 굉장히 귀찮은 일이기도 하니까요. 글쓰기의 중요성을 다시금 깨닫게 된 부분이었습니다.
파생과 진화
1973년에 AT&T는 명목상의 수수료만 받고 대학교에 유닉스 라이선스를 주기 시작했다.
…
라이선스를 취득한 단체 중 가장 적극적으로 활동한 곳은 캘리포니아 대학교 버클리였다. UC 버클리에서는 여러 명의 대학원생이 시스템 코드에 중요하게 이바지했고, 결국 버클리 소프트웨어 배포판(BSD)이 만들어졌다.
- 241p
1973년, AT&T는 명목 상의 수수료만 받고 대학교에 유닉스 라이선스를 주기 시작했습니다. 소스 코드도 함께 제공했지만, 사용자에게 기술 지원을 전혀 제공하지 않는 형태였죠.
사용자들은 서로를 돕기 위해 어쩔 수 없이 뭉쳐야만 했고 직접 프로그램을 만들어야 했습니다. 이 과정에서 전 세계에 유닉스 사용자 그룹이 생기기도 했고, 이들로부터 vi 같은 유명한 문서 편집기가 나오기도 했죠.
그리고 이 맘때쯤 PCC가 개발되었습니다. 이 덕분에 다양한 아키텍처에서 동작하는 C 컴파일러를 간단히 만들 수 있었습니다. 덕분에 유닉스는 여러 하드웨어에 걸쳐 이식이 가능해졌고, 개인용 컴퓨터(PC)의 보급으로 인해 유닉스는 더욱 널리 퍼졌죠.
유산
이는 유닉스가 적어도 사업적으로는 성공할 가능성이 있었음을 의미한다. 하지만 효과적으로 사업을 보호하기에는 너무 늦은 상태였다. AT&T의 소스 코드 사용에 제한이 있었다고 해도 시스템 호출 인터페이스는 사실상 공공 영역에 있었고, AT&T 라이선스에서 자유로운 버전을 만드는 일이 일상화될 정도로 커뮤니티에 전문가들이 넘쳐났다.
…
AT&T는 황금 알을 낳는 닭이 닭장을 나간 뒤에야 문단속을 하려는 꼴이었다.
- 275p
소스 코드가 쉽게 풀린 덕분에 시장에는 유닉스를 기반으로 한 수많은 변종 운영체제가 생겨났습니다. 그러다 유닉스 간 호환성 문제가 다시 발생하게 되고, 여기에서 기본 라이브러리 함수에 대한 표준인 POSIX(Portable Operating System Interface) 가 탄생하게 됩니다. 덕분에 유닉스 기반의 운영체제는 유닉스의 표준 라이브러리와 셸, 공통 명령어를 사용할 수 있게 되었습니다. 우리가 흔히 쓰는 MacOS, 리눅스에서 유닉스 기반의 명령어를 사용할 수 있는 이유입니다.
AT&T는 유닉스의 사업성을 뒤늦게 깨닫고 지루한 법적 분쟁을 벌이게 되지만, 유의미한 성과를 얻지 못하고 패소합니다. 결국 AT&T가 반독점법 규제로 인해 분할까지 되면서, 유닉스는 쇠퇴의 길을 걷게 됩니다.
유닉스에 대한 이야기는 여기까지이지만, 유닉스가 현재의 컴퓨터 시스템에 남긴 유산은 아직까지도 이어지고 있습니다. 기술적 측면에서 이를 정리해봅니다.
- 계층적 파일 시스템: 파일과 디렉토리로 시스템 구조를 계층화하고 이 구조가 재귀적으로 반복될 수 있음
- 고수준 구현 언어: 사용자 프로그램을 만드는 용도 뿐만 아니라 하드웨어에 제약되지 않는 언어가 만들어짐
- 사용자 레벨의 프로그래밍 가능한 셸: 셸을 이용해 프로그래밍이 가능하며, 사용자 레벨 프로그램이기 때문에 누구나 직접 셸을 개선할 수 있음
- 파이프: 어떤 프로그램의 출력을 다른 프로그램의 입력으로 받는 메커니즘
- 도구로서의 프로그램: 한 가지 프로그램이 하나의 작업만 하게 만들고 이를 파이프로 연결해 사용하는 분할 정복 메커니즘
- 프로그램을 작성하는 프로그램: 자동화 해주는 기계조차 자동화해서 만드는 것, 이를 통해 이식 가능한 운영체제가 탄생할 수 있었음
- 특화된 언어: 특정 도메인과 목적에 최적화된 다양한 언어들이 만들어짐
- 292p ~ 299p
후기
개인적으로 유익한 내용이 많았고 흥미롭게 읽었습니다. 마침 작년에 운영체제 수업을 듣기도 했었고, 무엇보다도 제가 한 번이라도 들어본 적 있거나 사용해 본 적 있는 도구들이 유닉스 개발 과정에서 비롯된 것임을 새롭게 알았기 때문입니다.
다만 역사와 관련된 배경지식이 꽤 상세하게 언급되기 때문에… 컴퓨터 과학 관련 배경지식이 부족하다면 개인적으로는 읽기 힘들지 않을까 싶기도 합니다. 저자의 주변 인물을 비롯해, 당시 하드웨어, 초창기 기술 이야기가 나오기 때문입니다. 이건 사실 저도 잘 모르는 부분이 많아서 검색해 가면서 읽었습니다.
유닉스에 대한 내용만 정리하자면 훌륭한 인재들을 훌륭한 환경에 모아두어서 나온 훌륭한 작품이라고 말할 수 있을 것 같네요. 물론 저자는 유닉스의 창시자들을 영웅으로 치우켜 세우는 것도 아니고, 어느정도 행운이 뒷받침되었다고 표현하기도 합니다만, 저희같은 일반인이 보기에는 굉장히 겸손한(…) 모습이라고 생각할 수밖에 없네요.
저자의 주변 인물들로 언급된 사람들은 실제로 컴퓨터 과학에서 한 자리 하시는 대단한 분들이셨기 때문입니다. 개인적으로는 구글의 창업자 에릭 슈밋이 여름 인턴으로 근무했다는 소식이 좀 충격이었습니다. 물론 저는 천재가 아니기 때문에 이런 인물이 될 수는 없지만, 한편으로는 이런 천재들이 모여있는 환경에 들어가는 것만으로도 좋은 영향을 받을 수 있겠다는 생각도 들었습니다.
한편으로는 단순히 이런 책을 읽는 것이 즉각적인 퍼포먼스를 올리지는 않기 때문에 읽기를 망설이는 분도 계실 것 같다는 생각도 들었는데요, 마침 이 책을 읽어야 할 이유를 한 마디로 요약하는 문장을 발견했습니다.
우리가 당연시하면서 사용하는 기술의 진화 과정을 이해하는 일은 중요하다.
- 21p
개인적으로는 이 말에 100% 공감했습니다. 그래서 유닉스 기반 시스템을 쓰고 계신 분이라면 개인적으로 이 책을 권해드리고 싶네요.