본문으로 건너뛰기

차례

서문

항목페이지
역자 서문i
모든 독자에게iii
교강사에게v
학생들에게vi
감사의 글vii
맺음말x
참고 문헌xi
그림 차례xiii

본문

제목페이지
제1장이 책에 관한 대화1
제2장운영체제 개요3
2.1CPU 가상화4
2.2메모리의 가상화6
2.3병행성8
2.4영속성10
2.5설계 목표12
2.6역사 약간13
2.7요약16
참고 문헌18

제 I 편: CPU 가상화

제목페이지
제3장가상화에 관한 대화23
제4장프로세스의 개념25
4.1프로세스의 개념26
4.2프로세스 API27
4.3프로세스 생성: 조금 더 자세하게27
4.4프로세스 상태29
4.5자료 구조31
4.6요약33
참고 문헌34
숙제35
문제35
제5장막간: 프로세스 API37
5.1fork() 시스템 콜37
5.2wait() 시스템 콜39
5.3드디어, exec() 시스템 콜40
5.4왜, 이런 API를?41
5.5여타 API들43
5.6요약44
참고 문헌45
숙제 (코드)46
문제46
제6장제한적 직접 실행 원리49
6.1기본 원리: 제한적 직접 실행49
6.2문제점 1: 제한된 연산50
6.3문제점 2: 프로세스 간 전환54
6.4병행성이 걱정58
6.5요약59
참고 문헌61
제7장스케줄링: 개요65
7.1워크로드에 대한 가정65
7.2스케줄링 평가 항목66
7.3선입선출66
7.4최단 작업 우선68
7.5최소 잔여시간 우선69
7.6새로운 평가 기준: 응답 시간70
7.7라운드 로빈71
7.8입출력 연산의 고려73
7.9만병통치약은 없다(No More Oracle)74
7.10요약74
참고 문헌76
숙제77
문제77
제8장스케줄링: 멀티 레벨 피드백 큐79
8.1기본 규칙79
8.2시도 1: 우선순위의 변경80
8.3시도 2: 우선순위의 상향 조정82
8.4시도 3: 더 나은 시간 측정82
8.5조정과 다른 쟁점들85
8.6요약87
참고 문헌88
숙제89
문제89
제9장스케줄링: 비례 배분91
9.1기본 개념: 추첨권이 당신의 몫을 나타낸다91
9.2추첨 기법92
9.3구현93
9.4예제94
9.5추첨권 배분 방식95
9.6왜 결정론적(Deterministic) 방법을 사용하지 않는가96
9.7요약97
참고 문헌98
숙제99
문제99
제10장멀티프로세서 스케줄링 (고급)101
10.1배경: 멀티프로세서 구조101
10.2동기화를 잊지 마시오104
10.3마지막 문제점: 캐시 친화성105
10.4단일 큐 스케줄링105
10.5멀티 큐 스케줄링106
10.6Linux 멀티프로세서 스케줄러110
10.7요약110
참고 문헌111
제11장CPU 가상화에 관한 마무리 대화113

제 II 편: 메모리 가상화

제목페이지
제12장메모리 가상화에 관한 대화115
제13장주소 공간의 개념117
13.1초기 시스템117
13.2멀티프로그래밍과 시분할118
13.3주소 공간119
13.4목표119
13.5요약120
참고 문헌122
제14장막간: 메모리 관리 API127
14.1메모리 공간의 종류127
14.2malloc() 함수128
14.3free() 함수130
14.4흔한 오류130
14.5운영체제의 지원134
14.6기타 함수들134
14.7요약134
참고 문헌135
숙제 (코드)136
문제136
제15장주소 변환의 원리139
15.1가정140
15.2사례140
15.3동적 (하드웨어 기반) 재배치142
15.4하드웨어 지원: 요약145
15.5운영체제 이슈147
15.6요약148
참고 문헌151
숙제152
문제152
제16장세그멘테이션153
16.1세그멘테이션: 베이스+바운드(base+bound)의 일반화153
16.2세그멘트 종류의 파악156
16.3스택157
16.4공유 지원158
16.5소단위 대 대단위 세그멘테이션159
16.6운영체제의 지원159
16.7요약161
참고 문헌162
숙제164
문제164
제17장빈 공간 관리165
17.1가정166
17.2저수준 기법들166
17.3기본 전략175
17.4다른 접근법177
17.5요약179
참고 문헌180
숙제181
문제181
제18장페이징: 개요183
18.1간단한 예제 및 개요183
18.2페이지 테이블은 어디에 저장되는가187
18.3페이지 테이블에는 실제 무엇이 있는가187
18.4페이징: 너무 느림189
18.5메모리 트레이스190
18.6요약193
참고 문헌194
숙제195
문제195
제19장페이징: 더 빠른 변환 (TLB)197
19.1TLB의 기본 알고리즘198
19.2예제: 배열 접근199
19.3TLB 미스는 누가 처리할까201
19.4TLB의 구성: 무엇이 있나?203
19.5TLB의 문제: 문맥 교환203
19.6이슈: 교체 정책207
19.7실제 TLB207
19.8요약208
참고 문헌210
숙제 (측정)212
문제212
제20장페이징: 더 작은 테이블215
20.1간단한 해법: 더 큰 페이지215
20.2하이브리드 접근 방법: 페이징과 세그먼트216
20.3멀티 레벨 페이지 테이블219
20.4역 페이지 테이블226
20.5요약227
참고 문헌228
숙제229
문제229
제21장물리 메모리 크기의 극복: 메커니즘231
21.1스왑 공간232
21.2Present Bit233
21.3페이지 폴트234
21.4메모리에 빈 공간이 없으면?235
21.5페이지 폴트의 처리236
21.6교체는 실제 언제 일어나는가237
21.7요약238
참고 문헌239
제22장물리 메모리 크기의 극복: 정책241
22.1캐시 관리241
22.2최적 교체 정책242
22.3간단한 정책: FIFO243
22.4또 다른 간단한 정책: 무작위 선택244
22.5과거 정보의 사용: LRU245
22.6워크로드에 따른 성능 비교247
22.7과거 이력 기반 알고리즘의 구현248
22.8LRU 정책 근사하기252
22.9갱신된 페이지 (Dirty Page)의 고려254
22.10다른 VM 정책들254
22.11쓰래싱 (Thrashing)255
22.12요약255
참고 문헌256
숙제258
문제258
제23장VAX/VMS 가상 메모리 시스템259
23.1배경259
23.2메모리 관리 하드웨어260
23.3실제 주소 공간260
23.4페이지 교체261
23.5그 외의 VM 기법들263
23.6요약265
참고 문헌267
제24장메모리 가상화를 정리하는 대화269

