Top

임베디드 메모리 최적화 기법

  • 원서명Code Optimization: Effective Memory Usage (ISBN 9781931769242)
  • 지은이Kris Kaspersky
  • 옮긴이여인춘
  • ISBN : 8989975484
  • 36,000원
  • 2004년 06월 02일 펴냄
  • 페이퍼백 | 389쪽 | 190*250mm
  • 시리즈 : 임베디드 시스템

책 소개

소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/embedded-memory)

<책 소개>
더 빠른 프로그램 작성을 위한 실용적인 지침서

이 책은 최적화를 통해 프로그램의 속도를 높이는 방법을 다룬다. 시스템의 성능을 떨어뜨리는 프로그래머들이 흔히 범하는 실수를 쉽게 구현한 해결책과 더불어, 디바이스들과 컴퓨터 컴포넌트간의 상호작용 매커니즘, 효율적인 프로그래밍 방법, 그리고 프로그램 최적화 기법을 자세히 배운다. 또한 프로그래머들은 일반적으로 어셈블러가 사용하는 프로그래밍 방법을 고급 언어로 어떻게 효율적으로 구현할 것인지 배운다. 특히 램과 캐시 서브시스템에 주목하자. 최대 성능을 얻기 위해 메모리를 감시할 수 있게 해주는 프로그래밍 방법에 대한 설명을 비롯해서 램의 작동 원리, 프로세서와 램이 서로 연결되는 방식도 상세히 소개한다.

이 책은 어셈블리어에 대한 지식을 갖고 있는 시스템 프로그래머들뿐 아니라 C/C++ 프로그래밍 경험을 어느 정도 갖고 있는 애플리케이션 프로그래머들을 대상으로 한다. 그러나 여기에서 설명한 최적화 기법들은 특정한 고급 프로그래밍 언어에 국한되지 않는다. 따라서 C 언어에 대한 지식은 이 책에서 제시하는 소스 코드를 해석하는데만 필요하다. 이 책은 또한 하드웨어 전문가들과 기술자들, 특히 컴퓨터를 제작하고 미세 조정(fine-tune)하는 사람들에게 유용할 것이다. 그리고 하드웨어 작동 원리와 가장 일반적인 하드웨어 컴포넌트 병목 현상에 관해서도 자세하게 설명한다.


저자가 권장하는 코드 최적화를 위한 일반적인 방법

■ 코드 최적화를 시작하기 전에, 같은 코드에 대해 신뢰성이 높되 최적화되지 않은 버전을 작성
■ 성능을 최대로 높이기 위해서는 시스템의 특성이 아닌 알고리즘적인 최적화를 사용
■ 코드 최적화를 어셈블리 구현과 혼동하지 말라.
■ 어셈블리어로 프로그램을 다시 작성하기 전에, 컴파일러가 생성한 어셈블리 코드를 보고 효율을 평가
■ 컴파일러가 생성한 일련의 어셈블리 코드가 완벽함에도 불구하고 프로그램의 실행 속도가 여전히 느리다면 그것을 disassembler로 로드
■ 어셈블리 코드를 작성할 때, 세련되고 효율적인 해결책을 고안


흔히 생각하듯이 최적화에 시간과 노력을 쏟는 것 보다 더욱 새롭고 강력한 프로세서를 장만하는 것이 낫다는 것은 옳지 않다. 뿐만 아니라, 최적화는 대부분의 사람들이 생각하는 것만큼 시간이 걸리지 않는다. 예를 들면 이 책은 각 task에 대해 개별적인 튜닝(미세 조정)을 필요로 하지 않는 여러 가지 보편적인 해결책을 제시한다. 이 책에서 시스템 수준에서 이식 가능한 최적화 기법을 설명하고 특별한 경우를 제외하고는 어셈블리어의 사용을 피하고자 노력했다. 그러나 어셈블러를 사용하지 않고 최적화하는 것은, 특히 프로파일링 기법과 기계-최적화 알고리즘을 설명하는 장들에서는 불가능하다. 그렇지만 어셈블리어 프로그래밍에 경험이 없는 독자들도 코드 전반에 걸친 주석을 통해 어셈블리어 코드를 이해할 수 있을 것이다.


