코드스쿼드 미션 하면서 추천받은 <유닉스의 탄생>을 읽었다. 읽다 보니 궁금해지는 지점들이 많아서 관련 내용들을 이리저리 찾아 보았다. 재미있는 부분들이 많아서 글로 정리해 본다.
사장님 저희도 좋은 컴퓨터 좀 사주세요
1960년대 초에는 MIT에서 개발한 CTSS라는 OS가 많은 인기를 끌었다. 당시 대부분의 OS는 천공 카드에 프로그램을 입력하고 결과 나올 때까지 한 사람씩 하염없이 기다려야 했다. 그러던 와중에 CTSS가 시분할 시스템을 도입하면서 생산성이 급상승했고, 이에 고무된 MIT는 더 발전된 OS를 만들겠다는 꿈을 꾼다. 그래서 개발되기 시작한 것이 멀틱스(Multics)라는 운영체제다.
결론부터 말하면 힘을 너무 주고 개발을 시작한 나머지, 멀틱스는 필요 이상으로 복잡하고 비대해졌다. 당시 MIT는 내부 인력뿐만 아니라, 제너럴 일렉트릭과 AT&T의 벨 연구소까지 함께 개발하기로 결정하면서 멀틱스를 대형 프로젝트로 만든다. 개발 과정에서 점점 프로젝트가 산으로 가는 느낌이 들자 벨 연구소는 멀틱스 개발에서 손을 뗀다.
그 이후에도 멀틱스 개발에 참여하던 켄 톰프슨 등의 벨 연구소 인력들은 계속해서 운영체제 개발을 하고 싶어 하는데, 이미 멀틱스 프로젝트에 참여했다 쓴맛을 봤기 때문에 경영진은 운영체제 개발을 위해 좋은 컴퓨터를 사주려고 하지 않았다. 그마저도 처음에는 켄 톰프슨이 어디서 굴러다니던 구식 소형 컴퓨터인 PDP-7을 주워와서 개발하다가, 이후 PDP-10을 구매해 달라는 요청이 거부당하고, 그보다 훨씬 싼 미니컴퓨터인 PDP-11를 (그마저도 업무용 특허출원서 양식 작성 SW를 개발한다는 명분으로) 가지고 운영체제 개발을 시작했고, 이것이 훗날 유닉스가 된다.
이런 걸 보면 그냥 책에 몇 줄 나와있는 팩트들도 다 진짜 사람들의 이런저런 사정들이 겹쳐서 나온 결과물이란 사실을 느끼게 된다. 특히 회사가 돈을 지원 안 해줘서 짱짱한 컴퓨터를 못 샀다는 얘기는 뭔가 스마트폰 처음 쓰던 때랑 비슷한 느낌. 어린 학생이라 돈이 없어서 ‘버스폰'이라고 불렸던 아트릭스를 사서 그나마 최적화를 해보겠다고 이리저리 건드리고 커스텀 롬 깔고... 그 때 아이폰이나 갤럭시를 살 수 있었다면 그런 경험은 해보기 어려웠을 것이다. <유닉스의 탄생>에서도 켄 톰프슨이 튜링상 수상 소감으로 비슷한 이야기를 한 것을 인용하고 있다. 그런 걸 보면 현실의 제약은 한발짝 더 나아가는 결과를 내는 데 어느정도 도움이 되는지도 모른다. 웃기다.
산업 전반에 걸쳐 중앙 집중식 메인프레임 컴퓨터에서 자율 운영되는 미니컴퓨터로 전환이 일어나면서 유닉스는 급격히 인기를 얻었습니다. 만약 대니얼 밥로(PDP-10용 운영체제 개발자)가 PDP-10을 구하지 못하고 PDP-11에 만족해야 했다면 저 대신 그가 여기에 있었을지도 모릅니다.
Unix 집안 사람이 되려면 Posix를 따라라
유닉스의 가장 대표적인 특징은 계층적인 파일 시스템, 데이터 저장에 일반 덱스트(plain text)를 사용하는 것, 외부 장치 등의 요소도 파일로 취급하는 것 등 여러 요소가 있다. 이런 유닉스의 특징과 더불어 여러 API 등의 표준을 정해 놓은 것이 POSIX다.
POSIX는 Portable Operating System Interface의 약자로(X는...?), 기존 Unix 기반 운영체제들이 다양해지면서 발생한 파편화를 줄이기 위해 탄생했다.POSIX 규격을 따르는 운영체제들은 ‘Unix-like OS’ 라고 불린다. 여기에는 BSD, Linux, macOS, Solaris 등이 있다. 이런 Unix-like OS에 대한 이야기는 뒤에서 더 하기로 하고, 그럼 우선 POSIX의 구체적인 내용에는 어떤 것들이 있는지 살펴보자.
POSIX C API
POSIX C API는 ANSI C 표준에 여러 기능이 더해져 있다. 시스템 프로그래밍이나 네트워크 등의 CS 과목을 공부하다 보면 만나게 되는 <pthread.h(쓰레드)>나 <sys/socket.h(소켓)> 등의 라이브러리를 막연히 ‘C에서 제공하는 API’라고만 생각했었는데, 이것도 POSIX의 일부다. C 언어 자체는 다양한 환경에서 범용성 있게 구동되는 기본적인 라이브러리를 제공하고 있고, 그 외에 이렇게 OS와 밀접하게 연관되어 있는 부분은 사실 C가 아니라 POSIX 표준에서 C API 형태로 제공하는 것이다. (pthread는 POSIX Thread의 약자다!) POSIX C API 목록은 여기에서 확인할 수 있다. 또, POSIX 원문에서 각 API를 검색해 살펴볼 수도 있다.
디렉터리 구조
흔히 리눅스를 비롯한 Unix-like OS에서 표준처럼 사용되는 파일 디렉터리 구조(/bin, /boot, /dev, /etc, /home...)는 사실 엄밀하게 말하면 POSIX에서 정의된 것은 아니다. 이에 관해서는 리눅스 재단의 FHS(Filesystem Hierarchy Standard)에 정리되어 있다. POSIX에서는 root 디렉토리(/), /dev와 하위 디렉토리(/dev/null, /dev/tty 등), /tmp 디렉토리에 대한 설명만 기재되어 있다.
환경 변수
시스템 전반에서 사용되는 환경 변수에 관한 내용. 변수명은 역시 POSIX에 규정된 Portable Character Set 가운데에서만 사용할 수 있다. 재미있는 것은 ‘숫자로 시작하는 변수명은 권장하지 않는다'라고 되어 있다는 점. 많은 프로그래밍 언어에서 숫자로 된 변수명은 사용 불가인데, 사용 자체는 가능한 모양이다. 다만 “다른 어플리케이션들은 그런 변수명을 처리하는 과정에서 문제를 일으킬 수 있으니 권장하지 않는다"라고 말하고 있다. 기본적으로 정의되어 있는 변수에는 유저의 home 디렉토리의 경로를 나타내는 HOME, 유저의 로그인 id를 의미하는 LOGNAME, 현재 작업 중인 디렉토리를 나타내는 PWD 등이 있다.
문자열 포맷
POSIX는 파일, 표준 입출력(standard output) 등에 사용할 수 있는 문자열 포맷에 관한 규정도 정해두고 있다. 여기에는 일반적인 character 문자는 물론, printf() 함수에서 문자열, 정수 등의 변수를 지칭할 때 사용하는 ‘%s’나 ‘%d’ 등의 형식 지정자(POSIX에서는 input conversion이라고 말하고 있다) 등이 있다.
이외에도 메모리 관리 정책이나 Locale 설정에 관한 내용, grep 등과 함께 쓰이는 정규표현식에 대한 설명 등 다양한 내용이 포함되어 유닉스의 표준을 구성하고 있다. POSIX 전문은 여기에서 살펴볼 수 있다.
각계각층에서 활약하는 Unix 집안 OS들
이런 POSIX 규격을 따르는 OS를 Unix-like OS라고 한다. 유닉스와 밀접한 관계를 가진 OS로 가장 잘 알려진 것은 아무래도 리눅스다. 그 외에도 BSD나 macOS 같은 OS도 POSIX를 준수하여 Unix-like OS라고 불린다. 하지만 실제 POSIX 인증을 받기 위해서는 꽤 복잡한 절차와 많은 비용이 들기 때문에 리눅스는 물론 Unix의 정식 후계자라고 불리는 BSD도 공식 인증을 받지 않았다. 재미있는 지점은 BSD에서 많은 영향을 받았다는 macOS는 또 공식 인증을 받았다는 점이다. 다만 macOS는 일반 사용자를 타겟으로 한 GUI OS로서의 성격 때문에 많은 작업에 터미널이 필수적이지 않고, root 권한을 가지더라도 시스템 조작에 다소 한계가 있는 등 전통적인 유닉스 계열 OS와는 다른 독자적인 지점들이 많다. 애플에서는 공식적으로 2011년에 OS X for Unix Users라는 문서를 만들어 배포한 적도 있는데, 문서에 쓰여 있는 “The power of UNIX. The simplicity of Mac.”이라는 문구를 보면 애플이 생각하는 유닉스와 macOS의 관계가 어떤 것인지 명확해진다.
Unix: (iOS와 macOS를 쓰다듬으며) 제 귀여운 자식놈들이죠.
iOS: 형, 왜 아빠는 우리보다 돈을 못 벌어?
macOS: 야 조용히 해.
야밤의 공대생 만화 <유닉스의 탄생> 중
리눅스는 오픈소스라는 강점과, 커널을 중심으로 벤더들이 확장하는 것이 가능해 여러 배포판이 다양한 플랫폼에서 사용되며 서버 시장에서 압도적인 점유율을 자랑하고 있고, macOS는 독자 HW에서만 구동됨에도 애플이라는 기업이 기업이니만큼 영향력이 커지고 있는 것과 비교해 전통적인 유닉스의 영향력에 대해 앞으로도 의문을 표하는 사람들이 많긴 하지만, 이렇게 공부해 보니 유닉스라는 운영체제가 끼친 영향력이라는 건 엄청 크긴 하구나 하는 생각이 든다. 자료를 찾다 보니 리눅스와 유닉스의 커널 구조 차이를 설명한 글도 있었는데, 앞으로 OS에 대해서 좀 더 공부하다 보면 이런 깊은 내용들도 공부해보고 싶다.
참고자료
'CS' 카테고리의 다른 글
외계어 같은 git 메시지들을 이해해 보자 (3) | 2022.08.07 |
---|---|
그래서 다익스트라는 얼마나 걸리는 거예요? (2) | 2022.06.27 |
관계형 모델은 DB를 어떻게 바꾸었을까? (0) | 2022.05.09 |
"컴파일은 됐는데 실행하다 뻑난다"의 의미 (0) | 2022.02.25 |
재귀함수는 스택 메모리에서 어떻게 동작할까? (0) | 2022.02.18 |
댓글