제 III 편: 병행성

제목페이지
제25장병행성에 관한 대화275
제26장병행성: 개요277
26.1예제: 쓰레드 생성278
26.2훨씬 더 어려운 이유: 데이터의 공유280
26.3제어 없는 스케줄링283
26.4원자성에 대한 바람285
26.5또 다른 문제: 상대 기다리기287
26.6정리: 왜 운영체제에서?287
참고 문헌288
숙제290
문제290
제27장막간: 쓰레드 API293
27.1쓰레드 생성293
27.2쓰레드 종료295
27.3297
27.4컨디션 변수299
27.5컴파일과 실행300
27.6요약301
참고 문헌302
제28장305
28.1락: 기본 개념305
28.2Pthread 락306
28.3락 구현306
28.4락의 평가307
28.5인터럽트 제어307
28.6Test-And-Set (Atomic Exchange)309
28.7진짜 돌아가는 스핀 락의 구현311
28.8스핀 락 평가313
28.9Compare-And-Swap313
28.10Load-Linked와 Store-Conditional314
28.11Fetch-And-Add316
28.12요약: 과도한 스핀317
28.13간단한 접근법: 무조건 양보!318
28.14큐의 사용: 스핀 대신 잠자기319
28.15다른 운영체제, 다른 지원321
28.162단계 락321
28.17요약322
참고 문헌323
숙제325
문제325
제29장락 기반의 병행 자료 구조327
29.1병행 카운터327
29.2병행 연결 리스트331
29.3병행 큐335
29.4병행 해시 테이블335
29.5요약336
참고 문헌339
제30장컨디션 변수341
30.1정의와 루틴들342
30.2생산자/소비자 (유한 버퍼) 문제345
30.3컨디션 변수 사용 시 주의점352
30.4요약354
참고 문헌355
제31장세마포어357
31.1세마포어: 정의357
31.2이진 세마포어 (락)359
31.3컨디션 변수로서의 세마포어361
31.4생산자/소비자 (유한 버퍼) 문제362
31.5Reader-Writer 락367
31.6식사하는 철학자369
31.7세마포어 구현371
31.8요약372
참고 문헌373
제32장병행성 관련 오류375
32.1오류의 종류375
32.2비 교착 상태 오류376
32.3교착 상태 오류379
32.4요약387
참고 문헌388
제33장이벤트 기반의 병행성 (고급)391
33.1기본 개념: 이벤트 루프391
33.2중요 API: select() (또는 poll())392
33.3select()의 사용393
33.4왜 간단한가? 락이 필요 없음394
33.5문제: 블로킹 시스템 콜 (Blocking System Call)395
33.6해법: 비동기 I/O395
33.7또 다른 문제점: 상태 관리396
33.8이벤트 사용의 어려움398
33.9요약399
참고 문헌400
제34장병행성을 정리하는 대화403

제 IV 편: 영속성