<대상 독자들>

이 책은 다양한 하드웨어 컴포넌트들 사이의 조직과 아키텍쳐, 상호 작용의 매커니즘을 설명하며, 기계 코드와 자료 구조 수준에서의 효율적인 프로그래밍과 코드 최적화 기법에 초점을 맞춘다.
이 책은 어셈블리어에 대한 지식을 갖춘 시스템 프로그래머들뿐 아니라 C/C++ 프로그래밍 경험이 있는 애플리케이션 프로그래머를 대상으로 한다. 그러나 여기에서 논하는 최적화 기법은 특정한 고급 프로그래밍 언어에 국한되지 않는다. 따라서 C 언어에 대한 지식은 이 책에서 제시하는 소스 코드를 해석하는데만 필요하다.
또한 필자는 이 책이 하드웨어 전문가와 기술자, 특히 컴퓨터를 제작하고 미세 조정(fine-tune)하는 사람들에게 유용하기를 희망한다. 따라서 하드웨어 작동 원리에 대한 상세한 설명을 제공하고 가장 일반적인 하드웨어 컴포넌트들의 병목 현상에 관해 논하고자 노력했다.
이 책에서 제공하는 대부분의 내용은 필자의 경험을 바탕으로 한다. 모든 정보를 테스트하고 주의 깊게 확인했지만, 오류가 전혀 없다고 장담할 수는 없다. (“언제나 버그가 하나 더 존재한다.”)
책의 내용은 주로 AMD Athlon과 Intel Pentium II, Pentium III, 그리고 Pentium 4 마이크로프로세서에 적용된다. 그 이전의 프로세서들은 필요한 경우에만 언급하고 고려한다.


<부록 CD>

부록 CD에는 최대 성능에 도달하기 위해 하드웨어와 소프트웨어를 튜닝하고 시스템의 병목 구간을 찾아내기위해 필자가 개발한 유틸리티의 소스 코드가 들어있다.

저자/역자 소개

<저자 소개>

Kris Kaspersky
는 기술 전문 저술가이면서 Hacker Disassembling Uncovered를 집필하고 해킹, disassembling, 코드 최적화의 다양한 측면에 관한 글을 기고하고 있다. 그는 컴파일러 개발, 최적과 기법, 보안 매커니즘 연구, 실시간 OS 커널 개발, 안티바이러스 프로그램의 작성을 포함하여 보안과 시스템 프로그래밍에 관련된 많은 문제을 다루어왔다.


<역자 소개>

여인춘
은 동국대학교 컴퓨터 공학과 석사를 졸업하고 신도리코에서 디지탈 복합기와 프린터의 실시간 운영체제 설계를 맡고 있다.
다수의 수상 경력과 여러권의 집필서가 있으며 관심분야는 로보틱스이다.


<역자 서문>

컴퓨터라는 복잡하고 험난한 세계에 발을 들여놓은지 15년이 다 되어 간다. 15년 중에 절반쯤은 프로그래밍 언어, 자료 구조, 알고리즘, 네트워크와 같이 컴퓨터의 개념과 이론을 배우는 시간이었고 나머지 반은 회사에 입사해서 실제로 프로그래밍을 하는 시간이었던 것 같다. 어느새 중견 프로그래머가 되어 있는데 역자의 경우도 그렇고 주변 동료나 선후배 프로그래머들도 ‘최적화’라는 개념에 대해 신중히 생각하면서 프로그램을 개발한 사람은 거의 본 적이 없다.특히 우리나라 사람들의 특성상 출력되는 결과에 비중을 두고, 오직 그 결과만을 중시 여기는 풍토에서 코드 한 줄 한 줄, 변수 하나 하나까지 신경쓰면서 최적화할 경우는 더더욱 없었다.

