목차 일부
저자 서문 ... 3
이 책의 특징 ... 5
인터넷 강의에 대한 안내 ... 6
학습 로드맵 ... 8
Part 1 컴퓨터 구조와 프로그래밍 모델
1장. 컴퓨터 구조에 대한 첫 번째 이야기 ... 25
01. 시스템 프로그래밍의 이해와 접근 ... 27
시스템 프로그랭(System Programing)이란? ... 27
...
더보기
목차 전체
저자 서문 ... 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
더보기 닫기