티스토리 뷰

크리에이티브 커먼즈 라이선스
Creative Commons License

The Design of The UNIX Operating System

Maurice J.Bach


소스코드 참조는 이 웹페이지에 첨부된 파일에서

http://www.c-c-g.de/literatur/211-lions-commentary-on-unix-6th-edition-with-source-code

lions_book_commentary.pdf

lions_book_unixv6_source.pdf


책은 여기서 참조 

http://tenox.net/docs/misc/The_Design_of_the_UNIX_Operating_System_Maurice_Bach.pdf

http://athena.nitc.ac.in/nayak_b120692cs/acad/the_design_of_the_unix_operating_system.pdf


이책에서 "UNIX 시스템", "커널", "시스템" 과 같은 말이 많이 나오는데 모두 UNIX 운영체제의 커널을 의미하는 말이다. 혹은 커널과 하드웨의 합집합을 의미하기도 하는데, 문맥에 따라 이해 해야한다.

서문

UNIX 시스템은 Ken Thompson과 Dennis Ritchie에 의해 1974년 Communications of the ACM의 한 논문[Thompson 74]에서 처음으로 소개되었다. 그 이후로 점점 더 많은 업자들이 그들의 컴퓨터 상에서 UNIX를 지원함에 따라, 컴퓨터 산업에서 UNIX는 점차 보급되어 일반화되었다. UNIX 시스템은 특히 운영체제 연구와 사례 연구용으로 대학에서 널리 사용되고 있다.

많은 책과 논문들이 UNIX 시스템의 각 부분에 대해서 기술하고 있으며, 이중에는 Bell System Technical Journal의 1978년도 [BSTJ 781]와 1984년도 [BSTJ 84]의 특집호가 있다. 많은 책들이 사용자 수준 인터페이스에 관해서 설명하고 있는데, 특히 이메일 사용법, 문서 작성법, shell이라 불리우는 명령어 번역기의 사용법 등에 대해 다루고 있다. The UNIX Programming Environment [Kernighan 84]와 Advanced UNIX Programming [Rochkind 85]과 같은 책에서는 프로그래밍 인터페이스에 대해 기술하고 있다. 이 책에서는 운영체제의 기본적인 부분(커널이라 불리우는)을 구성하는 내부 알고리즘과 구조, 그리고 이들 과 프로그래머 인터페이스와의 관계를 설명한다. 따라서 이 책은 여러 환경에서 활용될 수 있을 것이다. 첫째로는 학부 고학년이나 대학원 1학년 수준의 운영체제 수업용 교과서로서 사용될 수 있다. 이 책을 사용할 때에는 시스템 소스코드를 참조하면 가장 유익하지만, 채만 독립적으로 읽을 수 있다. 둘째로는 시스템 프로그래머들이 커널의 동작에 대해 보다 잘 이해하고자 할 때나, UNIX 시스템에서 사용된 알고리즘을 다른 운영체제에서 사용된 알고리즘과 비교할 때 참조할 수 있다. 마지막으로 UNIX 시스템 상의 프로그래머들이 그들의 프로그램이 시스템과 어떻게 상호작용하는가에 대해 더 깊은 이해를 얻고자할 때 참조할 수 있을 것이며, 그로 인해 좀더 효율적이고 세련된 프로그램을 작성할 수 있을 것이다.


이책의 내용과 구성은 1983년부터 84년까지 AT&T Bell 연구소에서 내가 준비하여 가르친 코스로부터 발전된 것이다. 그 코스에서 시스템의 소스코드를 읽어나가는데 주력하는 동안, 나는 일단 알고리즘의 개념을 파악하면 소스코드를 읽는 것이 훨씬 쉬워진다는 것을 발견하였다. 나는 시스템의 간단하면서도 정연한 특성을 다소라도 반영하면서, 가능한 간단하게 알고리즘을 설명하고자 노력하였다. 따라서 이 책은 시스템 소스코드를 한줄한줄 영어로 번역한 것이 아니라, 다양한 알고리즘들의 기본적인 흐름에 대해 기술하고 있으며, 가장 중요한 것은 이를 알고리즘들이 어떻게 상호작용하는 가를 기술하였다는 점이다. 알고리즘들은 C와 비슷한 의사코드(pseudo code)로 표현하여 독자들이 그 자연스러운 언어 묘사을 이해하는데 돕고자 하였으며, 그들의 이름은 커널 안의 프로시져 이름을 따랐다. 그림들은 시스템이 여러 데이터 구조를 조작할 때, 다양한 데이터 구도들간의 관계를 보여준다. 뒷부분의 장에서는 간단한 C 프로그램들을 삽입하여, 사용자에게 시스템의 개념들을 명확하게 나타낸다. 제한된 지면에서 명확하게 설명하기 위해, 이들 프로그램에서 오류 조건을 검사하지 않았지만, 실제 프로그램 작성시에는 이런 것들은 반드시 검사되어야 한다. 나는 프로그램들을 System V에서 동작시켰다. System V 고유의 기능을 사용하는 프로그램을 제외하고는, 이 프로그램들은 다른 버전의 시스템에서도 동작한다.