제목페이지
제35장영속성에 관한 대화407
제36장I/O 장치409
36.1시스템 구조409
36.2표준 장치410
36.3표준 방식411
36.4인터럽트를 이용한 CPU 오버헤드 개선412
36.5DMA를 이용한 효율적인 데이터 이동413
36.6디바이스와 상호작용하는 방법414
36.7운영체제에 연결하기: 디바이스 드라이버415
36.8사례 연구: 간단한 IDE 디스크 드라이버417
36.9역사상의 기록418
36.10요약420
참고 문헌421
제37장하드 디스크 드라이브423
37.1인터페이스423
37.2기본 구조424
37.3간단한 디스크 드라이브424
37.4I/O 시간 계산429
37.5디스크 스케줄링431
37.6요약436
제38장Redundant Arrays of Inexpensive Disks (RAID)441
38.1인터페이스와 RAID의 내부442
38.2결함 모델443
38.3RAID의 평가 방법443
38.4RAID 레벨 0: 스트라이핑444
38.5RAID 레벨 1: 미러링448
38.6RAID 레벨 4: 패리티를 이용한 공간 절약451
38.7RAID 레벨 5: 순환 패리티455
38.8RAID 비교: 정리456
38.9RAID와 관련된 다른 흥미로운 주제들457
38.10요약457
참고 문헌458
숙제460
문제460
제39장막간: 파일과 디렉터리461
39.1파일과 디렉터리461
39.2파일 시스템 인터페이스463
39.3파일의 생성463
39.4파일의 읽기와 쓰기464
39.5비 순차적 읽기와 쓰기466
39.6fsync()를 이용한 즉시 기록467
39.7파일 이름 변경468
39.8파일 정보 추출469
39.9파일 삭제469
39.10디렉터리 생성470
39.11디렉터리 읽기471
39.12디렉터리 삭제하기472
39.13하드 링크472
39.14심볼릭 링크474
39.15파일 시스템 생성과 마운트475
39.16요약477
참고 문헌478
숙제479
문제479
제40장파일 시스템 구현481
40.1생각하는 방법481
40.2전체 구성482
40.3파일 구성: 아이노드485
40.4디렉터리 구조489
40.5빈 공간의 관리491
40.6실행 흐름: 읽기와 쓰기491
40.7캐싱과 버퍼링495
40.8요약497
참고 문헌499
숙제501
문제501
제41장지역성과 Fast File System (FFS)503
41.1문제: 낮은 성능503
41.2FFS: 디스크에 대한 이해가 해답이다505
41.3파일 시스템 구조: 실린더 그룹505
41.4파일과 디렉터리 할당 정책506
41.5파일 접근의 지역성 측정507
41.6대용량 파일 예외 상황508
41.7FFS에 대한 기타 사항510
41.8요약512
참고 문헌513
제42장크래시 일관성: FSCK와 저널링515
42.1예제516
42.2해법 1: 파일 시스템 검사기519
42.3해법 2: 저널링 (또는 Write-Ahead Logging)521
42.4해법 3: 그 외 방법532
42.5요약533
참고 문헌534
제43장로그 기반 파일 시스템 (LFS)537
43.1디스크에 순차적으로 쓰기538
43.2순차적이면서 효율적으로 쓰기539
43.3적절한 버퍼의 크기는?540
43.4문제: 아이노드 찾기541
43.5간접 계층을 이용한 해법: 아이노드 맵541
43.6최종 완성: 체크포인트 영역542
43.7디스크에서 읽기: 요약543
43.8디렉터리 관리 방법은?543
43.9새로운 문제: 가비지 컬렉션544
43.10블럭의 최신 여부 판단546
43.11정책: 어떤 블럭을 언제 정리하는가547
43.12크래시로부터의 복구와 로그548
43.13요약549
참고 문헌550
제44장데이터 무결성과 보호553
44.1디스크 오류 모델553
44.2숨어있는 섹터 에러 (Latent Sector Error)555
44.3손상 검출: 체크섬556
44.4체크섬의 활용559
44.5새로운 문제: 잘못된 위치에 기록560
44.6마지막 문제: 기록 작업의 손실561
44.7Scrubbing562
44.8체크섬 오버헤드562
44.9요약563
참고 문헌564
제45장영속성을 정리하는 대화567
제46장분산에 관한 대화569
제47장분산 시스템571
47.1통신의 기본571
47.2신뢰할 수 없는 통신 계층572
47.3신뢰할 수 있는 통신 계층573
47.4통신 추상화574
47.5Remote Procedure Call (RPC)577
47.6요약578
참고 문헌583
제48장Sun의 네트워크 파일 시스템 (NFS)587
48.1기본적인 분산 파일 시스템588
48.2NFS에 대하여589
48.3핵심: 단순하고 빠른 서버 크래시 복구589
48.4빠른 크래시 복구의 열쇠: 상태를 유지하지 않음590
48.5NFSv2 프로토콜591
48.6프로토콜에서 분산 파일 시스템으로593
48.7서버의 고장을 멱등연산으로 처리하기595
48.8성능 개선하기: 클라이언트 측 캐싱597
48.9캐시 일관성 문제598
48.10NFS의 캐시 일관성 기법에 대한 평가599
48.11서버 측 쓰기 버퍼링의 의미600
48.12요약601
참고 문헌602
제49장Andrew 파일 시스템 (AFS)605
49.1AFS 버전 1605
49.2버전 1의 문제점606
49.3프로토콜의 개선608
49.4AFS 버전 2608
49.5캐시 일관성610
49.6크래시 복구611
49.7AFS의 확장성과 성능613
49.8AFS: 그 외의 개선점들615
49.9요약616
참고 문헌617
숙제618
문제618
제50장분산을 정리하는 대화619

부록

항목페이지
색인621
여담641
643
핵심 질문645