목차
저자 서문 = 3
이 책의 특징 = 5
인터넷 강의에 대한 안내 = 6
학습 로드맵 = 8
Part 1 컴퓨터 구조와 프로그래밍 모델
1장. 컴퓨터 구조에 대한 첫 번째 이야기 = 25
01. 시스템 프로그래밍의 이해와 접근 = 27
시스템 프로그랭(System Programing)이란? = 27
컴퓨터 시스템의 주요 구성요소(Main Components) = 28
02. 컴퓨터 하드웨어의 구성 = 30
CPU(Central Processing Unit) = 30
메인 메모리(Main Memory) = 31
입ㆍ출력 버스(Input/Output Bus) = 31
03. CPU에 대한 이해 = 31
ALU(Arithmetic Logic Unit) = 32
컨트롤 유닛(Control Unit) = 32
CPU 내부에 존재하는 레지스터들(Register Set) = 33
버스 인터페이스(Bus Interface) = 34
클럭 신호(Clock Pulse) = 35
04. 프로그램의 실행과정 = 38
위대한 수학자 폰 노이만(J.von Neumann) = 38
프로그램의 실행과정 = 40
05. 하드웨어 구성의 재접근 = 43
폰 노이만의 컴퓨터 구조 vs 오늘날의 컴퓨터 구조 = 43
데이터 이동의 기반이 되는 버스(BUS) 시스템 = 45
이것만은 알고 갑시다 = 48
2장. 아스키코드 vs 유니코드 = 49
01. Windows에서의 유니코드(UNICODE) = 51
문자셋(Character Sets)의 종류와 특성 = 51
MBCS 기반의 문자열 = 53
WBCS 기반의 프로그래밍 = 55
02. MBCS와 WBCS의 동시 지원 = 62
#include〈windows.h〉= 62
Windows에서 정의하고 있는 자료형 = 63
MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 매크로 = 66
MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들 = 71
이것만은 알고 갑시다 = 75
3장. 64비트 기반 프로그래밍 = 77
01. WIN32 vs WIN64 = 79
64비트와 32비트 = 79
프로그래머 입장에서의 64비트 컴퓨터 = 80
02. 프로그램 구현 관점에서의 WIN32 vs WIN64 = 83
LLP64 vs LP64 = 84
64비트와 32비트 공존의 문제점 = 84
Windows 스타일 자료형 = 85
Windows 자료형 확인하기 = 88
Polymorphic 자료형 = 89
03. 오류의 확인 = 93
GetLastError 함수와 에러코드 = 93
04. System Programing Project Design = 97
명령 프롬프트 프로젝트의 제안 = 97
명령 프롬프트 프로젝트의 제안과 EXIT 명령어의 구현 = 98
이것만은 알고 갑시다 = 102
Part 2 프로세스와 IPC
4장. 컴퓨터 구조에 대한 두 번째 이야기 = 105
01. 컴퓨터 구조의 접근방법 = 107
컴퓨터를 디자인하자 = 107
레지스터를 디자인하자 = 107
명령어 구조 및 명령어를 디자인하자 = 108
02. LOAD & STORE 명령어 디자인 = 114
LOAD & STORE 명령어의 필요성 = 115
LOAD & STORE 명령어의 디자인 = 115
03. Direct 모드와 Indirect 모드 = 118
Direct 모드의 문제점과 Indirect 모드의 제안 = 119
Indirect 모드의 이해 = 119
Indirect 모드 활용 예제 = 122
이것만은 알고 갑시다 = 126
5장. 프로세스의 생성과 소멸 = 127
01. 프로세스(Process)의 이해 = 129
프로세스란 무엇인가? = 129
프로세스를 구성하는 요소 = 130
02. 프로세스의 스케줄링과 상태 변화 = 132
프로세스의 스케줄링(Scheduling) = 132
프로세스의 상태 변화 = 134
프로세스의 상태 변화, 시나리오로 다시 이해하기 = 137
03. 컨텍스트 스위칭(Context Switching) = 140
04. 프로세스의 생성 = 143
프로세스의 생성 = 143
CreateProcess 함수의 이해 = 144
예제를 통한 CreateProcess 함수의 이해 = 146
실습을 위한 환경의 구성 및 실행 = 153
05. 프로세스 생성과 관련된 예제 그리고 문제점 = 154
06. 명령 프롬프트 프로젝트 기능 추가 = 159
필자가 구현한 답안 = 159
이것만은 알고 갑시다 = 161
6장. 커널 오브젝트와 오브젝트 핸들 = 163
01. 커널 오브젝트에 대한 이해 = 165
커널 오브젝트의 이해 = 165
그 이외의 커널 오브젝트들 = 167
오브젝트 핸들(Handle)을 이용한 커널 오브젝트의 조작 = 168
02. 커널 오브젝트와 핸들의 종속 관계 = 175
커널 오브젝트의 종속 관계 = 175
핸들의 종속 관계 = 176
예제를 통한 종속 관계의 이해 = 176
03. 커널 오브젝트와 Usage Count = 180
CloseHandle 함수에 대한 정확한 이해 = 181
CloseHandle 함수와 프로세스 종료코드 = 185
커널 오브젝트와 Usage Count = 188
Usage Count와 CloseHandle = 190
Calculator.cpp의 문제점 그리고 해결책 = 192
문제의 정답은? = 197
04. 명령 프롬프트 프로젝트 기능 추가 = 199
필자가 구현한 답안 = 201
이것만은 알고 갑시다 = 207
7장. 프로세스간 통시(IPC) 1 = 209
01. 프로세스간 통신(IPC)의 의미 = 211
프로세스 사이에서 통신이 이뤄지기 위한 조건 = 211
프로세스들이 서로 만날 수 없는 이유 = 212
프로세스들이 서로 만나지 못하게 디자인한 이유 = 213
02. 메일슬롯 방식의 IPC = 214
메일슬롯(Mail Slot) 원리 = 214
메일슬롯(Mail Slot) 구성을 위해 필요한 요소 = 215
메일슬롯의 예 = 218
메일슬롯의 고찰과 앞으로의 전개에 대해서 = 223
03. Signaled vs Non-Signaled = 225
커널 오브젝트의 두 가지 상태(State) = 226
커널 오브젝트의 두 가지 상태를 확인하는 용도의 함수 = 227
커널 오브젝트의 상태 확인이 필요한 상황의 연출 = 229
이것만은 알고 갑시다 = 238
8장. 프로세스간 통신(IPC) 2 = 239
01. 핸들 테이블과 오브젝트 핸들의 상속 = 241
도입 배경(Introduction to Jeffery Richter) = 241
프로세스의 커널 오브젝트 핸들 테이블 = 242
핸들의 상속 = 244
예제를 통해서 확인하는 핸들 정보의 상속 = 249
Pseudo 핸들과 핸들의 중복(Duplicate) = 256
부모 프로세스의 핸들을 자식 프로세스에게 전달하기 = 259
02. 파이프 방식의 IPC = 262
메일슬롯에 대한 회고와 파이프의 이해 = 262
이름없는 파이프(Anonymous Pipe) = 263
이름있는 파이프(Named Pipe) = 267
03. 프로세스 환경변수 = 278
04. 명령 프롬프트 프로젝트 기능 추가 = 281
CreateToolhelp32Snapshot = 282
여러분 차례 = 283
필자가 구현한 답안 = 285
이것만은 알고 갑시다 = 290
9장. 스케줄링 알고리즘과 우선순위 = 291
01. 프로세스의 스케줄링(Scheduling) = 293
일반 OS와 리얼타임(Real Time) OS의 차이점 = 293
Soft RTOS vs Hard RTOS = 295
선점형(Preemptive) OS와 비선점형(Non-Preemptive) OS = 295
우선순위(Priority) 스케줄링 알고리즘 = 297
라운드 로빈(Round-Robin) 스케줄링 알고리즘 = 298
스케줄링 알고리즘에 의해서 스케줄링이 진행되는 시점 = 299
Priority Inversion = 299
02. Windows 프로세스 우선순위 = 301
03. 명령 프롬프트 프로젝트 기능 추가 = 307
리다이렉션(Redirection)의 이해 = 307
리다이렉션(Redirection) 구현방법 = 310
필자가 구현한 답안 = 311
이것만은 알고 갑시다 = 316
Part 3 멀티 쓰레드와 동기화
10장. 컴퓨터 구조에 대한 세 번째 이야기 = 319
01. 절차적 함수 호출(Procedure Call) 지원 CPU 모델 = 321
스택 프레임(Stack Frame) 구조 = 321
sp 레지스터 = 322
프레임 포인터(Frame Pointer) 레지스터 = 324
스택에 저장하자, 프레임 포인터(Frame Pointer) = 327
02. 함수 호출 인자의 전달과 PUSH & POP 명령어 디자인 = 330
함수 호출 인자의 전달방식 = 330
PUSH & POP 명령어 디자인 = 331
03. 함수 호출(Procedure Call)에 의한 실행의 이동 = 337
다시 살펴보는 메모리 구조와 프로그램 카운터(Program Counter) = 337
함수 호출과 함수 종료 = 339
04. 함수 호출규약(Calling Convention) = 343
함수 호출규약이란? = 343
cded, stdcall +a = 343
호출규약의 종류와 의미 = 345
이것만은 알고 갑시다 = 347
11장. 쓰레드의 이해 = 349
01. 쓰레드란 무엇인가? = 351
멀티 프로세스 기반 프로그램 = 351
멀티 프로세스 운영체제 기반 프로그램의 문제점과 새로운 제안 = 352
해결책, 쓰레드 = 353
메모리 구조 관점에서 본 프로세스와 쓰레드 = 353
Windows에서의 프로세스와 쓰레드 = 357
02. 쓰레드 구현 모델에 따른 구분 = 361
커널 레벨(Kernel Level) 쓰레드와 유저 레벨(User Level) 쓰레드 = 362
커널 모드(Kernel Mode)와 유저 모드(User Mode) = 365
커널 레벨 쓰레드와 유저 레벨 쓰레드의 장점 및 단점 = 367
이것만은 알고 갑시다 = 368
12장. 쓰레드의 생성과 소멸 = 369
01. Windows에서의 쓰레드 생성과 소멸 = 371
쓰레드의 생성 = 371
쓰레드의 소멸(쓰레드 생성에 대한 추가적인 이야기 포함) = 378
02. 쓰레드의 성격과 특성 = 385
힙, 데이터 영역, 그리고 코드 영역의 공유에 대한 검증 = 385
동시접근에 있어서의 문제점 = 388
프로세스로부터의 쓰레드 분리 = 391
ANSI 표준 C 라이브러리와 쓰레드 = 393
03. 쓰레드의 상태 컨트롤 = 400
쓰레드의 상태 변화 = 400
Suspend & Resume = 401
04. 쓰레드의 우선순위 컨트롤 = 405
이것만은 알고 갑시다 = 407
13장. 쓰레드 동기화 기법 1 = 409
01. 쓰레드 동기화란 무엇인가? = 411
두 가지 관점에서의 쓰레드 동기화 = 411
쓰레드 동기화에 있어서의 두 가지 방법 = 413
02. 임계 영역(Critical Section) 접근 동기화 = 414
임계 영역(Critical Section)에 대한 이해 = 414
03. 유저 모드 동기화(Synchronization In User Mode) = 418
크리티컬 섹션(Critical Section) 기반의 동기화 = 419
인터락 함수(Interlocked Family Of Function) 기반의 동기화 = 424
04. 커널 모드 동기화(Synchronization In Kernel Mode) = 429
뮤텍스(Mutex) 기반의 동기화 = 429
세마포어(Semaphore) 기반의 동기화 = 435
이름있는 뮤텍스(Named Mutex) 기반의 프로세스 동기화 = 441
뮤텍스의 소유와 WAIT_ABANDONED = 446
이것만은 알고 갑시다 = 450
14장. 쓰레드 동기화 기법 2 = 451
01. 실행순서에 있어서의 동기화 = 453
생산자/소비자 모델 = 453
이벤트(Event) 기반 동기화 = 455
수동 리셋(Manual-Reset) 모드 이벤트(Event)의 활용 예 = 460
02. 이벤트(Event) 더하기 뮤텍스(Mutex) = 464
이벤트와 뮤텍스 오브젝트 적용 예제 = 464
03. 타이머(Timer) 기반 동기화 = 467
수동 리셋 타이머(Manual-Reset Timer) = 468
주기적 타이머(Periodic-Timer) = 472
이것만은 알고 갑시다 = 475
15장. 쓰레드 풀링(Pooling) = 477
01. 쓰레드 풀에 대한 이해 = 479
02. 쓰레드 풀의 구현 = 480
쓰레드 풀 구현의 모듈별 해석 = 481
쓰레드 풀 구현 소스코드 = 485
03. 명령 프롬프트 프로젝트 기능 추가 = 490
입력과 출력을 연결하는 파이프 = 490
구현 원리 = 492
구현 사례 = 492
이것만은 알고 갑시다 = 497
Part 4 메모리 관리와 I/O
16장. 컴퓨터 구조에 대한 네 번째 이야기 = 501
01. 메모리 계층(Memory Hierarchy) = 503
메모리의 범위와 종류 = 503
메모리의 계층 구조(Memory Hierarchy) = 505
02. 캐쉬(Cache)와 캐쉬 알고리즘 = 510
컴퓨터 프로그램의 일반적인 특성 = 510
캐쉬 알고리즘 = 512
캐쉬 프렌드리 코드(Cache Freindly Code) 작성기법 = 514
03. 가상 메모리(Virtual Memory) = 515
물리 주소(Physical Address) = 516
가상 주소(Virtual Address) 시스템 1 = 518
가상 주소(Virtual Address) 시스템 2 = 523
이것만은 알고 갑시다 = 527
17장. 구조적 예외처리(SEH) 기법 = 529
01. SEH(Structured Exception Handling) = 531
예외처리의 필요성 = 531
예외(예외상황)와 에러(혹은 오류)의 차이점 = 533
하드웨어 예외와 소프트웨어 예외 = 534
02. 종료 핸들러(Termination Handler) = 535
종료 핸들러의 기본 구성과 동작 원리 = 536
종료 핸들러 활용 사례 연구 1 = 539
종료 핸들러 활용 사례 연구 2 = 543
03. 예외 핸들러(Exception Handler) = 545
예외 핸들러와 필터(Exception Handler & Filters) = 546
예외 핸들러의 활용 사례 연구 = 549
처리되지 않은 예외의 이동 = 552
핸들러의 중복 = 557
정의되어 있는 예외의 종류와 예외를 구분하는 방법 = 558
EXCEPTION_CONTINUE_EXECUTION & EXCEPTION_CONTINUE_SEARCH = 561
04. 소프트웨어 기반의 개발자 정의 예외 = 570
소프트웨어 예외(Software Exceptions)의 발생 = 570
GetExceptionInformation = 577
이것만은 알고 갑시다 = 582
18장. 파일 I/O와 디렉터리 컨트롤 = 583
01. 기본적인 파일 처리 함수들 = 585
파일 열기 & 닫기 = 585
파일 읽기 & 쓰기와 포인터 = 587
파일을 열어서 읽고 쓰고 닫는 예제 = 587
파일의 시간 정보 얻어오기 = 590
파일 사이즈 얻어오기 = 595
파일의 특성(Attribute) 정보 얻어오기 = 598
파일의 특성(Attribute) 정보 핸들로부터 얻어오기 +a = 602
파일의 경고(Path) 정보 얻어오기 = 605
파일 포인터의 이동 - 32비트 기반 = 607
파일 포인트의 이동 - 64비트 기반 = 610
02. 디렉터리 관련 함수 및 그밖의 함수들 = 613
디렉터리의 생성과 소멸 = 613
현재 디렉터리, 시스템 디렉터리 그리고 Windows 디렉터리 = 615
디렉터리에서 파일 찾기 = 619
03. 명령 프롬프트 프로젝트 기능 추가 = 626
XCOPY의 이해 = 626
XCOPY의 구현 범위 및 방법 = 628
XCOPY의 구현 사례 = 628
이것만은 알고 갑시다 = 632
19장. 비동기 I/O와 APC = 633
01. 비동기(Asynchronous) I/O = 635
비동기 I/O의 이해 = 635
중첩(Overlapped) I/O = 638
중첩(Overlapped) I/O 예제 = 641
완료루틴(Completion Routine) 기반 확장 I/O = 649
알림 가능한 상태(Alertable State) = 655
OVERLAPPED 구조체의 파일 위치 정보 = 656
타이머에서의 완료루틴 = 662
지금까지의 내용 정리 = 664
02. APC(Asynchronous Procedure Call) = 665
APC의 구조 = 665
APC Queue의 접근 = 666
이것만은 알고 갑시다 = 669
20장. 메모리 관리(Virtual Memory, Heap, MMF) = 671
01. 가상 메모리(Virtual Memory) 컨트롤 = 673
Reserve, Commit 그리고 Free = 673
메모리 할당의 시작점과 단위 확인하기 = 676
VirtualAlloc & VirtualFree 함수 = 677
Dynamic Array Design = 679
02. 힙(Heap) 컨트롤 = 683
힙(Heap) 컨트롤에 대한 필자의 기억 = 684
디폴트 힙(Default Heap) & Windows 시스템에서의 힙 = 685
디폴트 힙 컨트롤 = 687
힙(Dynamic Heap) 생성이 가져다 주는 또 다른 이점 = 688
힙의 생성과 소멸 그리고 할당 = 691
Heap & Linked List 예제 = 693
03. MMF(Memory Mapped File) = 700
MMF의 이해 = 701
MMF의 구현과정 = 703
MMF의 구현 함수 = 704
MMF의 구성 예제 1 = 706
읽고 쓰기 위한 MMF = 707
Copy-On-Write(COW) = 711
이것만은 알고 갑시다 = 715
21장. Dynamic Linking Library = 717
01. 라이브러리와 printf! = 719
질문 = 719
해답은 라이브러리 = 720
라이브러리 작성에 대한 동기 = 721
라이브러리 작성 = 722
라이브러리의 활용 = 725
STATIC LIBRARY = 728
02. 또 다른 라이브러리 DLL = 729
DLL(Dynamic Linking Library)에 대한 이해 = 730
DLL과 정적 라이브러리의 차이점 = 730
DLL 제작 1 : 암묵적 연결(Implicit Linking) = 733
DLL과 extern 선언 = 740
DLL 제작 2 : 명시적 연결(Explicit Linking) = 742
한 번 이상 로드될 수 있는 DLL = 746
03. 도대체 헤더파일을 몇 개나 만들 작정이야! = 749
필요한 헤더파일의 개수는 최소한 세 개 = 749
하나의 헤더파일로 모두 지원하기 = 749
이것만은 알고 갑시다 = 754
찾아보기 = 755