코스를 위해서 준비했던 많은 연습 문제들을 각 장의 끝부분에 포함시켰으며, 이 연습 문제들은 이 책의 중요한 부분을 차지한다. 연습 문제 중 몇몇은 본문에서 나온 개념을 보여주기 우한 것으로서 쉬우며, 또 어떤 것들은 독자가 시스템을 좀더 깊이 이해하는 것을 돕기 위한 것으로 좀 어려우며, 몇몇은 연구문제로 검토하기 위한 것으로서 탐구적인 성격을 띄는 문제도 있다. 어려운 문제에는 별표로 표시하였다.


시스템의 설명은 AT&T에서 지원하는 UNIX System V release 2를 기본으로 하고, release 3의 새로운 기능중 일부를 추가로 하였다 이 시스템이 내가 가장 친숙한 시스템이기는 하지만, 나는 운영체제에 대한 다른 변형들의 흥미로운 기여, 특히 Berkeley Software Distribution (BSD)의 기여를 설명하고자 노력했다. 이 책에서는 일반적인 용어로 커널-하드웨어 인터페이스를 망라하고자 하였으며, 특별한 컴퓨터의 특성은 무시함으로써, 특별한 하드웨어의 기능을 가정하는 문제는 피하였다. 그러나 특정 하드웨의 특이점(idiosyncrasies)이 커널의 구현을 이해하는 데 있어서 중요한 경우에는, 관련된 사항을 자세히 살펴보았다. 적어도 이들 주제에 대한 검토는 운영체제에서 가장 컴퓨터에 의존적인 부분을 강조할 것이다.


독자들이 이 책을 이해하기 위한 필수 조건으로는 고급 언어를 사용하여 프로그래밍해본 경험이 있어야 하며, 어셈블리어로 프로그램 한 경험이 있다면 더욱 좋다. 독자에게 UNIX 시스템을 사용해 보고, C언어 [Kernighan 78]를 공부하기를 추천한다. 그러나 독자들이 그런 배경을 갖추지 않고서도 이 책의 내용을 이해할 수 있도록 이책을 엮고자 하였다. 부록으로 시스템 호출에 대한 간단한 설명을 수록하였으므로, 완전한 참조 매뉴얼은 아니나 이 책을 이해하기에는 충분할 것이다.


역주: 실제로는, 이 책을 이해하기 위해 어셈블리어, 컴퓨터 구조, C 언어, 자료구조에 대한 지식과  xNIX 계열 OS(LINUX, Solaris, FreeBSD 등등)를 사용한 경험이 필요하다. 이 책의 내용은 위에 열거한 과목들에서 쓰이는 용어들을 독자의 지식정도따윈 상관없이 자연스럽게(아무렇지도 않게) 쓰고 있다. 또한 이 책에 나오는 문장들은 위의 과목에서 쓰이는 개념을 함축적으로 내포하고 있으므로, 사전 지식 없이는 이해할 수 없는 문장들이 많다.


이책은 다음과 같이 구성된다. 1장은 서론으로, 사용자 관점에서 본 시스템의 기능에 대해 일반적이며 간단하게 설명하였으며, 시스템의 구조에 대해 설명하였다. 2장에서는 커널 구조의 일반적인 개요와 기본 개념들을 설명하였다. 책의 나머지 부분은 시스템 아키텍처로 표현된 개요에 따라, 구성 요소를 빌딩 블록 형식으로 설명한다. 크게 세부분, 파일 시스템, 프로세스 제어 그리고 고급 주제로 나뉘어지며, 프로세스 제어보다는 개념이 쉬운 화일 시스템을 먼저 다루었다. 따라서 3장에서는 파일 시스템의 기본이 되는 시스템의 버퍼 캐쉬 메커니즘을 설명하며, 4장은 파일 시스템 내부에서 사용된 데이터 구조와 알고리즘을 설명한다. 이 알고리즘들은 3장에서 설명된 알고리즘들을 사용하여, 사용자 파일을 관리하는데 필요한 내부기록을 담당한다. 5장은 파일 시스템에 대한 사용자 인터페이스를 제공하는 시스템 콜을 설명하였으며, 이때 사용자 파일을 액세스하기 위해 4장의 알고리즘을 사용한다.