이 책은 근래에 가장 많이 사용되는 CPU인 인텔의 펜티엄 계열과 AMD의 애슬론 계열의 CPU에 대한 코드를 최적화 하는 여러가지 방법을 소개하고 있다. 프로그래밍 15년 경력의 필자도 이 책에서 다루는 내용을 그전에는 경험해 본 적도, 들어본 적도 없다. 물론 전부는 아니겠지만 이 책에서 다루는 최적화 기법 중 상당부분은 처음 접해본 내용이다.
처음 이 책의 번역을 맡았을 때는 "이런 최적화까지 필요할까?"라는 의구심을 갖고 시작했는데 막상 책을 다 덮고 나서는 그동안 우물 안 개구리로 살았구나 하는 생각이 든다. 최적화를 위해 각종 시물레이션을 해서 그 결과를 표와 그래프로 일목요연하게 정리하는 저자의 세심한 배려에 놀라지 않을 수 없다.
이 책을 읽는 독자들도 아마 역자와 같은 느낌으로 이 책을 접하리라 생각이 든다. 그렇다고 해서 이 책의 내용을 100% 알고 있어야 하고, 반드시 이 책의 내용대로 프로그래밍을 하라는 것은 결코 아니다. 서울에서 부산까지 가는 방법이 한가지만이 아니듯 개발자에 따라서, 혹은 사용하는 컴파일러와 개발툴에 따라서 다양한 방법이 존재할 것이다. 그러나 서울에서 부산까지 가는 방법 중에서 좀 더 빨리 가는 방법을 찾기 원하는 독자들에게는 이 책이 많은 도움을 주리라 생각한다.
한가지 아쉬움이라면 펜티엄과 애슬론에 대한 얘기 이외에 근래에 노트북 CPU로 각광을 받고 있는 센트리노(Centrino)나 임베디드 CPU인 ARM이나 MIPS에 대한 언급이 있었으면 더 좋지 않았을까 하는 생각이 든다.
그러나 이런 아쉬움도 막상 이 책의 내용에 비하면 그저 바램일 뿐이다. 이 책의 저자인 KRIS KASPERSKY에게 프로그래밍의 또 다른 세계를 보여준 것에 대해 경의를 표하고 싶다.

혹시 역자의 짧은 지식과 어눌한 번역이 저자의 공을 깎아내리는 것은 아닐까 우려되지만 되도록이면 저자의 의도가 그대로 독자에게 전달되도록 신경을 썼다. 이 책이 나오기까지 기획을 맡아준 에이콘 출판사의 김정미씨, 편집과 교정을 봐 준 백은경씨 그리고 칼국수에 와이프를 위한 주스까지 사주신 에이콘 출판사의 사장님께 감사를 드린다.
또한 역자의 번역의 오류를 지적해주고 다듬어준 Kate에게 감사를 드린다.

- 라일락 향기가 연구소를 가득 메운 2004년 봄 날 , 역자 여인춘

목차

