이미지 검색을 사용해 보세요
검색창 이전화면 이전화면
최근 검색어
인기 검색어

소득공제 강력추천
UNIX SYSTEMS Programming
통신, 병행성 그리고 쓰레드
Kay A. Robbins 등저 주민규 등역
정보문화사 2006.06.10.
베스트
IT 모바일 top100 1주
가격
35,000
10 31,500
YES포인트?
1,750원 (5%)
5만원 이상 구매 시 2천원 추가 적립
결제혜택
카드/간편결제 혜택을 확인하세요
  • 교재기간 소량 입고 되는 도서로 배송이 지연 될 수 있습니다.

이미 소장하고 있다면 판매해 보세요.

  •  해외배송 가능?
  •  문화비소득공제 가능

책소개

목차

용어 대역표
시작하면서

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

참고문헌
찾아보기

저자 소개

공저자 : Kay A. Robbins / Steven Robbins
MIT에서 박사 학위를 받았으며, 텍사스 주립대학(University of Texas at San Antonio)에서 컴퓨터 과학부의 교수로 재직중이다.

관련 분류

품목정보

발행일
2006년 06월 10일
쪽수, 무게, 크기
1115쪽 | 2053g | 188*254*60mm
ISBN13
9788956743219

책 속으로

역자가 인터넷을 처음 접한 시기는 아마도 1990년대 중반으로 기억한다. 대학에 입학한 후 교양 과정 첫 수업에서 PC를 이용한 인터넷 사용 방법을 배우면서 인터넷이라는 새로운 세상을 경험하였다. 물론, 당시에는 Windows 운영체제가 막 보편화되는 시기였으며, 네트워크 인프라 또한 지금처럼 선만 꽂으면 어디에서건 인터넷을 사용할 수 있을 정도의 환경은 상상조차 할 수 없었다. 아울러 네트워크 통신이라는 용어조차도 지금과는 달리 컴퓨터 업종에 종사하지 않는 사람은 알 수 없을 정도로 널리 보편화되지 않았다. 그러한 환경에서 네트워크 통신을 처음 경험하고, 네트워크 통신을 통한 인터넷을 사용한 첫 경험은 아직까지도 잊을 수 없다.

인터넷이라는 용어가 익숙해 질 무렵 역자와 친구들은 인터넷을 구성하는 요소들과 네트워크 통신이 이루어지는 방식 등을 좀더 자세히 이해하기 위해 학회를 만들었고, 그 학회에서는 네트워크 통신 방법론, 통신 프로토콜, 프로그래밍, UNIX 등과 같이 네트워크와 관련된 여러 가지 지식들을 공부하였다. 아마 UNIX 시스템을 처음 접한 시기는 네트워크 프로그래밍이라는 프로그래밍 영역에 대해 관심을 가지기 시작한 시점부터일 것으로 생각한다. 특히, 리눅스를 직접 설치하면서 전자메일, 파일전송, 고퍼 등과 같은 UNIX에서 제공되는 여러 가지 기능과 장점들을 체험하면서 UNIX 시스템에 점차 빠져들었다. 이제는 일반인조차 리눅스가 무엇인지를 알고 있을 정도로 널리 알려졌다.

이 책은 바로 UNIX 시스템 환경에서 프로그램을 만들고자 하는 사람들을 위한 입문서 정도로 생각하면 될 것이다. UNIX는 여러분들이 흔히 사용하는 Windows 계열의 운영체제와는 여러 부분에서 다르기 때문에 UNIX 프로그래밍을 처음으로 시작하는 독자들에게 훌륭한 지침서 역할을 수행할 것으로 생각된다.

이 책의 장점은 시스템 콜 하나 하나를 자세히 설명하고 있을 뿐만 아니라, 다양한 예제와 연습문제를 제공함으로써 입문자들이 기초를 다짐과 동시에 더 높은 수준으로 나아갈 수 있도록 도와 준다는 것이다.

아울러 UNIX에 많은 관심을 가지고 있는 독자라면 단순히 프로그래밍에 국한하여 UNIX 시스템을 바라보지 말고, 그 내부 구조(커널) 혹은 컴파일 환경, UNIX의 운영 방법 등과 같이 다양한 부분에 걸쳐 이해하기를 바란다. 그러한 기반 지식을 바탕으로 훌륭한 프로그램이 나올 수 있기 때문이다. UNIX는 매우 거대한 운영체제이기 때문에 UNIX 기반 프로그래밍을 이 책 한 권으로 모두 설명할 수는 없다. 이 책을 읽은 후 좀더 심도 있는 이해를 위해 특정 주제를 설명하는 책을 참고하기 바란다. 또한 인터넷을 통해 UNIX에서 널리 사용되는 프로그램의 소스 코드를 이해해 보기 바란다. 개발이란, 여러 명의 협력으로 문제를 해결하는 과정이기 때문에 자신만의 사고로는 한계를 가진다. 따라서 다른 사람들이 작성한 소스 코드를 참고하고 이해함으로써 그 사고의 한계를 넓힐 수 있을 것이다. 전문가들이 작성한 소스를 참고함으로써 이 책에서 설명하지 않는 프로그래밍의 작성 방법이나 함수의 사용 방법에 대해 많은 정보를 간접적으로 얻을 수 있을 것이다.

--- pp. 1~2 ('역자의 말' 중에서)

리뷰/한줄평0

리뷰

첫번째 리뷰어가 되어주세요.

한줄평

첫번째 한줄평을 남겨주세요.