이미 소장하고 있다면 판매해 보세요.
|
용어 대역표
시작하면서 PART 1 기초 Chapter 1 프로그램에 끼친 기술의 영향 1.1 용어의 변화 1.2 시간과 속도 1.3 멀티프로그래밍과 시분할 1.4 애플리케이션에서의 병행성 1.4.1 인터럽트 1.4.2 시그널 1.4.3 입력과 출력 1.4.4 프로세스와 쓰레드, 자원공유 1.4.5 메모리를 공유하는 여러 프로세서 1.4.6 컴퓨터로서의 네트워크 1.5 보안과 장애 허용성 1.6 침입을 위한 버퍼 오버플로우 1.6.1 버퍼 오버플로우의 중요성 1.6.2 버퍼 오버플로우와 보안 1.7 UNIX 표준 1.8 읽어볼 만한 자료들 Chapter 2 프로그램, 프로세스, 쓰레드 2.1 프로그램이 프로세스로 되는 방법52 2.2 쓰레드와 실행 흐름 2.3 프로그램 이미지의 배치도 2.4 라이브러리 함수 호출 2.5 함수의 리턴 값과 에러 2.6 인자 배열 2.6.1 makeargv로 인자 배열 만들기 2.6.2 makeargv 구현 2.7 쓰레드 안전적 함수 2.8 정적변수의 사용 2.9 정적 객체의 구조 2.10 프로세스 환경 2.11 프로세스의 종료 2.12 연습문제 : env 유틸리티 2.13 연습문제 : 메시지 로깅 2.14 읽어볼 만한 자료들 Chapter 3 UNIX의 프로세스 3.1 프로세스 구별 3.2 프로세스 상태 3.3 UNIX 프로세스의 생성과 fork 3.4 wait 함수 3.4.1 상태 값 3.5 exec 함수 3.6 백그라운드 프로세스와 데몬 3.7 크리티컬 섹션 3.8 연습문제 : 프로세스 체인 3.9 연습문제 : 프로세스 팬 3.10 읽어볼 만한 자료들 Chapter 4 UNIX I/O 4.1 장치 용어 4.2 읽기와 쓰기 4.3 파일 열고 닫기 4.4 select 함수 4.5 poll 함수 4.6 파일의 표현 4.6.1 파일 디스크립터 4.6.2 파일 포인터와 버퍼링 4.6.3 파일 디스크립터의 상속 4.7 파일과 재지향 4.8 파일 제어 4.9 연습문제 : 원자성 로깅 4.9.1 원자성 로깅 라이브러리(atomic logging library) 4.10 연습문제 : 도구 cat 4.11 읽어볼 만한 자료들 Chapter 5 파일과 디렉토리 5.1 UNIX 파일 시스템 탐색 5.1.1 현재 작업 디렉토리 5.1.2 경로 찾기 5.2 디렉토리 접근 5.2.1 파일 상태 정보의 접근 5.2.2 파일의 종류 결정 5.3 UNIX 파일 시스템 구현 5.3.1 UNIX 파일 시스템 구현 5.3.2 디렉토리 구현 5.4 하드 링크와 심볼릭 링크 5.4.1 링크 생성하기와 제거하기 5.4.2 심볼릭 링크의 생성과 제거 5.5 연습문제 : which 명령어 5.6 연습문제 : 비프하기(biffing) 5.7 연습문제 : 뉴스 biff 5.8 연습문제 : 디렉토리 탐색하기 5.9 읽어볼 만한 자료들 Chapter 6 UNIX 특수 파일 6.1 파이프 6.2 파이프라인 6.3 FIFO 6.4 파이프와 클라이언트-서버 모델 6.5 터미널 제어 6.5.1 canonical 입력 처리와 noncanonical 입력 처리 6.6 오디오 장치 6.7 연습문제 : 오디오 6.8 연습문제 : 배리어 6.9 연습문제 : stty 명령어 6.10 연습문제 : 클라이언트-서버 재구현 6.11 읽어볼 만한 자료들 Chapter 7 프로젝트 : 토큰 링(Token Ring) 7.1 링 구조 7.2 링 형태 7.3 링의 탐색 7.4 간단한 통신 7.5 토큰 기반의 상호배제 7.6 투표 기반의 상호배제 7.7 익명 링에서의 대표 선출 7.8 토큰 링과 통신 7.9 파이프라인 방식의 전처리기 7.10 병렬 링 알고리즘 7.10.1 이미지 필터링 7.10.2 행렬 곱셈 7.11 유연한 링 7.12 읽어볼 만한 자료들 PART 2 비동기 이벤트 Chapter 8 시그널 8.1 시그널의 기본 정의 8.2 시그널의 생성 8.3 시그널 마스크와 시그널 세트 다루기 8.4 시그널 수용(catching)과 무시(Ignoring) - sigaction 8.5 시그널 대기하기 ― pause, sigsuspend 그리고 sigwait 8.5.1 pause 함수 8.5.2 sigsuspend 함수 8.5.3 sigwait 함수 8.6 시그널 다루기 : 에러와 비동기-시그널 안전성 8.7 siglongjmp와 sigsetjmp를 이용한 프로그램 제어 8.8 비동기 I/O 프로그래밍 8.9 연습문제 : 통계 출력하기 8.10 연습문제 : 느린 장치 스풀링(spooling) 8.11 읽어볼 만한 자료들 Chapter 9 시간과 타이머 9.1 POSIX 시간 9.1.1 Epoch 이후를 초 단위 시간으로 표현하기 9.1.2 날짜와 시간 표시하기 9.1.3 struct timeval 구조체를 사용하여 시간 표현하기 9.1.4 실시간 클록(realtime clock) 사용하기 9.1.5 흐르는 시간과 프로세서 시간의 비교 9.2 sleep 함수 9.3 POSIX:XSI 구간 타이머 9.4 실시간 시그널 9.5 POSIX:TMR 구간 타이머 9.6 타이머 편차(Drift), 오버런(Overruns) 그리고 절대 시간 9.7 읽어볼 만한 자료들 Chapter 10 프로젝트 : 가상 타이머 10.1 프로젝트 개요 10.2 간단한 타이머 10.3 다섯 개의 타이머 중에서 한 개의 타이머 설정하기 10.3.1 virtualtimers 오브젝트 10.3.2 hardwaretimer 오브젝트 10.3.3 메인 프로그램의 구현 10.3.4 show 함수를 이용한 타이머의 구현 10.4 다중 타이머 사용하기 10.4.1 다중 타이머 설정하기 10.4.2 다중 타이머 테스트하기 10.5 더 정확하고 강력한 다중 타이머의 구현 10.6 POSIX:TMR 타이머의 구현 10.7 mycrom, 소규모 cron 장치 10.8 읽어볼 만한 자료들 Chapter 11 프로젝트 : 쉘 만들기 11.1 간단한 쉘 만들기 11.2 재지향 11.3 파이프라인 11.4 포그라운드 상태의 시그널 처리 11.5 프로세스 그룹, 세션 그리고 제어 터미널 11.5.1 프로세스 그룹 11.5.2 세션 11.6 ush의 백그라운드 프로세스 11.7 작업 제어 11.8 ush의 작업 제어 11.8.1 작업 리스트 오브젝트 11.8.2 ush의 작업 리스트 11.8.3 ush의 작업 제어 11.8.4 파이프라인을 대기하는 프로세스의 동작 11.9 읽어볼 만한 자료들 PART 3 병행성 Chapter 12 POSIX 쓰레드 12.1 동기 부여하기 : 파일 디스크립터 모니터링하기 12.2 여러 파일 디스크립터를 모니터링하기 위해 쓰레드 사용하기 12.3 쓰레드 관리 12.3.1 ID로 쓰레드 참조하기 12.3.2 쓰레드 생성하기 12.3.3 쓰레드를 분리(detach)하고, 결합(join)하기 12.3.4 쓰레드를 종료하고, 취소하기 12.3.5 쓰레드로 매개변수를 넘기고, 값을 리턴받기 12.4 쓰레드-안전성 12.5 유저 쓰레드와 커널 쓰레드 12.6 쓰레드 속성 12.6.1 쓰레드 상태 12.6.2 쓰레드 스택 12.6.3 쓰레드 스케줄링 12.7 연습문제 : 병렬 파일 복사 12.8 읽어볼 만한 자료들 Chapter 13 쓰레드 동기화 13.1 POSIX 동기화 함수 13.2 뮤텍스 잠금 13.2.1 뮤텍스의 생성과 초기화 13.2.2 뮤텍스를 파괴하기 13.2.3 뮤텍스의 잠금과 해제 13.2.4 안전하지 못한 라이브러리 함수를 보호하기 13.2.5 동기화 플래그와 전역 값 13.2.6 자료 구조를 쓰레드-안전적으로 만들기 13.3 최대 한 번 그리고 적어도 한 번 수행하기 13.4 조건변수 13.4.1 조건변수의 생성과 파괴 13.4.2 조건변수 대기 및 시그널 보내기 13.5 시그널 핸들링과 쓰레드 13.5.1 시그널을 특정 쓰레드로 보내기 13.5.2 쓰레드에 대해 시그널을 마스킹하기 13.5.3 시그널 핸들링을 전담하는 쓰레드 13.6 독자와 필자 13.7 strerror_r 함수의 구현 13.8 데드락과 그 외의 성가신 문제들 13.9 연습문제 : 다중 배리어 13.10 읽어볼 만한 자료들 Chapter 14 크리티컬 섹션과 세마포어 14.1 크리티컬 섹션 다루기 14.2 세마포어 14.3 POSIX:SEM 언네임드 세마포어 14.4 POSIX:SEM 세마포어 명령 14.5 POSIX:SEM 네임드 세마포어 14.5.1 네임드 세마포어를 생성하고 열기 14.5.2 네임드 세마포어를 닫고 링크 해제하기 14.6 연습문제 : 라이센스 관리자 14.6.1 라이센스 객체 14.6.2 runsim 메인 프로그램 14.6.3 라이센스 관리자 확장하기 14.7 읽어볼 만한 자료들 Chapter 15 POSIX IPC 15.1 POSIX:XSI IPC 15.1.1 IPC 객체의 식별과 접근 15.1.2 쉘에서 POSIX:XSI IPC 자원에 접근하기 15.2 POSIX:XSI 세마포어 집합 15.2.1 세마포어의 생성 15.2.2 세마포어 제어하기 15.2.3 POSIX 세마포어 집합 연산 15.3 POSIX:XSI 공유 메모리 15.3.1 공유 메모리 세그먼트에 접근하기 15.3.2 공유 메모리 세그먼트의 부착(attach)과 분리(detach) 15.3.3 공유 메모리 제어하기 15.3.4 공유 메모리 예제 15.4 POSIX:XSI 메시지 큐 15.4.1 메시지 큐에 접근하기 15.5 연습문제 : POSIX 언네임드 세마포어 15.6 연습문제 : POSIX 네임드 세마포어 15.7 연습문제 : 공유 메모리를 사용하여 파이프를 구현하기 15.8 연습문제 : 메시지 큐를 이용하여 파이프 구현하기 15.9 읽어볼 만한 자료들 Chapter 16 프로젝트 : 생산자 소비자 동기화 16.1 생산자 ― 소비자 문제 16.2 뮤텍스 잠금을 통해 보호되는 유한 버퍼 16.3 세마포어를 사용한 버퍼 구현 16.4 간단한 생산자 ― 소비자 문제에 대한 소개 16.5 조건변수를 사용한 유한 버퍼 구현 16.6 완료 조건을 갖는 버퍼 16.7 병렬 파일 복사 16.7.1 병렬 파일 복사 생산자 16.7.2 병렬 파일 복사 소비자 16.7.3 병렬 파일 복사 메인 프로그램 16.7.4 병렬 파일 복사 구현을 발전시키기 16.8 쓰레드 기반 프린트 서버 16.8.1 요청 버퍼 16.8.2 생산자 쓰레드 16.8.3 소비자 쓰레드 16.8.4 프린트 서버 16.8.5 프린트 서버를 발전시키기 16.9 읽어볼 만한 자료들 Chapter 17 프로젝트 : NTPVM(Not Too Parallel Virtual Machine) 17.1 PVM의 역사, 용어, 아키텍처 17.2 Not Too Parallel Virtual Machine 17.3 NTPVM 프로젝트 개요 17.3.1 NEWTASK 패킷 17.3.2 DATA 패킷 17.3.3 DONE 패킷 17.4 디스패처의 I/O 및 테스트 17.4.1 여러 윈도우를 사용하여 테스트하기 17.4.2 원격 로깅을 사용한 검증 17.5 입력이 없는 단일 태스크 17.6 단일 태스크 17.6.1 입력 쓰레드 17.6.2 출력 쓰레드 17.7 다중 태스크 17.8 패킷 통신, 브로드캐스트, 배리어 17.9 종료와 시그널 17.10 순차적인 메시지 전달 17.11 읽어볼 만한 자료들 PART 4 통신 Chapter 18 연결 지향 통신 18.1 클라이언트-서버 모델 18.2 통신 채널 18.3 연결형 서버 전략들 18.4 범용 인터넷 통신 인터페이스 18.4.1 에러 처리하기 18.4.2 읽기와 쓰기 18.5 다양한 서버 전략을 위한 UICI의 설계 18.6 UICI 클라이언트 18.7 UICI의 소켓 구현 버전 18.7.1 socket 함수 18.7.2 bind 함수 18.7.3 listen 함수 18.7.4 u_open의 구현 18.7.5 accept 함수 18.7.6 u_accept의 구현 18.7.7 connect 함수 18.7.8 u_connect의 구현 18.8 호스트 이름과 IP 주소 18.9 쓰레드-안전성을 보장하는 UICI 18.10 연습문제 : Ping 서버 18.11 연습문제 : 오디오 전송 18.12 읽어볼 만한 자료들 Chapter 19 프로젝트 : WWW 재지향 19.1 월드 와이드 웹 19.2 URL(Uniform Resource Locators) 19.3 HTTP 입문 19.3.1 클라이언트 요청 메시지 19.3.2 서버 요청 메시지 19.3.3 HTTP 메시지 교환 19.4 웹 통신 유형 19.4.1 터널 19.4.2 프록시 19.4.3 캐시와 투명성 19.4.4 게이트웨이 19.5 단일 연결 상황의 통과 지점 모니터링 19.6 터널 서버의 구현 19.7 테스트를 위한 서버 드라이버 19.8 HTTP 헤더 해석하기 19.9 간단한 프록시 서버 19.10 프록시 모니터 19.11 프록시 캐시 19.12 관문(portal)을 위한 게이트웨이 19.13 부하 분산을 위한 게이트웨이 19.14 검시(Postmortem) 19.14.1 쓰레드와 타이밍 에러들 19.14.2 부정확한 에러와 잘못된 종료 19.14.3 문서 작성 및 발표 19.14.4 빈약한 테스트와 결과 발표 19.14.5 프로그래밍 스타일과 나쁜 스타일 19.15 읽어볼 만한 자료들 Chapter 20 비연결형 통신과 멀티캐스트 20.1 비연결형 통신의 소개 20.2 비연결형 통신을 위한 간단한 인터페이스 20.2.1 호스트명과 u_buf_t 구조체 20.2.2 UICI UDP 리턴 에러 20.2.3 UDP 버퍼 사이즈와 UICI UDP 20.3 간단한-요청 프로토콜 20.4 요청-응답 프로토콜 20.5 타임아웃과 재전송 기능을 가진 요청-응답 프로토콜 20.6 요청-응답-확인 프로토콜 20.7 UICI UDP 구현 20.7.1 u_openudp의 구현 20.7.2 sendto 함수 20.7.3 u_sendto와 u_sendtohost의 구현 20.7.4 recvfrom 함수 20.7.5 u_recvfrom과 u_recvfromtimed의 구현 20.7.6 호스트명과 u_buf_t 20.8 UDP와 TCP의 비교 20.9 멀티캐스트 20.9.1 멀티캐스트 주소 체계 20.9.2 u_join 함수의 구현 20.9.3 u_leave 함수의 구현 20.10 연습문제 : UDP 포트 서버 20.11 연습문제 : 무경계 파일 서버 20.11.1 원격 파일 서비스 20.12 읽어볼 만한 자료들 Chapter 21 프로젝트 : 인터넷 라디오 21.1 프로젝트 개요 21.2 오디오 장치 시뮬레이션 21.3 하나의 오디오 방송과 UDP를 이용한 단일 수신기 구현 21.3.1 간단한 구현 21.3.2 수신기의 종료 21.3.3 네트워크 지연 문제를 해결하기 위한 수신기 버퍼링 21.3.4 비순차적 전송을 처리하기 위한 수신기 버퍼 21.4 여러 개의 오디오 방송 프로그램과 여러 개의 수신기를 지원하는 UDP 구현 21.4.1 여러 개의 오디오 방송 프로그램과 한 개의 수신기 21.4.2 여러 개의 오디오 방송 프로그램과 여러 개의 수신기 21.5 라디오 방송을 위한 UDP 구현 21.6 멀티캐스트를 이용한 라디오 방송의 구현 21.7 TCP 구현의 차이점 21.7.1 단일 방송 프로그램과 단일 수신기를 위한 TCP 구현 21.7.2 한 개의 수신기와 여러 개의 오디오 방송 프로그램을 위한 TCP 구현 21.7.3 라디오 방송을 위한 TCP 구현 21.8 브라우저를 통하여 스트리밍 오디오 수신하기 21.8.1 브라우저 헬퍼 애플리케이션 사용하기 21.8.2 여러분의 웹 서버에 새로운 mime type 설정하기 21.8.3 새로운 mime type을 처리할 수 있도록 브라우저 설정하기 21.8.4 웹 페이지 생성하기 21.8.5 미리 정의된 mime type 사용하기 21.9 읽어볼 만한 자료들 Chapter 22 프로젝트 : 서버의 성능 22.1 서버 성능의 비용 22.2 서버 구조 22.3 프로젝트 개요 22.4 단일-클라이언트 드라이버 22.4.1 연결 처리 22.4.2 응답 프로그램 22.4.3 결과 합산하기 22.4.4 클라이언트 테스트하기 22.5 다중-클라이언트 드라이버 22.5.1 또 다른 다중-클라이언트의 설계 22.6 Thread-per-request와 Process-per-request의 구현 22.7 쓰레드 작업자 풀 전략 22.8 유한 버퍼를 사용하는 쓰레드 작업자 풀 22.9 프로세스 작업자 풀 전략 22.10 디스크 I/O의 영향 22.11 성능 연구 22.11.1 기본적인 측정 22.11.2 가변성의 원인 22.11.3 측정 에러 22.11.4 동기화 22.11.5 평범한 에러 22.11.6 무엇을 측정하는가? 22.11.7 데이터 분석과 발표 22.12 보고서 작성하기 22.12.1 소개 22.12.2 설계, 구현, 테스트 22.12.3 실험 22.12.4 결과와 분석 22.12.5 결론 22.12.6 참고 문헌 22.13 읽어볼 만한 자료들 PART 5 부록 Appendix A UNIX 기초 Appendix B 재시작 라이브러리 Appendix C UICI의 구현 Appendix D 로깅 함수 Appendix E POSIX Extensions 참고문헌 찾아보기 |
|
역자가 인터넷을 처음 접한 시기는 아마도 1990년대 중반으로 기억한다. 대학에 입학한 후 교양 과정 첫 수업에서 PC를 이용한 인터넷 사용 방법을 배우면서 인터넷이라는 새로운 세상을 경험하였다. 물론, 당시에는 Windows 운영체제가 막 보편화되는 시기였으며, 네트워크 인프라 또한 지금처럼 선만 꽂으면 어디에서건 인터넷을 사용할 수 있을 정도의 환경은 상상조차 할 수 없었다. 아울러 네트워크 통신이라는 용어조차도 지금과는 달리 컴퓨터 업종에 종사하지 않는 사람은 알 수 없을 정도로 널리 보편화되지 않았다. 그러한 환경에서 네트워크 통신을 처음 경험하고, 네트워크 통신을 통한 인터넷을 사용한 첫 경험은 아직까지도 잊을 수 없다.
인터넷이라는 용어가 익숙해 질 무렵 역자와 친구들은 인터넷을 구성하는 요소들과 네트워크 통신이 이루어지는 방식 등을 좀더 자세히 이해하기 위해 학회를 만들었고, 그 학회에서는 네트워크 통신 방법론, 통신 프로토콜, 프로그래밍, UNIX 등과 같이 네트워크와 관련된 여러 가지 지식들을 공부하였다. 아마 UNIX 시스템을 처음 접한 시기는 네트워크 프로그래밍이라는 프로그래밍 영역에 대해 관심을 가지기 시작한 시점부터일 것으로 생각한다. 특히, 리눅스를 직접 설치하면서 전자메일, 파일전송, 고퍼 등과 같은 UNIX에서 제공되는 여러 가지 기능과 장점들을 체험하면서 UNIX 시스템에 점차 빠져들었다. 이제는 일반인조차 리눅스가 무엇인지를 알고 있을 정도로 널리 알려졌다. 이 책은 바로 UNIX 시스템 환경에서 프로그램을 만들고자 하는 사람들을 위한 입문서 정도로 생각하면 될 것이다. UNIX는 여러분들이 흔히 사용하는 Windows 계열의 운영체제와는 여러 부분에서 다르기 때문에 UNIX 프로그래밍을 처음으로 시작하는 독자들에게 훌륭한 지침서 역할을 수행할 것으로 생각된다. 이 책의 장점은 시스템 콜 하나 하나를 자세히 설명하고 있을 뿐만 아니라, 다양한 예제와 연습문제를 제공함으로써 입문자들이 기초를 다짐과 동시에 더 높은 수준으로 나아갈 수 있도록 도와 준다는 것이다. 아울러 UNIX에 많은 관심을 가지고 있는 독자라면 단순히 프로그래밍에 국한하여 UNIX 시스템을 바라보지 말고, 그 내부 구조(커널) 혹은 컴파일 환경, UNIX의 운영 방법 등과 같이 다양한 부분에 걸쳐 이해하기를 바란다. 그러한 기반 지식을 바탕으로 훌륭한 프로그램이 나올 수 있기 때문이다. UNIX는 매우 거대한 운영체제이기 때문에 UNIX 기반 프로그래밍을 이 책 한 권으로 모두 설명할 수는 없다. 이 책을 읽은 후 좀더 심도 있는 이해를 위해 특정 주제를 설명하는 책을 참고하기 바란다. 또한 인터넷을 통해 UNIX에서 널리 사용되는 프로그램의 소스 코드를 이해해 보기 바란다. 개발이란, 여러 명의 협력으로 문제를 해결하는 과정이기 때문에 자신만의 사고로는 한계를 가진다. 따라서 다른 사람들이 작성한 소스 코드를 참고하고 이해함으로써 그 사고의 한계를 넓힐 수 있을 것이다. 전문가들이 작성한 소스를 참고함으로써 이 책에서 설명하지 않는 프로그래밍의 작성 방법이나 함수의 사용 방법에 대해 많은 정보를 간접적으로 얻을 수 있을 것이다. --- pp. 1~2 ('역자의 말' 중에서) |