예제소스 너무 하시는거 아닙니까~
한글도 다 깨져서 나오고..
이거 빨리 고쳐주세요~
예제를 다운받아서 보려고 해도..
실행하나 않되니.. 이거 어떻게 합니다..
빠른 조치 부탁드립니다.
눈에 보이지 않는 또 다른 시스템 알고리즘! OS를 이해하자
프로그램을 만들다 보면 수많은 문제에 부딪힌다. 시스템이 다운되기도 하고 보안 허점이 드러나 동분서주하다가 튜닝은 꿈도 꾸지 못하는 상황이 자주 발생한다. 이런 상황에 닥쳤다면 이는 프로그래머의 프로그래밍 스킬이 부족해서일까? 아니다. 해답의 실마리는 운영체제의 내부 구조를 이해하는 데서부터 시작된다.
저자 서문 역자 서문 이 책의 주요 내용 목차 1부. 운영체제의 구조를 배우자 1장. 운영체제의 동작 철저 이해 운영체제는 애플리케이션의 요청을 "조정(調停)"한다 운영체제는 높은 특권레벨에서 작동한다 각 세그먼트의 속성은 디스크립터 테이블에 설정한다 I/O 특권레벨을 설정해서 I/O 접근을 제한한다 콜게이트와 소프트웨어 인터럽트로 커널모드로 들어간다 Windows에서의 API 호출 처리 순서 Linux에서의 시스템 호출 처리 순서 Windows 애플리케이션이 시작할 때까지 2장. 운영체제의 3대 기능 01. 프로세스/스레드 관리 짧은 간격으로 태스크를 전화하여 멀티태스크 구현 CPU의 상태를 보존/복원해서 태스크를 전환 스레드는 프로세스보다 빠르게 전환된다 우선순위를 고려해서 태스크를 스케줄링한다 02. 메모리 관리 디스크와 조합하여 보이는 메모리량을 늘려라 가상 주소와 실제 주소를 페이지 단위로 매핑한다 프로세스마다 페이지 테이블을 준비해서 주소 공간을 분리한다 예약과 수용의 2단계 조작으로 메모리를 할당한다 03. 파일 관리 구조가 간단한 FAT FS 파일 속성을 유연하게 다룰 수 있는 NTFS i-node로 디스크를 관리하는 Linux의 Ext2 FS 3장. 사용자 입력 구조 인터럽트를 사용해서 이벤트 발생을 알려준다 우선순위가 낮은 인터럽트는 보류한다 윈도우 메시지로 애플리케이션에 통지한다 큐를 2단으로 구성해서 메시지를 놓치는 것을 막는다 메시지 루프로 큐에서 메시지를 꺼낸다 2부. API로 배우는 Windows의 구조 4장. Windows 애플리케이션의 구조 Windows 애플리케이션은 이벤트 반응형이다 메시지를 사용해 이벤트를 통지한다 윈도우 프로시저로 메시지를 처리한다 WinMain 함수에서 실행을 시작한다 윈도우 클래스를 등록해 윈도우를 생성한다 메시지 루프로 메시지를 하나씩 꺼낸다 메시지의 대부분은 DefWindowProc에 처리를 맡긴다 5장. 윈도우 윈도우는 Windows가 관리하는 객체다 윈도우 스타일로 윈도우의 구성요소를 지정한다 윈도우 스타일로 윈도우의 종류를 지정한다 부모 윈도우는 자식 윈도우의 디스플레이 윈도우 간 소유 관계를 설정한다 컨트롤 ID로 자식 윈도우를 식별한다 SetWindowPos API로 Z 순서를 지정한다 6장. 윈도우 메시지 메시지 하나는 단시간에 처리한다 장시간을 필요로 하는 처리는 분할해서 실행한다 PeekMessage API를 사용해 공전 시간에 처리한다 독자적인 메시지를 정의한다 PostMessage를 사용해 큐를 경유하는 메시지를 보낸다 메시지 전달인자에 포인터를 넘긴다 7장. Windows 콘솔 사용 Windows에도 콘솔 환경이 있다 표준 입출력을 사용한다 콘솔 프로그램과 GUI 프로그램의 차이는 작다 GUI 프로그램에서도 콘솔을 이용할 수 있다 콘솔 API를 사용해 본다 저수준 API에서는 마우스 입력도 다룰 수 있다 8장. 파일 접근 제어 파일을 손쉽게 다룰 수 있게 해주는 파일시스템 라이브러리 함수에서는 텍스트 모드에 주의한다 CreateFile API로 파일을 연다 여러 프로그램으로부터의 동시 접근을 제어한다 데이터의 읽고 쓰기는 버퍼링된다 파일의 특정 위치에서 읽기/쓰기를 한다 마무리는 잊기 쉽지만 중요하다 9장. Windows의 메모리 관리 페이징으로 가상 기억장치를 구현한다 페이징으로 실제 메모리 페이지를 자유롭게 배치한다 다른 프로그램의 메모리에는 접근할 수 없다 VirtualAlloc은 가상 주소의 페이지 상태를 변경한다 힙으로부터 필요한 크기만 할당한다 10장. Windows의 프로세스와 스레드 프로그램을 전환해서 멀티태스킹을 구현한다 멀티스레드는 프로그램 내에서의 멀티태스크 CreateProcess API로 프로세스를 시작한다 WaitForSingleObject API로 프로세스의 종료를 기다린다 CreateThread API로 스레드를 생성한다 라이브러리 함수를 사용할 경우에는 _beginthreadex를 이용한다 11장. 스레드 간 동기화 동기화란 무엇인가 동기화에는 시스템 지원이 필요하다 동일 프로세스 내의 스레드 간에 배타적 제어를 하는 크리티컬 섹션 프로세스 간에도 동기화 객체를 사용한다 프로세스 간의 배타적 제어에는 뮤텍스를 사용한다 유한 개의 리소스 관리에는 세마포어를 사용한다 이벤트를 사용해서 다른 스레드에 통지한다 12장. DLL의 작동 원리 DLL이란 무엇인가 DllMain 함수에서 초기화 처리를 한다 함수를 익스포트한다 DLL을 프로그램에서 이용한다 DLL을 실행 시에 로드해 링크한다 DLL에 리소스를 저장해서 다국어를 지원한다 13장. 프로세스 간 데이터 공유 프로세스에는 각각의 가상 주소 공간이 있다 파일 매핑이란 무엇인가 뷰를 만들어 가상 주소 공간에 매핑한다 페이지 파일을 매핑해서 공유 메모리를 만든다 WM_COPYDATA 메시지로 간단하게 데이터를 주고받는다 14장. 실행 파일의 구조 tdump로 실행 파일의 내용을 들여다본다 더미 MS-DOS 프로그램 뒤쪽에 Windows 프로그램이 있다 Windows에서는 옵션 헤더를 참조해서 실행 환경을 설정한다 실행 파일은 섹션 단위로 로드된다 TLS나 리소스는 코드나 데이터와는 다른 섹션에 저장된다 이미지 베이스를 변경할 때는 재배치를 한다 익스포트 정보를 저장하는 .edata 섹션 임포트 정보를 저장하는 idata 섹션 15장. Windows의 접근 제어 구조 왜 보안이 중요한가 파일이나 레지스트리도 객체로 접근 제어를 한다 사용자/그룹 단위로 접근 권한을 설정한다 보안 디스크립터를 객체 생성 시에 지정한다 프로세스의 접근 토큰을 체크한다 명시적으로 보안 디스크립터를 지정한다 16장. 서비스 생성 서비스란 특정 규칙에 따라 만들어진 콘솔 프로그램이다 SCM이 서비스 실행을 제어한다 서비스는 전용 사용자 계정에서 실행된다 main 함수에서 서비스 진입점 등록 실질적인 처리는 ServiceMain 함수에서 한다 제어 핸들러로 SCM에서 송신하는 제어 코드에 응답한다 서비스를 설치/제거한다 프로그램에서 서비스를 제어한다 17장. 프로세스 간 통신을 통한 데이터 교환 파이프는 프로세스 간 데이터 통로다 이름있는 파이프는 같은 이름으로 얼마든지 만들 수 있다 파이프는 파일과 똑같이 읽고 쓸 수 있다 클라이언트에서 파이프에 접속한다 이름없는 파이프의 핸들은 상속해서 사용한다 클립보드는 데이터의 일시적인 보관 장소다 소유권을 획득하고 나서 데이터를 설정한다 설정된 객체의 소유권은 시스템으로 이전된다 지연 렌더링으로 필요에 따라 데이터를 설정한다 18장. 디버거의 구조 디버거의 기본은 중단점이다 디버거의 커널모드 부분을 Windows와 결합한다 디버그 이벤트를 보내서 디버거에 통지한다 디버거의 자식 프로세스로 디버그 대상 프로세스를 시작한다 WaitForDebugEvent로 이벤트를 받는다 디버그 대상 프로세스의 메모리에 접근한다 예외 발생 시에 디버거를 시작한다 19장. 유니코드와 다국어 지원 컴퓨터로 처리하기 위해 문자에 코드를 할당한다 온 세상의 문자를 문자 집합 하나로 정리한다 기존 시스템과 호환성이 높은 UTF-8 CJK 문자를 동시에 표현할 수 없는 경우가 있다 Win32 API에는 ANSI판과 유니코드판이 있다 일반형을 사용해 프로그램을 작성한다 메시지로 주고받는 문자열은 자동으로 변환된다 20장. 폰트 폰트는 자형(字形) 데이터베이스다 논리 폰트를 물리 폰트에 매핑한다 페널티를 계산해서 최적 폰트를 선택한다 문자열 그리기 전용 API를 사용한다 문자 코드에 맞추어 폰트의 문자 집합을 설정한다 유니코드의 문자 코드 범위에서 출력할 수 있는 폰트를 검색한다 21장. 구조화 예외 처리 매커니즘 VC++의 독자적인 키워드를 사용해서 SEH를 이용한다 콜백 함수의 주소를 TIB로 설정한다 어셈블리 언어를 사용해 예외 핸들러를 등록한다 레지스터 세 개를 수정해서 예외 발생 시의 실행 재시작 위치를 변경한다 언와인드를 위해 한 번 더 콜백 함수를 호출한다 미처리 예외를 처리하는 순서는 디버거의 유무에 따라 다르다 22장. 비동기 I/O 처리를 이용한 파일 접근 디스크 접근 대기 시간을 유효하게 사용한다 이벤트 객체를 사용해서 처리 완료를 통지한다 PeekOverlappedResult API로 처리 결과를 얻어온다 동기 I/O와 비동기 I/O는 섞어서 사용할 수 없다 비동기 I/O 전용 API를 이용한다 경계 가능 상태를 위해서는 "Ex"가 붙은 대기용 API를 이용한다 23장. 디바이스 드라이버와 플러그 앤 플레이의 구조 디바이스 드라이버가 하드웨어의 차이를 흡수한다 WDM 드라이버는 Windows 2000/98 모두에서 사용할 수 있다 기능 드라이버가 버스 드라이버를 통하여 장치를 제어한다 필터 드라이버를 생성해서 운영체제의 기능을 확장한다 버스에 접속된 장치를 열거한다 INF 파일을 참조해서 드라이버를 설치한다 전원 관리에는 WDM 드라이버 지원이 필요하다 24장. 디바이스 드라이버 제작 도전 키 배치를 바꾸는 필터 드라이버를 제작한다 키 배치를 바꾸려면 함수가 7개 필요하다 DriverEntry 함수에서 각종 핸들러를 등록한다 AddDeviceHandler 함수로 장치 객체를 생성/추가한다 DefaultHandler 함수로 드라이버 간 통신을 한다 전원 관리와 PnP에는 전용 함수를 사용한다 키 배치 교체의 핵심 처리는 ReadHandler 함수에서 구현한다 ReadComplete 함수로 데이터 읽기 완료를 통지한다 Build 유틸리티를 이용해 빌드한다 필터 드라이버 설치는 전용 설치기를 준비한다 찾아보기
자료명 | 등록일 | 다운로드 |
---|---|---|
예제소스 | 2016-04-06 | 다운로드 |