용어 대역표 ... 19 시작하면서 ... 23 PART 1 기초 Chapter 1 프로그램에 끼친 기술의 영향 1.1 용어의 변화 ... 30 1.2 시간과 속도 ... 31 1.3 멀티프로그래밍과 시분할 ... 33 1.4 애플리케이션에서의 병행성 ... 35 1.5 보안과 장애 허용성 ... 40 1.6 침입을 위한 버퍼 오버플로우 ... 42 1.7 UNIX 표준 ... 47 1.8 읽어볼 만한 자료들 ... 49 Chapter 2 프로그램, 프로세스, 쓰레드 2.1 프로그램이 프로세스로 되는 방법 ... 52 2.2 쓰레드와 실행 흐름 ... 53 2.3 프로그램 이미지의 배치도 ... 54 2.4 라이브러리 함수 호출 ... 57 2.5 함수의 리턴 값과 에러 ... 61 2.6 인자 배열 ... 63 2.7 쓰레드 안전적 함수 ... 72 2.8 정적변수의 사용 ... 75 2.9 정적 객체의 구조 ... 76 2.10 프로세스 환경 ... 84 2.11 프로세스의 종료 ... 88 2.12 연습문제 : env 유틸리티 ... 91 2.13 연습문제 : 메시지 로깅 ... 92 2.14 읽어볼 만한 자료들 ... 94 Chapter 3 UNIX의 프로세스 3.1 프로세스 구별 ... 96 3.2 프로세스 상태 ... 98 3.3 UNIX 프로세스의 생성과 fork ... 101 3.4 wait 함수 ... 109 3.5 exec 함수 ... 118 3.6 백그라운드 프로세스와 데몬 ... 126 3.7 크리티컬 섹션 ... 129 3.8 연습문제 : 프로세스 체인 ... 130 3.9 연습문제 : 프로세스 팬 ... 132 3.10 읽어볼 만한 자료들 ... 133 Chapter 4 UNIX I/O 4.1 장치 용어 ... 136 4.2 읽기와 쓰기 ... 136 4.3 파일 열고 닫기 ... 148 4.4 select 함수 ... 155 4.5 poll 함수 ... 166 4.6 파일의 표현 ... 169 4.7 파일과 재지향 ... 182 4.8 파일 제어 ... 185 4.9 연습문제 : 원자성 로깅 ... 189 4.10 연습문제 : 도구 cat ... 196 4.11 읽어볼 만한 자료들 ... 198 Chapter 5 파일과 디렉토리 5.1 UNIX 파일 시스템 탐색 ... 200 5.2 디렉토리 접근 ... 207 5.3 UNIX 파일 시스템 구현 ... 215 5.4 하드 링크와 심볼릭 링크 ... 220 5.5 연습문제 : which 명령어 ... 232 5.6 연습문제 : 비프하기(biffing) ... 233 5.7 연습문제 : 뉴스 biff ... 237 5.8 연습문제 : 디렉토리 탐색하기 ... 239 5.9 읽어볼 만한 자료들 ... 241 Chapter 6 UNIX 특수 파일 6.1 파이프 ... 244 6.2 파이프라인 ... 248 6.3 FIFO ... 254 6.4 파이프와 클라이언트-서버 모델 ... 259 6.5 터미널 제어 ... 267 6.6 오디오 장치 ... 281 6.7 연습문제 : 오디오 ... 288 6.8 연습문제 : 배리어 ... 290 6.9 연습문제 : stty 명령어 ... 292 6.10 연습문제 : 클라이언트-서버 재구현 ... 293 6.11 읽어볼 만한 자료들 ... 293 Chapter 7 프로젝트 : 토큰 링(Token Ring) 7.1 링 구조 ... 296 7.2 링 형태 ... 297 7.3 링의 탐색 ... 305 7.4 간단한 통신 ... 307 7.5 토큰 기반의 상호배제 ... 309 7.6 투표 기반의 상호배제 ... 310 7.7 익명 링에서의 대표 선출 ... 311 7.8 토큰 링과 통신 ... 314 7.9 파이프라인 방식의 전처리기 ... 316 7.10 병렬 링 알고리즘 ... 319 7.11 유연한 링 ... 324 7.12 읽어볼 만한 자료들 ... 325 PART 2 비동기 이벤트 Chapter 8 시그널 8.1 시그널의 기본 정의 ... 330 8.2 시그널의 생성 ... 331 8.3 시그널 마스크와 시그널 세트 다루기 ... 337 8.4 시그널 수용(catching)과 무시(Ignoring) - sigaction ... 345 8.5 시그널 대기하기 - pause, sigsuspend 그리고 sigwait ... 353 8.6 시그널 다루기 : 에러와 비동기-시그널 안전성 ... 366 8.7 siglongjmp와 sigsetjmp를 이용한 프로그램 제어 ... 370 8.8 비동기 I/O 프로그래밍 ... 372 8.9 연습문제 : 통계 출력하기 ... 387 8.10 연습문제 : 느린 장치 스풀링(spooling) ... 387 8.11 읽어볼 만한 자료들 ... 388 Chapter 9 시간과 타이머 9.1 POSIX 시간 ... 390 9.2 sleep 함수 ... 406 9.3 POSIX:XSI 구간 타이머 ... 409 9.4 실시간 시그널 ... 414 9.5 POSIX:TMR 구간 타이머 ... 420 9.6 타이머 편차(Drift), 오버런(Overruns) 그리고 절대 시간 ... 426 9.7 읽어볼 만한 자료들 ... 439 Chapter 10 프로젝트 : 가상 타이머 10.1 프로젝트 개요 ... 442 10.2 간단한 타이머 ... 444 10.3 다섯 개의 타이머 중에서 한 개의 타이머 설정하기 ... 447 10.4 다중 타이머 사용하기 ... 460 10.5 더 정확하고 강력한 다중 타이머의 구현 ... 469 10.6 POSIX:TMR 타이머의 구현 ... 472 10.7 mycrom, 소규모 cron 장치 ... 473 10.8 읽어볼 만한 자료들 ... 473 Chapter 11 프로젝트 : 쉘 만들기 11.1 간단한 쉘 만들기 ... 476 11.2 재지향 ... 482 11.3 파이프라인 ... 484 11.4 포그라운드 상태의 시그널 처리 ... 490 11.5 프로세스 그룹, 세션 그리고 제어 터미널 ... 497 11.6 ush의 백그라운드 프로세스 ... 504 11.7 작업 제어 ... 513 11.8 ush의 작업 제어 ... 518 11.9 읽어볼 만한 자료들 ... 522 PART 3 병행성 Chapter 12 POSIX 쓰레드 12.1 동기 부여하기 : 파일 디스크립터 모니터링하기 ... 526 12.2 여러 파일 디스크립터를 모니터링하기 위해 쓰레드 사용하기 ... 528 12.3 쓰레드 관리 ... 532 12.4 쓰레드-안전성 ... 554 12.5 유저 쓰레드와 커널 쓰레드 ... 556 12.6 쓰레드 속성 ... 559 12.7 연습문제 : 병렬 파일 복사 ... 569 12.8 읽어볼 만한 자료들 ... 571 Chapter 13 쓰레드 동기화 13.1 POSIX 동기화 함수 ... 574 13.2 뮤텍스 잠금 ... 575 13.3 최대 한 번 그리고 적어도 한 번 수행하기 ... 591 13.4 조건변수 ... 596 13.5 시그널 핸들링과 쓰레드 ... 606 13.6 독자와 필자 ... 613 13.7 strerror_r 함수의 구현 ... 619 13.8 데드락과 그 외의 성가신 문제들 ... 621 13.9 연습문제 : 다중 배리어 ... 623 13.10 읽어볼 만한 자료들 ... 623 Chapter 14 크리티컬 섹션과 세마포어 14.1 크리티컬 섹션 다루기 ... 626 14.2 세마포어 ... 630 14.3 POSIX:SEM 언네임드 세마포어 ... 633 14.4 POSIX:SEM 세마포어 명령 ... 636 14.5 POSIX:SEM 네임드 세마포어 ... 645 14.6 연습문제 : 라이센스 관리자 ... 652 14.7 읽어볼 만한 자료들 ... 655 Chapter 15 POSIX IPC 15.1 POSIX:XSI IPC ... 658 15.2 POSIX:XSI 세마포어 집합 ... 661 15.3 POSIX:XSI 공유 메모리 ... 675 15.4 POSIX:XSI 메시지 큐 ... 687 15.5 연습문제 : POSIX 언네임드 세마포어 ... 697 15.6 연습문제 : POSIX 네임드 세마포어 ... 698 15.7 연습문제 : 공유 메모리를 사용하여 파이프를 구현하기 ... 699 15.8 연습문제 : 메시지 큐를 이용하여 파이프 구현하기 ... 703 15.9 읽어볼 만한 자료들 ... 703 Chapter 16 프로젝트 : 생산자 소비자 동기화 16.1 생산자 - 소비자 문제 ... 706 16.2 뮤텍스 잠금을 통해 보호되는 유한 버퍼 ... 708 16.3 세마포어를 사용한 버퍼 구현 ... 712 16.4 간단한 생산자 - 소비자 문제에 대한 소개 ... 719 16.5 조건변수를 사용한 유한 버퍼 구현 ... 723 16.6 완료 조건을 갖는 버퍼 ... 725 16.7 병렬 파일 복사 ... 735 16.8 쓰레드 기반 프린트 서버 ... 739 16.9 읽어볼 만한 자료들 ... 744 Chapter 17 프로젝트 : NTPVM(Not Too Parallel Virtual Machine) 17.1 PVM의 역사, 용어, 아키텍처 ... 746 17.2 Not Too Parallel Virtual Machine ... 748 17.3 NTPVM 프로젝트 개요 ... 751 17.4 디스패처의 I/O 및 테스트 ... 757 17.5 입력이 없는 단일 태스크 ... 767 17.6 단일 태스크 ... 769 17.7 다중 태스크 ... 772 17.8 패킷 통신, 브로드캐스트, 배리어 ... 773 17.9 종료와 시그널 ... 774 17.10 순차적인 메시지 전달 ... 775 17.11 읽어볼 만한 자료들 ... 775 PART 4 통신 Chapter 18 연결 지향 통신 18.1 클라이언트-서버 모델 ... 780 18.2 통신 채널 ... 781 18.3 연결형 서버 전략들 ... 785 18.4 범용 인터넷 통신 인터페이스 ... 789 18.5 다양한 서버 전략을 위한 UICI의 설계 ... 793 18.6 UICI 클라이언트 ... 797 18.7 UICI의 소켓 구현 버전 ... 805 18.8 호스트 이름과 IP 주소 ... 819 18.9 쓰레드-안전성을 보장하는 UICI ... 830 18.10 연습문제 : Ping 서버 ... 833 18.11 연습문제 : 오디오 전송 ... 835 18.12 읽어볼 만한 자료들 ... 837 Chapter 19 프로젝트 : WWW 재지향 19.1 월드 와이드 웹 ... 840 19.2 URL(Uniform Resource Locators) ... 841 19.3 HTTP 입문 ... 843 19.4 웹 통신 유형 ... 849 19.5 단일 연결 상황의 통과 지점 모니터링 ... 857 19.6 터널 서버의 구현 ... 860 19.7 테스트를 위한 서버 드라이버 ... 861 19.8 HTTP 헤더 해석하기 ... 863 19.9 간단한 프록시 서버 ... 866 19.10 프록시 모니터 ... 867 19.11 프록시 캐시 ... 872 19.12 관문(portal)을 위한 게이트웨이 ... 873 19.13 부하 분산을 위한 게이트웨이 ... 873 19.14 검시(Postmortem) ... 874 19.15 읽어볼 만한 자료들 ... 880 Chapter 20 비연결형 통신과 멀티캐스트 20.1 비연결형 통신의 소개 ... 882 20.2 비연결형 통신을 위한 간단한 인터페이스 ... 884 20.3 간단한-요청 프로토콜 ... 888 20.4 요청-응답 프로토콜 ... 894 20.5 타임아웃과 재전송 기능을 가진 요청-응답 프로토콜 ... 902 20.6 요청-응답-확인 프로토콜 ... 908 20.7 UICI UDP 구현 ... 910 20.8 UDP와 TCP의 비교 ... 920 20.9 멀티캐스트 ... 922 20.10 연습문제 : UDP 포트 서버 ... 927 20.11 연습문제 : 무경계 파일 서버 ... 928 20.12 읽어볼 만한 자료들 ... 931 Chapter 21 프로젝트 : 인터넷 라디오 21.1 프로젝트 개요 ... 934 21.2 오디오 장치 시뮬레이션 ... 936 21.3 하나의 오디오 방송과 UDP를 이용한 단일 수신기 구현 ... 937 21.4 여러 개의 오디오 방송 프로그램과 여러 개의 수신기를 지원하는 UDP 구현 ... 950 21.5 라디오 방송을 위한 UDP 구현 ... 951 21.6 멀티캐스트를 이용한 라디오 방송의 구현 ... 954 21.7 TCP 구현의 차이점 ... 955 21.8 브라우저를 통하여 스트리밍 오디오 수신하기 ... 961 21.9 읽어볼 만한 자료들 ... 966 Chapter 22 프로젝트 : 서버의 성능 22.1 서버 성능의 비용 ... 970 22.2 서버 구조 ... 971 22.3 프로젝트 개요 ... 976 22.4 단일-클라이언트 드라이버 ... 976 22.5 다중-클라이언트 드라이버 ... 981 22.6 Thread-per-request와 Process-per-request의 구현 ... 984 22.7 쓰레드 작업자 풀 전략 ... 985 22.8 유한 버퍼를 사용하는 쓰레드 작업자 풀 ... 986 22.9 프로세스 작업자 풀 전략 ... 986 22.10 디스크 I/O의 영향 ... 987 22.11 성능 연구 ... 992 22.12 보고서 작성하기 ... 1004 22.13 읽어볼 만한 자료들 ... 1008 PART 5 부록 Appendix A UNIX 기초 ... 1011 Appendix B 재시작 라이브러리 ... 1035 Appendix C UICI의 구현 ... 1049 Appendix D 로깅 함수 ... 1069 Appendix E POSIX Extensions ... 1091 참고문헌 ... 1095 찾아보기 ... 1106