(역주: 액세스를 번역하자면 '접근하다'이지만, 액세스는 '찾아서 읽기/쓰기를 한다'라는 의미를 내포한다. 따라서 번역하지 않고 그냥 발음으로 표기한다)


6장부터는 프로세스 제어에 대해 다룬다. 프로세스의 컨텍스트를 정의하고 프로세스 컨텍스트를 조작하는 내부 커널 프리미티브(kernel primitive)를 살펴 본다. 특히 시스템 콜 인터페이스, 인터럽트 처리, 컨텍스트 스위칭(context switching) 등에 대해 살펴본다. 7장에서는 프로세스의 컨텍스트를 제어하는 시스템 콜을 다루고, 8장에서는 프로세스 스케줄링을 다루며, 9장에서 스으퐈이과 페이징 시스템을 포함한 메모리 관리에 대해 살펴본다.

10장에서는 일반적인 드라이버 인터페이스에 대한 윤곽을 그린다. 특히 디스크 드라이버와 터미널 드라이버에 대해 논의한다. 디바이스는 논리적으로 파일 시스템의 일부이나, 터미널 드라이버에서 일어나는 프로세스의 제어 문제 때문에 그에 대한 논의가 여기까지 미루어진 것이다. 10장은 이책의 나머지 부분에서 논의될 고급주제를 위한 가교 역활을 한다. 11장은 System V의 메시지, 공유 메모리, 세마포어, 그리고 BSD 소켓 등을 포함하여, 프로세스 간 통신과 네트워킹에 대해 다루고 있다. 12장에서는 밀접하게 결합된 (tightly coupled) 멀티프로세서 UNIX 시스템을 설명한다. 13장에서는 느슨하게 결합된 (loosely coupled) 분산 처리 시스템에 대해 살펴본다.


이 책의 처음 9개 장과 내용은 운영체제 수업의 한학기 코스에서 다루기에 알맞으며, 그 나머지 장들은 다양한 프로젝트를 병행으로 수행하는 고급 세미나에서 다루기에 알맞을 것이다.

여기서 몇가지 단서를 언급해야겠다. 나는 절대적인 기준으로 시스템의 성능을 기술하려고 시도하지 않았으며, 시스템 설치를 위한 구성의 변수 등을 제안하려고 시도하지도 않았다. 그것들은 컴퓨터의 유형이나 하드웨어 구성, 시스템 버전, 그리고 시스템 구현 방식이나 응용 방법에 따라 변하기 때문이다. 마찬가지로 UNIX 운영체제 기능의 개발 방향에 대해 예상하는 것을 되도록 피하고자 하였다. 고급주제에 관한 논의가 AT&T에서 그 특정 기능을 채택하기로 결정하였다거나, 그 분야를 현재 연구중임을 뜻하는 것은 아니다.


이 책을 쓰는 동안 격려해주고, 원고에 대해 건설적인 비평을 해준 많은 친구와 동료들의 도움에 기쁜 마음으로 감사드린다. 나로 하여금 이 책을 쓰도록 권유하고, 초기에 격려해주었으며, 첫장의 초고를 검토해 준 Ian Johnstone에게 가장 깊은 감사를 드린다. Ian은 내게 많은 비결을 가르쳐 주었으며, 나는 그에게 늘 감사할 것이다. Doris Ryan 또한 시작할 때부터 나를 격려해 주었으며, 그녀의 친절함과 사려 깊음에 늘 감사드린다. Dennis Ritche는 시스템의 역사적, 기술적 배경에 대한 나의 수많은 질문에 아낌엇이 답해주었다. 많은 사람들이 이 원고의 초본을 검토하는데 많은 시간과 노력을 아낌없이 쏟아부었으며, 이 책은 그분들의 상세한 지적 덕분으로 완성되었다. 그분들은 Debby Bach, Doug Bayer, Lenny Brandwein, Steve Buroff, Tom Butler, Ron Gomes, Mesut Gunduc, Laura Israel, Dean Jagels, Keith Kelleman, Brain Kernighan, Bob Martin, Bob Mitze, Dave Nowitz, Michael Poppers, Marilyn Safran, Curt Schimmel, Zvi Spitz, Tom Vaden, Bill Weber, Larry Wehr 그리고 Bob Zarrow이다. Mary Fruhstuck은 인쇄하기 윈한 원고 정리에 도움을 주었다. 경영진과 동료들에게 이 프로젝트를 계속적으로 지원해 준 것에 대해 감사드리며, AT&T Bell 연구소의 고무적인 분위기와 좋은 연구환경을 만들어 준것에 대해서도 감사드린다. Prentice-Hall 사의 Hohn Wait 와 그 스태프들은 이책이 최종 형태를 갖추어 나오기까지 많은 귀중한 도움과 충고를 해 주었다. 마지막으로 그러나 제일 작지는 않게, 나의 아내 Debby는 내게 큰 정서적인 지원을 해주었으며, 그 지원이 없었더라면 나는 결코 성공할 수 없었을 것이다. 

