저의 돈으로 직접 사서 직접 완독해 본 후 써보는 후기입니다. 따라서 장점은 장점대로 칭찬할 것이며, 단점은 단점대로 언급할 것입니다.
항상 컴퓨터의 좀 더 하드웨어에 가까운 부분에서 어떤 일들이 일어나는지 궁금했었다.
이 책은 그에 대한 답변으로 완벽에 가까운 해답과 더불어, 컴퓨터를 더욱 좋아하게 되는 아주 좋은 책이었다.
<읽은 기간>
2023/03/03 ~ 2023/06/19
<리뷰 순서>
1) 책의 표지
2) 단원별 구성
3) 읽은 소감
우선 저의 글의 앞부분만 보는 분들을 위해 먼저 간단히 4가지에 대해 답해보겠습니다.
Q 이 책을 읽기 전에 필요한 수준/ 지식은?
=> 원래 학교 교과과정 순으로는 이 과목의 선수 과목으로 "컴퓨터 회로"라는 과목이 있다.
해당 과목은 가산기, 반가산기, 등등 회로를 만드는 과정에 대한 과목인데 필지의 경우 "컴퓨터 회로" 과목을 듣지 않았지만 수업을 따라가는데 전혀 문제 되지 않았다. 책이 그만큼 설명을 잘해주고 번역 또한 좋아서 사실상 선수 지식은 필요하지 않다.
다만 프로그램의 경험은 필요하다, 중간중간 C, Java가 MIPS 언어로 변환되는 코드들을 보여주는데, 만약 프로그래밍 자체가 처음이라면 이러한 부분에서 막힐 수 있다.
Q 이 책의 번역 상태는? (5/5)
=> 번역 상태가 너무 좋다, 이거 거의 교수님들이 영혼을 짜내주신 수준 아닐까? 거의 5달 동안 읽으면서 이게 원서라고 느껴지는 부분이 없었다. 책이 6판인 만큼 그동안 누적되어 온 번역의 상태가 빛을 보고 있는 것 같다.
(진짜 시중에 번역 상태가 너무 좋지 못한 책들이 많은데.... 이 책은 교수님들이 진짜 열일해 주신 게 너무 느껴진다. 내가 살면서 읽어본 번역서중 가장 좋은 상태의 번역 수준을 보여주는 책 일 것 같다.)
<번역 기준>
5/5 : 책을 완독하는 동안 거의 어색함을 못 느낀 번역
4/5 : 한 쳅터를 읽을 때 마다 한, 두번? 어색함을 느낀 번역
3/5 : 한 장을 읽을 때 마다 한, 두번? 어색함을 느낀 번역
2/5 : 한 문장을 읽을 때 마다 한, 두번? 어색함을 느낀 번역
1/5 : 그냥 발 번역
Q 이 책을 읽어야 할 필요성, 어디에 도움이 될까?
=> 가산기, 반가산기부터 시작해서 각종 MIPS 명령어들과 더 나아가 우리가 기존에 알고 있는 C, Java 등이 어떻게 MIPS 언어로 변환되는지를 알 수 있다. 이를 기반으로 왜 코드의 순서에 따라 성능차이가 발생하는지도 고민해 볼 수 있었으며, high level에서 프로그래밍을 주로 하던 나에게 코드 한 줄이 어떻게 여러 명령어 단위로 나뉘는지를 알게 되었을 때 정말 재미있었다.
다음 책의 머리말 부분이 도움이 될 것 같아 남겨본다!
Q 이 책을 읽은 후 추후 공부는?
=> 음 사실 하드웨어 분야로 취업할 것 아니면, 이 정도면 매우 충분하게 low level을 공부해 본 것 같다.
이거보다 깊게 더 공부하기보다는, MIT의 마법사 책 같은 책을 보면서 Lisp으로 하드웨어를 직접 구현해 보는 과정이 필요할 수 있다.
필자 또한 마법사 책을 살면서 꼭 한번 읽어보고 싶기에.... 나중에 기회가 되면 꼭 읽어봐야겠다.
1. 책의 표지
책의 표지는 뭐 ㅋㅋㅋ 그냥 누가 봐도 전공책 비주얼인 것 같다. 오히려 가벼워 보이지 않는 이미지라 좋은 것 같다?
2. 단원별 구성
이 책은 크게 6단계로 나뉘며 필자는 6장을 제외한 5장까지는 꼼곰하게 읽었다!
1) 컴퓨터 추상화 및 관련 기술
해당 파트에서는 기본적인 컴퓨터의 성능에 관한 내용을 다룬다. 사이클이 높을수록 과연 컴퓨터가 빠른가? 많은 명령어를 처리하면 떠 빠른가? 빠르다는 것은 어떤 기준을 갖고 평가할까?
한 번에 500명을 태워서 왕복 2시간이 걸리는 비행기와 한번에 1명을 태우지만 왕복 6분이 걸리는 전투기 중 뭐가 더 좋다 할 수 있는가?
이러한 기준에는 평가할 척도가 필요하며 이와 관련된 내용과 더불어 컴퓨터에서 사용하는 CPI(Cycle per intruction)에 대하여 배우게 된다.
2) 명령어: 컴퓨터 언어
어떠면 가장 재미있는 부분이다. 흔히 말하는 어셈블리 랭귀지라 할 수 있는 여러 종류 중 이 책에서는 가장 간단하면서 효율이 좋은 MIPS 언어를 소개해준다. x86기반의 Intel 언어도 책 끝에서 설명을 조금 해주기는 한다.
MIPS 언어는 모든 명령어가 동일한 크기를 갖도록 구성됨으로써 설계 초기부터 파이프라인을 염두에 두고 만든 언어라고 한다.
따라서 매우 간단하지만 이 간단함으로부터 오는 효율이 좋은 것 같다. 이러한 특징을 다음과 같이 RISC라 부른다.
RISC (Reduced Instruction Set Computer)
RISC란 적은 수의 명령어를 수행하도록 설계된 마이크로프로세서이다. 복잡한 명령어를 제거하여 사용빈도가 높은 명령어 위주로 처리속도를 향상한 프로세서이다. 컴퓨터의 실행 속도를 높이기 위해 복잡한 처리는 소프트웨어에게 맡기는 방법을 채택하였다. ARM 계열의 프로세서가 RISC 프로세서이다. RISC는 다음과 같은 특징을 갖는다.
1. CPU의 명령어를 최소화하여 단순하게 제작된 프로세서
2. 효율적이고 특화된 CPU 구조
3. 하드웨어가 간단한 대신 소프트웨어가 복잡하고 크기가 커짐(컴파일러의 최적화가 요구됨)
4. 하위 호환을 위해 에뮬레이션 방식을 채택, 호환성 부족
5. 전력 소모가 적음
6. 속도가 빠르고 가격이 저렴
7. 용도에 최적화가 요구되는 환경에 사용
8. 명령어의 길이가 같기 때문에 병렬 처리가 용이함
MIPS와는 달리 Intel은 CISC 구조이다.
CISC (Complex Instruction Set Computer)
CISC란 연산에 처리되는 복잡한 명령어 집합을 수백 개 이상 탑재하고 있는 프로세서이다. 인텔 계열의 모든 프로세서는 CISC 프로세서이다. CISC는 다음과 같은 특징을 갖는다.
1. 복잡하고 기능이 많은 명령어로 구성된 프로세서
2. 복합 명령을 가짐으로써 하위 호환성을 확보
3. 트랜지스터 집적에 있어 효율성이 떨어짐
4. 전력 소모가 큼
5. 속도가 느리고 가격이 비쌈
6. 호환성이 절대적으로 필요한 PC 환경에 사용
7. 명령어 해석에 필요한 회로가 복잡해 병렬 처리가 쉽지 않음
3) 컴퓨터 연산
컴퓨터 연산 부분에서는 더하기, 빼기, 곱하기, 부동소수점 수 등에 관한 처리에 대하여 학습할 수 있었다.
부동 소수점 처리 시 Java는 Guard, Round , Sticky 비트를 사용하여 부동 소수의 반올림 과정을 처리하는 점 또한 재미있었다.
다음 글에 간략하게 정리해 두었다!
4) 프로세서
해당 파트에서는 Processor 내부에 관하여 매우 deep학 배운다.
single cycle CPU부터 시작해서 Multi cycle, 더 나아가 현대 컴퓨터 대부분이 사용하는 Pipe Line의 강력함에 대하여 깊게 배우게 된다.
파이프라인 사용 시 발생하는 여러 Hazard(Data, Structre, Control)는 아직도 머리가 지끈하게 만드는 내용들이다.
다만 한번 이해하고 나면 정말 재미있는 주제라고 생각한다.
5) 메모리 계층 구조
5장은 크게 Cache와 가상메모리에 관한 단원이다. Cache가 어떻게 이루어지는지, 블록과 워드를 어떻게 사용하지 등등... 을 다루며
가상메모리에서는 Page를 어떻게 처리하는지? TLB를 어떻게 사용하는지 등등 OS에서도 중요하게 다루는 내용에 대하여 배우게 된다.
6) 병렬 프로세서: 클라이언트에서 클라우드까지
6장은 아쉽게 읽지 못하였다. 시험 범위가 5장까지였다!
다음 단락에서 재미있었던 2장을 기준으로 좀 더 살펴보자
3. 명령어: 컴퓨터 언어
전체적인 2장의 목차는 위와 같다. 2.19장에서 Intel의 x86을 기반으로 설명해 주는 부분도 있다.
MIPS 어셈블리 언어를 기계어로 변환하는 과정을 살펴볼 수 있다.
가령 MIPS의 add 연산은 R-type의 명령어인데, 해당 명령어 형식에 따라 10진수를 나누는 부분이 다르다.
R-type 명령어 기준으로 6 5 5 5 5 6 (총 32비트) 씩 나누어 해석하면 된다.
또한 각각의 명령어 별로 하드웨어 적으로 어떻게 처리되는지 살펴볼 수 있다.
직전에 언급한 R-type명령어의 경우 위 사진에서 Register Addressing방식을 통해 처리할 수 있다.
이렇게 MIPS 어셈블리어를 배운 후 에는, 직접 C, Java코드를 통하여 MIPS언어로 변환하는 과정을 살펴보게 된다.
이 과정에서 항상 말로만 듣던 가상메모리의 Stack, Heap, Text 등 여러 영역에 대한 이해도가 올라가게 된다.
다음 사진과 같이 말이다!
대표적으로 함수 호출 전과 후의 메모리 상태는 다음 그림과 같다. 이러한 과정에 대하여 배울 수 있다.
또한 역사적으로 Stack이 위에서부터 자라나는 점 또한 항상 들어왔는데 이번 기회에 알게 되어 즐거웠다.
추가적으로 간략하게 4장도 살펴보자!
4장의 핵심은 CPU내부에서 기존에 배운 MIPS 명령어가 어떻게 처리되는지 이다.
이러한 명령어를 처리하는 처리량을 높이기 위해서 파이프라인 방식을 사용하게 된다.
성능을 향상한다 하면 뭔가 명령어 한건의 처리 속도가 증가할 것 같지만 이는 물리적으로 한계가 있다.
따라서 명령어 단건의 처리 속도가 아닌! 명령어의 ThroughPut(처리량)을 병렬처리하여 증가시키게 되는데 이 방식이 PipeLine이다.
4. 읽은 소감
뭐 이 책은 기회가 되는 모든 컴퓨터 관련 종사자 분들에게 읽어보라 권해주고 싶은 책이다.
다만 책의 내용이 충분하게 좋음에도 불구하고 독학하면 조금 어렵게 다가오는 부분이 있을 수 도 있다.
따라서 유튜브에서 고려대학교의 최린 교수님의 영상과 병행하면서 들으면 조금 더 도움이 될 수 있다.
http://www.kocw.net/home/cview.do?cid=26adea597863b523
나도 우리 학교 교수님의 설명으로 부족한 부분들은 모두 최린 교수님의 수업을 들으며 보충하였다...
다시 한번 말하지만 책의 내용이 부족하지는 않다! 책 만으로도 충분하게 이해할 수 있다.
그냥 누군가 설명해 주는 것이 좋으면 나처럼 추가적으로 강의를 들어보면 좋을 것 같다.
살면서 여유가 한 2달 정도 생기게 된다면, 꼭 한번 공부해 보길 권장한다!
'Life > Book Record' 카테고리의 다른 글
[서평] 백엔드 개발을 위한 핸즈온 장고 (0) | 2024.03.16 |
---|---|
[서평] 아토믹 코틀린 (4) | 2023.07.26 |
[서평] 도메인 주도 개발 시작하기 : DDD 핵심 개념 정리부터 구현까지 (2) | 2023.01.20 |
[서평] Redis 운영 관리 (4) | 2022.11.08 |
[서평] 자바 ORM 표준 JPA 프로그래밍 (0) | 2022.09.13 |
댓글