코딩_Coding_Dev책_정리/C++&_C언어_Coding_Book
컴퓨터 시스템 딥 다이브 : C 언어부터 어셈블리, 아키텍처, OS까지 한 꺼풀씩 벗겨보는 컴퓨터 시스템
내인생PLUS
2023. 12. 27. 16:17
728x90
eBook)
컴퓨터 시스템 딥 다이브 : C 언어부터 어셈블리, 아키텍처, OS까지 한 꺼풀씩 벗겨보는 컴퓨터 시스템 [ PDF ]
수잰 J. 매슈스,티아 뉴홀,케빈 C. 웹 저 / 김모세,권성환 역 | 한빛미디어 | 2024년 01월 08일
https://m.yes24.com/p/124429581
종이책
컴퓨터 시스템 딥 다이브 : C 언어부터 어셈블리, 아키텍처, OS까지 한 꺼풀씩 벗겨보는 컴퓨터 시스템
수잰 J. 매슈스,티아 뉴홀,케빈 C. 웹 저 / 김모세,권성환 역 | 한빛미디어 | 2023년 12월 30일
https://m.yes24.com/Goods/Detail/124301248
- 목차
Chapter 0 시작하며
_0.1 컴퓨터 시스템이란 무엇인가?
_0.2 현대의 컴퓨터 시스템은 어떤 모습일까?
_0.3 이 책에서 배울 내용
_0.4 이 책을 시작하기에 앞서
__0.4.1 리눅스, C 및 GNU 컴파일러
__0.4.2 기타 표기법과 설명선
PART I C 프로그래밍 언어
Chapter 1 C 프로그래밍 기초
_1.1 C 프로그래밍 시작하기
__1.1.1 C 프로그램의 컴파일과 실행
__1.1.2 변수와 C의 숫자 타입
__1.1.3 C의 데이터 타입
_1.2 입력과 출력
__1.2.1 printf
__1.2.2 scanf
_1.3 조건문과 반복문
__1.3.1 C의 부울값
__1.3.2 C의 반복문
_1.4 함수
__1.4.1 스택
_1.5 배열과 문자열
__1.5.1 배열 소개
__1.5.2 배열 접근 방법
__1.5.3 배열과 함수
__1.5.4 문자열과 C 문자열 라이브러리 소개
_1.6 구조체
__1.6.1 구조체 타입의 정의
__1.6.2 구조체 타입의 변수 선언
__1.6.3 필드 값 접근
__1.6.4 함수에 구조체 전달
_1.7 정리
Chapter 2 C 프로그래밍 심화
_2.1 프로그램 메모리와 범위
_2.2 C의 포인터 변수
__2.2.1 포인터 변수
_2.3 포인터와 함수
_2.4 동적 메모리 할당
__2.4.1 힙 메모리
__2.4.2 malloc과 free
__2.4.3 동적 할당된 배열과 문자열
__2.4.4 힙 메모리와 함수를 위한 포인터
_2.5 C의 배열
__2.5.1 1차원 배열
__2.5.2 2차원 배열
_2.6 문자열과 문자열 라이브러리
__2.6.1 정적으로 할당된 문자열(문자 배열)
__2.6.2 동적으로 문자열 할당
__2.6.3 C 문자열과 문자를 조작하기 위한 라이브러리
_2.7 C 구조체
__2.7.1 C struct 타입 리뷰
__2.7.2 포인터와 구조체
__2.7.3 구조체의 포인터 필드
__2.7.4 구조체 배열
__2.7.5 자기 참조 구조체
_2.8 C의 입출력(표준 및 파일)
__2.8.1 표준 입출력
__2.8.2 파일 입출력
__2.8.3 C에서 텍스트 파일 사용
__2.8.4 stdio.h의 표준 및 파일 I/O 함수
_2.9 일부 고급 C 기능
__2.9.1 switch 구문
__2.9.2 커맨드 라인 인수
__2.9.3 void * 타입과 타입 리캐스팅
__2.9.4 포인터 산술
__2.9.5 C 라이브러리: 사용, 컴파일, 연결
__2.9.6 나만의 C 라이브러리 작성 및 사용
__2.9.7 C를 어셈블리로 컴파일
_2.10 정리
Chapter 3 C 디버깅 도구
_3.1 GDB로 디버깅
__3.1.1 GDB 시작하기
__3.1.2 GDB 예시
_3.2 GDB 명령어의 세부 사항
__3.2.1 GDB의 키보드 단축키
__3.2.2 자주 쓰는 GDB 명령어
_3.3 발그린드로 메모리 디버깅
__3.3.1 힙 메모리 접근 오류가 있는 예시 프로그램
__3.3.2 Memcheck를 사용하는 방법
_3.4 고급 GDB 기능
__3.4.1 GDB와 make
__3.4.2 실행 중인 프로세스에 GDB 연결
__3.4.3 포크에서 프로세스 따라가기
__3.4.4 시그널 제어
__3.4.5 DDD 설정 및 버그 수정
_3.5 어셈블리 코드 디버깅
__3.5.1 GDB를 사용한 바이너리 코드 검사
__3.5.2 DDD를 사용한 어셈블리 디버깅
__3.5.3 GDB 어셈블리 디버깅 명령어 및 예시
__3.5.4 어셈블리 디버깅에서 자주 사용하는 명령어 요약
_3.6 GDB로 멀티스레드 프로그램 디버깅
__3.6.1 GDB와 Pthreads
__3.6.2 GDB 스레드 관련 명령어
__3.6.3 예시
_3.7 정리
PART II 컴퓨터 시스템 기초
Chapter 4 바이너리와 데이터 표현
_4.1 숫자의 밑과 부호가 없는 정수
__4.1.1 10진수
__4.1.2 부호가 없는 2진수
__4.1.3 16진수
__4.1.4 저장 공간 제한
_4.2 진수 변환
__4.2.1 2진수와 16진수 변환
__4.2.2 10진수로 변환
__4.2.3 10진수를 변환
_4.3 부호가 있는 2진수 정수
__4.3.1 부호가 있는 수
__4.3.2 2의 보수
_4.4 2진 정수 산술 연산
__4.4.1 덧셈
__4.4.2 뺄셈
__4.4.3 곱셈과 나눗셈
_4.5 정수 오버플로
__4.5.1 총 주행 거리계 비유
__4.5.2 2진수 정수 오버플로
__4.5.3 오버플로 요약
__4.5.4 오버플로에 따른 결과
_4.6 비트와이즈 연산자
__4.6.1 비트와이즈 AND
__4.6.2 비트와이즈 OR
__4.6.3 비트와이즈 XOR
__4.6.4 비트와이즈 NOT
__4.6.5 비트 시프트
_4.7 정수 바이트 오더
_4.8 2진수에서의 실수
__4.8.1 고정 소수점 표현
__4.8.2 부동 소수점 표현
__4.8.3 올림의 영향
_4.9 정리
Chapter 5 컴퓨터 아키텍처
_5.1 현대 컴퓨팅 아키텍처의 기원
__5.1.1 튜링 머신
__5.1.2 초기의 전기 컴퓨터
__5.1.3 그래서 폰 노이만은 무엇을 알았나?
_5.2 폰 노이만 아키텍처
__5.2.1 CPU
__5.2.2 처리 장치
__5.2.3 제어 장치
__5.2.4 기억 장치
__5.2.5 입력 및 출력(I/O) 장치
__5.2.6 폰 노이만 머신
_5.3 논리 게이트
__5.3.1 기본 논리 게이트
__5.3.2 그 외 논리 게이트
_5.4 회로
__5.4.1 산술 및 논리 회로
__5.4.2 제어 회로
__5.4.3 저장 회로
_5.5 프로세서 만들기: 종합하기
__5.5.1 ALU
__5.5.2 레지스터 파일
__5.5.3 CPU
_5.6 프로세서의 프로그램 명령 실행
__5.6.1 클럭 주도 실행
__5.6.2 정리: 완전한 컴퓨터에서의 CPU
_5.7 파이프라이닝: CPU를 더 빠르게
_5.8 고급 파이프라인 명령 고려 사항
__5.8.1 데이터 해저드
__5.8.2 제어 해저드
_5.9 미래를 내다보기: 오늘날의 CPU
__5.9.1 명령 수준 병렬화
__5.9.2 멀티코어 및 하드웨어 멀티스레딩
__5.9.3 예시 프로세서
_5.10 정리
PART III 어셈블리 프로그래밍
Chapter 6 C 아래로: 어셈블리에 뛰어들기
_6.1 어셈블리 학습의 이점
__6.1.1 가치 있는 프로그램의 세부 사항을 감추는 고수준의 추상화
__6.1.2 리소스가 제한돼 컴파일러를 사용할 수 없는 컴퓨팅 시스템
__6.1.3 취약점 분석
__6.1.4 시스템 수준 소프트웨어에서 중요한 코드 순서
_6.2 후속 장들에서 학습할 내용
Chapter 7 64비트 X86 어셈블리(X86-64)
_7.1 어셈블리 살펴보기: 기본
__7.1.1 레지스터
__7.1.2 고급 레지스터 표기
__7.1.3 명령 구조
__7.1.4 피연산자가 포함된 예시
__7.1.5 명령 접미사
_7.2 흔히 사용하는 명령
__7.2.1 한층 구체적인 예시
_7.3 산술 명령
__7.3.1 비트 시프트 명령
__7.3.2 비트와이즈 명령
__7.3.3 부하 효과 주소 명령
_7.4 조건부 제어와 반복문
__7.4.1 사전 준비
__7.4.2 어셈블리에서의 if 구문
__7.4.3 어셈블리에서의 for 반복문
_7.5 어셈블리에서의 함수
__7.5.1 함수 매개변수
__7.5.2 예시 추적
__7.5.3 main 추적
_7.6 재귀
__7.6.1 애니메이션: 콜 스택 변화
_7.7 배열
_7.8 행렬
__7.8.1 연속적인 2차원 배열
__7.8.2 비연속적 행렬
_7.9 어셈블리에서의 구조체
__7.9.1 데이터 정렬과 구조체
_7.10 실제 사례: 버퍼 오버플로
__7.10.1 유명한 버퍼 오버플로 악용 사례
__7.10.2 살펴보기: 추측 게임
__7.10.3 자세히 살펴보기
__7.10.4 버퍼 오버플로: 첫 번째 시도
__7.10.5 현명한 버퍼 오버플로: 두 번째 시도
__7.10.6 버퍼 오버플로에서 보호하기
Chapter 8 32비트 X86 어셈블리(Ia32)
Chapter 9 ARM 어셈블리
Chapter 10 어셈블리 핵심 교훈
_10.1 공통 특징
_10.2 더 읽어보기
PART IV 성능 최적화 및 관리
Chapter 11 저장소와 메모리 계층
_11.1 메모리 계층
_11.2 저장소
__11.2.1 1차 저장소
__11.2.2 2차 저장소
_11.3 지역성
__11.3.1 코드에서의 지역성 예
__11.3.2 지역성부터 캐시까지
__11.3.3 시간적 지역성
__11.3.4 공간적 지역성
_11.4 CPU 캐시
__11.4.1 다이렉트 맵트 캐시
__11.4.2 캐시 실패 및 어소시에이티브 설계
__11.4.3 셋 어소시에이티브 캐시
_11.5 캐시 분석과 발그린드
__11.5.1 이론적 분석과 벤치마킹
__11.5.2 실세계에서의 캐시 분석: 캐시그린드
_11.6 예측하기: 멀티코어 프로세서에서의 캐싱
__11.6.1 캐시 일관성
__11.6.2 MSI 프로토콜
__11.6.3 캐시 일관성 프로토콜 구현
__11.6.4 멀티코어 캐싱과 관련된 더 많은 정보
_11.7 정리
Chapter 12 코드 최적화
_12.1 코드 최적화 첫 단계: 코드 프로파일링
__12.1.1 콜그린드를 사용한 프로파일링
__12.1.2 루프 불변 코드 이동
_12.2 그 외 컴파일러 최적화
__12.2.1 함수 인라이닝
__12.2.2 루프 언롤링
_12.3 메모리 고려 사항
__12.3.1 루프 상호 교환
__12.3.2 지역성을 개선하는 컴파일러 최적화: 분열과 융합
__12.3.3 massif를 사용한 메모리 프로파일링
_12.4 핵심 교훈
__12.4.1 좋은 데이터 구조와 알고리즘 선택하기
__12.4.2 가능한 표준 라이브러리 함수 사용하기
__12.4.3 느낌이 아닌 데이터에 기반한 최적화
__12.4.4 복잡한 코드는 여러 함수로 분할하기
__12.4.5 코드 가독성을 우선시하기
__12.4.6 메모리 사용에 주의하기
__12.4.7 컴파일러는 계속해서 개선되고 있다
Chapter 13 운영 체제
_13.1 OS의 동작과 실행
__13.1.1 OS 부팅
__13.1.2 인터럽트와 트랩
_13.2 프로세스
__13.2.1 멀티프로그래밍과 컨텍스트 스위칭
__13.2.2 프로세스 상태
__13.2.3 프로세스 생성 및 파기
__13.2.4 fork
__13.2.5 exec
__13.2.6 exit와 wait
_13.3 가상 메모리
__13.3.1 메모리 주소
__13.3.2 가상 주소를 물리 주소로 변환
__13.3.3 페이징
__13.3.4 메모리 효율성
_13.4 프로세스 간 통신
__13.4.1 시그널
__13.4.2 메시지 전달
__13.4.3 공유 메모리
_13.5 정리 및 기타 OS 기능
PART V 병렬 프로그래밍
Chapter 14 멀티코어 시대의 공유 메모리 활용
_14.1 멀티코어 시스템 프로그래밍
__14.1.1 멀티코어 시스템이 프로세스 실행에 미치는 영향
__14.1.2 스레드를 사용한 프로세스 실행 가속화
_14.2 첫 번째 멀티스레드 프로그램 작성
__14.2.1 스레드 생성과 조인
__14.2.2 스레드 함수
__14.2.3 코드 실행
__14.2.4 스칼라 곱셈 다시 살펴보기
__14.2.5 스칼라 곱셈 계산: 다중 인수
_14.3 스레드 동기화
__14.3.1 상호 배제
__14.3.2 세마포어
__14.3.3 기타 동기화 구조체
_14.4 병렬 프로그램의 성능 측정
__14.4.1 병렬 프로그램의 성능
__14.4.2 더 살펴볼 주제
_14.5 캐시 일관성과 거짓 공유
__14.5.1 멀티코어 시스템에서의 캐시
__14.5.2 거짓 공유
__14.5.3 거짓 공유 수정
_14.6 스레드 안전성
__14.6.1 스레드 안전성 문제 해결
_14.7 OpenMP를 사용한 암시적 스레딩
__14.7.1 프라그마
__12.7.2 헬로 스레딩: OpenMP 버전
__14.7.3 더 복잡한 예시: OpenMP에서의 CountSort
__14.7.4 OpenMP에 대해 자세히 알아보기
_14.8 정리
__14.8.1 주요 요점
__14.8.2 더 읽어보기
Chapter 15 기타 병렬 시스템 및 병렬 프로그래밍 모델
_15.1 이종 컴퓨팅: 하드웨어 가속기, 범용 GPU 컴퓨팅, CUDA
__15.1.1 하드웨어 가속기
__15.1.2 GPU 아키텍처 개요
__15.1.3 GPGPU 컴퓨팅
__15.1.4 CUDA
__15.1.5 기타 GPGPU 프로그래밍 언어
_15.2 분산 메모리 시스템, 메시지 전달 및 MPI
__15.2.1 병렬 및 분산 처리 모델
__15.2.2 통신 프로토콜
__15.2.3 메시지 전달 인터페이스
__15.2.4 MPI 헬로 월드
__15.2.5 MPI 스칼라 곱셈
__15.2.6 분산 시스템의 과제
_15.3 엑사스케일 그 이상: 클라우드 컴퓨팅, 빅 데이터, 그리고 컴퓨팅의 미래
__15.3.1 클라우드 컴퓨팅
__15.3.2 맵리듀스
__15.3.3 미래를 바라보며: 기회와 도전
해외원서
Suzanne J. Matthews 및 2개 추가
Dive Into Systems: A Gentle Introduction to Computer Systems
https://www.amazon.com/-/ko/gp/aw/d/B09B1MM2SS/ref=tmm_kin_swatch_0?ie=UTF8&qid=&sr=
반응형