목차

1부 시스템 개요
제1장 시스템의 개관
1.1 역사
1.2 시스템구조
1.3 사용자 관점
1.4 운영체제의 서비스
1.5 하드웨어에 대한 가정
1.6 요약


제2장 커널의 개요
2.1 UNIX 운영체제의 구조
2.2 시스템 개념의 소개
2.3 커널 데이터 구조
2.4 시스템 관리
2.5 요약
2.6 연습문제



2부 파일

제3장 버퍼 캐쉬
3.1 버퍼 헤더
3.2 버퍼 풀의 구조
3.3 버퍼를 가져오는 시나리오
3.4 디스크 블럭의 I/O
3.5 버퍼 캐쉬의 장단점
3.6 요약
3.7 연습문제


제4장 파일의 내부표현
4.1 아이노드
4.2 일반파일의 구조
4.3 디렉토리
4.4 경로이름을 아이노드로 변환
4.5 슈퍼블럭
4.6 새로운 파일의 아이노드 할당
4.7 디스크 블럭의 할당
4.8 다른 종류의 파일
4.9 요약
4.10 연습문제


제5장 파일 시스템을 위한 시스템 호출
5.1 open()
5.2 read()
5.3 write()
5.4 파일과 레코드 잠금(locking)
5.5 lseek() - 파일 I/O 위치 조정
5.6 close()
5.7 파일 생성
5.8 특수파일 생성
5.9 디렉토리 변경과 루트 변경
5.10 소유자 변경과 모드 변경
5.11 STAT 와 FSTAT
5.12 파이프(pipe)
5.13 dup()
5.14 파일 시스템의 mount와 unmount
5.15 link()
5.16 unlink()
5.17 파일 시스템의 추상화(abstration)
5.18 파일 시스템의 유지
5.19 요약
5.20 연습문제

3부 프로세스 및 메모리

제6장 프로세스의 구조
6.1 프로세스 상태와 전이(Transition)
6.2 시스템 메모리의 배치
6.3 프로세스 컨텍스트
6.4 프로세스 컨텍스트의 저장
6.5 프로세스 주소 공간의 취급(Manipulation)
6.6 sleep()
6.7 요약
6.8 연습문제


제7장 프로세스 제어
7.1 프로세스 생성
7.2 시그날(signal)
7.3 프로세스의 종류
7.4 vmfhtptmdml whdfy eorl
7.5 다른 프로그램 불러내기(Invoking)
7.6 프로세스의 사용자 ID
7.7 프로세스 크기 변경
7.8 쉘(Shell)
7.9 시스템 부트와 INIT 프로세스
7.10 요약
7.11 연습문제


제8장 프로세스 스케줄링과 시간
8.1 프로세스 스케줄링
8.2 시간과 관련된 시스템 콜
8.3 클럭
8.4 요약
8.5 연습문제


제9장 메모리 관리 정책
9.1 스와핑(Swapping)
9.2 요구 페이징(Demand Paging)
9.3 스와핑과 요구 페이징을 가진 복합 시스템
9.4 요약
9.5 연습문제


제10장 서브시스템
10.1 드라이버 인터페이스
10.2 디스크 드라이버
10.3 터미널 드라이버
10.4 스트림(Streams)
10.5 요약
10.6 연습문제


제11장 프로세스간 통신
11.1 프로세스 추적(Tracing)
11.2 System V IPC
11.3 네트워크 통신
11.4 소켓
11.5 요약
11.6 연습문제


제12장 멀티프로세서 시스템
12.1 멀티프로세서 시스템의 문제
12.2 주-종 프로세서에 의한 방법
12.3 세마포어에 의한 방법
12.4 TUNIS 시스템
12.5 성능의 한계
12.6 연습문제


제13장 분산 UNIX 시스템
13.1 위성 프로세서
13.2 The Newcastle Connection
13.3 투명한 분산 파일 시스템
13.4 Stub 프로세스 없는 투명한 분산 모델
13.5 요약
13.6 연습문제


Appendix.a - System Call
Appendix.b - Inex


저작자 표시 비영리 변경 금지
신고
댓글
댓글쓰기 폼