목차
  • 서문 최적화의 개요
    • 최적화의 방법
    • 대상 독자들
    • 최적화의 기초
    • 잘못된 통념
  • 1 프로그램 프로파일링
    • 프로파일링의 목적과 대상
      • 전체 실행 시간
      • 실행 시간의 유형
      • 손실 정보
      • 호출 횟수에 대하여
      • 적용 범위의 수준
    • 마이크로 프로파일링의 근본적인 문제점
      • 파이프라이닝 또는 처리율 대 지연시간
      • 측정의 부정확성
      • 하드웨어 최적화
      • 낮은 분해 능력
    • 매크로 프로파일링의 근본적인 문제점
      • 실행 시간 불일치
      • Second-Pass 문제
      • 부작용
      • 각각의 기계에 의존적인 코드 최적화 문제
    • 현재 사용중인 프로파일러에 대해서
      • Intel VTune
      • AMD Code Analyst
      • Microsoft의 Profile.exe
    • 자신만의 프로파일러 사용 41
    • VTune을 사용한 실제 프로파일링 세션
      • Step 1: printf의 삭제
      • Step 2: 루프 밖으로 strlen을 이동
      • Step 3: 데이터 정렬
      • Step 4: strlen 함수의 삭제
      • Step 5: 나누기 연산의 제거
      • Step 6: 성능 모니터링 기능의 제거
      • Step 7: 함수의 결합
      • Step 8: 메모리 액세스 오퍼레이션 수의 감소
      • Step 9: 개인적인 Coach로서의 VTune
      • Step 10: 결론
      • 결과와 분석
  • 2. RAM 서브 시스템
    • RAM의 기초
    • RAM 계층
    • Random Access Memory
    • RAM 디자인과 동작 원리
      • RAM의 코어
      • 일반적인 DRAM (Page Mode DRAM)
      • DRAM의 발전
      • Fast-Page Mode DRAM (FPM DRAM)
      • 메모리 타이밍
      • Extended Data Output DRAM (EDO DRAM)
      • Burst EDO DRAM (BEDO DRAM)
      • Synchronous DRAM (SDRAM)
      • Double Data Rate SDRAM (DDR SDRAM) 또는 SDRAM II
      • Direct Rambus DRAM (Direct RDRAM)
      • 다양한 종류의 메모리 비교
    • 메모리와 프로세서의 상호작용
      • 전체 액세스 시간의 계산
    • 물리적인 DRAM 주소에서 논리적인 주소로의 매핑
    • 메모리 동작의 최적화
      • 권장 사항
      • Unrolling Loops
      • 데이터 종속성의 제거
      • 데이터의 병렬 처리
      • 참조 자료 구조의 최적화
      • 자료 구조 크기의 축소
      • DRAM Bank의 데이터 분포 전략
      • 데이터 플로우 설계
      • Byte, Double Word, Quadruple Word로 메모리 처리
      • 데이터 정렬
      • 메모리 액세스와 계산의 결합
      • 읽기와 쓰기 operation의 그룹화
      • 필요한 경우에만 메모리를 액세스
      • 메모리를 다루는 내장된 C 함수들의 최적화
      • 메모리를 다루는 함수들의 최적화 품질
      • C 문자열 라이브러리 함수들의 최적화
      • 문자열을 다루는 함수들의 최적화 품질
    • 블록 알고리즘의 최적화
      • 큰 데이터 배열 정렬의 최적화
    • 램 테스트의 문제점
  • 3.캐시 서브시스템
    • SRAM의 동작 원리
      • 역사적인 개요
      • 코어
      • 트리거의 구조
      • 논리적 NOT 소자의 구조(인버터)
      • SRAM 배열의 구조
      • 인터페이스 wrapping의 구조
      • 읽기와 쓰기 타이밍 다이어그램
      • 정적 메모리의 유형
    • 캐시의 동작 원리
      • 캐시 메모리의 탄생
      • 캐시 메모리의 목적과 임무
      • 캐시 구조
    • 캐시와 메모리 액세스의 최적화
      • 처리된 데이터의 크기가 성능에 미치는 영향
      • 실행 코드의 크기가 성능에 미치는 영향
      • 데이터 정렬의 효율성
      • 캐시 bank 상의 데이터 분산
      • 캐시의 한정된 associative number
      • 이차원 배열의 처리
      • 쓰기 버퍼링의 세부 사항
      • 신세대 x86 프로세서들의 캐시 관리
      • Prefetching의 실질적인 내용
      • 메모리 복사의 비밀과 펜티엄 III와 펜티엄 4의 새로운 명령들
  • 4.기계 최적화
    • C/C++ 최적화 컴파일러들의 비교 분석
      • 상수식
      • 수학적 표현
      • 수학 연산
      • 분기
      • Switch 연산자
      • 루프
      • 함수 호출
      • 변수의 분산
      • 문자열 초기화
      • Dead Code
      • 상수 조건
      • 승자 판정
    • 어셈블러 대 컴파일러
      • 간단한 역사적 개요 그리고 어셈블러 언어의 새로운 약진
      • 기계 최적화의 질적인 평가 기준
      • 기계 최적화의 질적인 평가 방법
      • 중요 컴파일러의 비교 분석
      • 테스트 결과에 대한 논의
      • 기계 최적화 품질의 데모
      • 어셈블러를 사용한 방어 코드의 생성
      • 생산성의 측면에서의 어셈블리 프로그래밍
      • 결론
      • Source Code
  • Index

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안