배경
🔩
서평 •  • 읽는데 9분 소요

컴퓨터 밑바닥의 비밀

책 『컴퓨터 밑바닥의 비밀』을 읽고 작성한 서평입니다.

#Book


5월에 다녀온 해외여행을 핑계로 최근에 블로그를 안 쓰다가, 길벗에서 IT 도서 지원을 해주셔서 이를 기회 삼아 다시 포스트를 쓰게 되었습니다. 서평을 쓰는 것도 거의 5개월 만이긴 하네요. 이번에 읽은 책 이름은 『컴퓨터 밑바닥의 비밀』 입니다.

1 레트로-한 감성의 표지 디자인

이 책을 고른 이유는 밑바닥 이라는 제목에서 느껴지는 호기심 때문이었습니다. 회사에서 실무를 하게 되니 프론트엔드 관련 공부만 하게 되고, CS에 대해서는 잘 공부하지 못했거든요.

물론 저도 대학교를 다닐 때 전공 공부를 열심히 했고 블로그에 글도 여러 개 적었지만, 그게 벌써 3년이 다 되어가는지라… 지금 다시 물어본다면 기억이 가물가물하거든요. 그래서 이 참에 컴퓨터 저수준에 대한 공부를 다시 해보겠다는 생각으로 이 책을 선택했습니다. 결론적으로 이 책을 선택한 것은 좋은 선택이었습니다.

저와 같은 이유로 이 책을 고민하시는 분도 계실 것 같은데요, 그래서 오늘은 이 책에 대한 간단한 소개를 하고 각 섹션 별에서 인상 깊게 읽은 부분을 소개해드리고자 합니다. 이번 포스트를 통해 컴퓨터 저수준에 대해 공부해보고 싶은 분들에게 도움이 되었으면 좋겠습니다.

책 소개

책

이 책은 중국의 개발자 루 샤오펑이 쓴 책으로, 컴퓨터의 기본적인 구조와 운영체제의 작동 원리를 설명하고 있습니다.

책의 제목에서 언급한 저수준이 어느 정도의 수준을 다루는 건지 궁금하실 텐데요, 이 책에서 다루는 개념은 크게 6가지 섹션으로 나뉘어져 있으며 각 섹션에서 다루는 개념만 뽑아보자면 다음과 같습니다.

  • 프로그래밍 언어, 컴파일러
  • 운영체제, 프로세스, 스레드, 코루틴
  • 메모리, 가상 메모리
  • CPU, 시스템 콜, 인터럽트
  • 캐시
  • 입출력

책의 분량은 480쪽으로 적당히 두꺼운 편이고, 다루는 개념 자체가 다소 어려울 수 있기 때문에 시간을 넉넉히 두고 읽는 것이 좋을 것 같습니다. 저는 3일 정도에 걸쳐서 읽었는데, 이해가 잘 안 되는 부분이 있어서 몇 번씩 되돌아가며 읽은 부분이 있었습니다. (특히 멀티 스레드…)

책의 예제 코드는 대부분 C 또는 C++ 언어로 작성되어 있습니다. 물론 엄청 쉬운 코드고 설명이 다 되어 있긴 한데, 뇌가 JavaScript에 절여진 저로서는 오랜만에 C 코드를 해석하려니 쪼~금 헷갈리긴 했습니다. C 언어에 대한 이해가 있는 분이라면 더 쉽게 읽을 수 있을 것 같습니다.

그럼 지금부터 각 섹션에서 인상 깊게 읽은 부분을 소개해드리겠습니다.

프로그래밍 언어부터 실행까지

1장에서는 프로그래밍 언어의 등장, 컴파일러의 필요성, 그리고 실행 파일을 생성하기까지의 과정을 설명합니다.

0과 1로 된 기계어를 인간이 읽을 수 있도록 어셈블리 언어로 변환하고, 여기서 반복되는 패턴을 추상화하여 더 쉽게 프로그래밍할 수 있도록 만든 것이 고급 언어라는 것을 알 수 있었습니다. 그리고 고급 언어로 작성된 코드도 사실은 그냥 텍스트 파일인데, 각 토큰의 의미를 해석하고 실행 파일을 생성하기 위해 컴파일러가 필요하다는 것도 알 수 있었죠.

11 학부 때 첫 프로그래밍 수업에서 이 내용을 배웠을 때는 무슨 말인지 하나도 몰랐었는데, 이거 보니까 이해 됐다

1장에서 제가 인상 깊게 읽은 부분은 링커(linker) 였습니다. 제가 마지막으로 C++로 프로그래밍을 한 게 8년 전이라 정말로 오랜만에 들어보는 개념이라 그런 듯합니다.

C 언어로 작성된 프로그램을 빌드할 때, 모듈 간 종속성 문제를 해결하고, 실행 파일을 생성하고, 재배치(relocation)를 위해 가상 메모리를 쓴다는 것까지요. 이러한 과정을 저자 여러 명이 특정 부분을 맡아 책을 집필하는 것에 비유한 부분이 재미있었습니다.

운영체제와 프로세스, 스레드, 코루틴

2장에서는 운영체제에 대한 내용을 다룹니다. CPU의 한계와 멀티태스킹의 도입, 프로세스의 탄생과 그 구조, 프로세스의 한계와 스레드의 탄생, 스레드의 한계, 운영체제에 의존하지 않는 코루틴의 구현 등에 대해 설명합니다.

운영체제를 한 번이라도 공부해본 분이라면 이 전반적인 흐름에 대해 어느 정도 감을 잡고 계실 텐데요, 그 흐름을 알고 따라가며 읽은 덕분에 이해가 어렵지 않았습니다. 이 외에는 동기와 비동기, 블로킹과 논블로킹에 대한 설명을 함께 합니다.

ㅇ 마냥 낯선 개념인 줄만 알았는데 알고 보니 이미 익숙하게 쓰고 있던 개념이었다?

코루틴(Coroutine) 은 들어보긴 했지만 정확히 무엇을 뜻하는지는 몰랐는데, 이 책을 통해 알게 되었습니다.

코루틴은 필요에 따라 실행을 중지 또는 재개할 수 있는 기능이 제공되는 함수라고도 할 수 있는데, 이러한 코루틴의 의의는 프로그래머가 동기 방식으로 비동기 프로그래밍을 가능하게 한다는 점에서 중요하다고 합니다. 이는 사용자 상태에서 CPU 시간을 2차 할당한다는 점에서 스레드와 비슷하다고 할 수 있지만, 스레드와 달리 운영체제에 의존하지 않으면서 동작한다는 점에서 차이가 있죠.

저는 이를 보자마자 JavaScript의 제너레이터가 떠오르긴 했는데, 알고 보니 콜백과 Promise 역시 코루틴의 일종이라고 하더라구요. 그리고 async/await 문법은 제너레이터를 이용한 코루틴의 신택스 슈거라는 걸 새롭게 알게 됐습니다. async/await 가 번들러를 통해 빌드되면 제너레이터가 된다는 것을 예전에 들어보긴 했는데 이게 코루틴이라는 건 몰랐네요.

메모리와 가상 메모리

3장에서는 메모리를 다룹니다. 포인터, 프로세스가 메모리에 적재된 구조(스택, 힙, 데이터, 코드 영역), 가상 메모리의 필요성, 메모리 할당 시 일어나는 일 등에 대해 설명합니다.

ㅇㅇ 메모리 할당, 단편화, 병합 정책 등… 너무 오랜만에 들어본 개념이라 반가웠다

여기서 다루는 대부분 개념이 운영체제 수업에서 들었던 기억이 나서 재미있게 읽었습니다. 그중에서는 메모리 단편화 개념을 다루는 게 인상 깊었습니다. 특히 내부, 외부 단편화 같은 개념들을 기술 면접 준비할 때 달달 외웠던 기억이 나서 더욱 재미있게 읽었습니다.

ㅇㅇ SSD를 메모리로 왜 못 쓸까

마지막에는 앞서 다룬 내용들을 기반으로 왜 SSD를 메모리로 쓸 수 없을까? 라는 질문을 던지는데요, 그 이유에 대해 고민해 보신 적 있으신가요? 물론 속도가 느리다는 이유도 있지만, 결론을 말씀드리자면…

  • SSD는 디스크 조각 단위로 주소를 관리하는 반면 메모리는 바이트 단위로 주소를 읽을 수 있어야 함
  • 32비트 컴퓨터에서는 주소 지정 범위가 2322^{32} = 4GB뿐이라 1TB 이상의 SSD를 써도 4GB 밖에 활용할 수 없음
  • SSD는 읽고 씀에 따라 수명이 줄어드는 반면 메모리는 그렇지 않음

라고 하네요!

트랜지스터에서 CPU로

4장은 CPU를 다룹니다. 트랜지스터가 논리 회로, 레지스터, 메모리, CPU가 되는 과정까지, 그리고 복잡 명령어 집합 컴퓨터(CISC, Complex Instruction Set Computer)와 축소 명령어 집합 컴퓨터(RISC, Reduced Instruction Set Computer), 시스템 콜, 스레드 전환, 인터럽트 등에 대해 설명합니다.

ㅇㅇ 역시 역사 이야기가 제일 재밌다

개인적으로 가장 재미있게 읽은 부분은 CISC와 RISC의 역사적 흐름에 대한 설명이었습니다. CISC 제조사로는 인텔과 AMD, RISC 제조사로는 ARM이 대표적이라고 하는데, 이 둘의 역사적 흐름을 알고 읽으면 더 재밌습니다.

저장 공간이 부족하던 시절에는 명령어를 최대한 간결하게 만들어야 했기 때문에 CISC가 등장했지만, 각 명령어 별 처리 시간이 고르지 못해 병렬 처리가 어렵다는 단점으로 인해 RISC가 등장했다고 합니다. 성능 면에서 RISC는 CISC를 압도했지만, CISC도 마이크로 명령어를 이용해 내부적으로 명령어를 더 세분화하여 단점을 줄이고, 하드웨어를 이용한 병렬 처리 기술인 하이퍼스레딩을 도입하고, 마이크로소프트의 Windows라는 거대한 소프트웨어를 등에 업은 덕에 PC 시장에서 독점적인 점유율을 유지할 수 있었습니다. 애플 역시 처음에는 RISC를 사용했지만 결국 CISC를 도입했으니 말이죠.

하지만 스마트폰이 등장하면서 모든 것이 달라졌습니다. 기존의 CISC는 너무나 오랫동안 독점적 위치를 유지했기 때문에 이를 대응하는 데 너무 오랜 시간이 걸렸고 RISC는 이 기회를 활용해 새로운 시장을 차지했습니다. 애플은 자체적으로 RISC 기반의 A 시리즈 칩, 그리고 M1 칩을 개발하며 성공을 거두었죠.

이런 컴퓨터와 관련된 역사 이야기는 꽤 흥미로워서 나중에 별도 포스트로 정리해서 올려볼까 생각 중입니다.

어디에나 존재하는 캐시

5장은 캐시를 다룹니다. 캐시의 필요성, 캐시 간 동기화 문제, 캐시 친화적인 프로그래밍, 멀티 스레드 프로그래밍에서 발생할 수 있는 문제 등에 대해 설명합니다.

ㅇㅇ 코드가… 내가 쓴 순서대로… 실행이 안 된다고?

이 장에서는 멀티 스레드 환경에서 발생할 수 있는 문제 부분을 가장 흥미롭…게(?) 읽었습니다. 아니 솔직히 말하자면 아무리 봐도 이해가 안 돼서 수십 번을 되돌아가며 읽은 것 같네요.

그러니까, CPU 최적화를 위한 도입된 비순차적 명령어 실행(OoOE, Out of Order Execution)과 캐시가 멀티 스레드 환경에서는 이상하게 동작하는 것처럼 보이게 된다는 것이죠. 어떤 코드가 실행되기도 전에 먼저 읽어버리거나 먼저 써버리는 일이 일어날 수 있다는 건데… 이를 방지하기 위해 메모리에 접근하는 권한의 획득과 해제가 필요하고, 이것의 소프트웨어적 구현이 곧 뮤텍스의 등장으로 이어졌다는 내용으로 이어집니다.

결국 CPU는 성능 최적화를 위해 프로그래머가 작성한 대로 코드를 실행하지 않을 수도 있고 프로그래머는 이를 고려해서 멀티 스레드 프로그래밍을 해야 한다는 것이 결론인데, 이런 환경에 익숙하지 않았던 저는 상당히 오랜 시간 이해하려고 고민을 했네요. 그나마 ChatGPT한테 질문을 해가면서 겨우 이해한 셈 치고 넘어갈 수 있었습니다.

컴퓨터의 상호작용, 입출력

6장은 입출력을 다룹니다. 우리가 컴퓨터를 사용할 때 쓰는 입출력 장치와 컴퓨터가 상호작용하는 방법, 프로그램이 파일을 읽고 쓰는 방법 등을 설명합니다.

ㅇㅇ CPU가 L1 캐시를 읽기까지 걸리는 시간이 1초라면 메모리는 5일, SSD는 20일, 디스크는 1년

폴링과 인터럽트, 인터럽트 시의 상태 저장과 복구 같은 과정도 설명되어 있었는데요, 아무래도 가장 재미있게 읽은 부분은 입출력 지연은 CPU의 처리 속도에 비해 얼마나 느린가를 시각화한 부분입니다. 시간과 거리 지표로 비교하니까 아무래도 더 흥미롭게 읽을 수 있었던 것 같습니다.

ㅇㅇ 마지막 요약

그리고 마지막 요약이 나오는데, 지금까지 알아본 개념들을 쭉 읊어주면서 마무리를 짓습니다.

후기

ㅇㅇ 개인적으로 머릿속에 집어넣고 싶은 정보들 가득

결론부터 이야기하자면, 제가 학부 때 공부한 전공에서 다루는 내용을 상당히 많이 커버하고 있었다는 점에서 놀랐습니다. 운영체제 80%에 컴파일러 10%, 컴퓨터 구조 10% 를 끼얹은 느낌?

전반적으로 다루는 개념은 대학교에서 공부한 내용과 크게 다르지는 않지만 하드웨어와 관련된 설명도 좀 더 들어 있었고, 예제 코드도 많이 있어서 개념 훑기에는 도움이 많이 됐습니다. 사실 책 제목만 봤을 땐 마이크로 아키텍처까지 다루려나 싶어서 궁금하긴 했는데, 이건 거의 전자공학에 가까울 정도로 딥(?)한 내용이라 그런지 그런 내용은 거의 다루지 않았습니다.

그리고 이 책을 소개하는 문구로 비유와 그림으로 쉽고 재미있게 배운다 가 있었는데, 이게 이 책의 가장 큰 장점이라고 생각합니다. 실제로 책에 비유와 그림이 정말 많이 있어서, 제가 봐도 “와, 독자 이해 시키려고 진짜 고민 많이 하셨겠구나” 라는 생각이 들 정도였습니다.

사실 운영체제의 각 요소만 설명하려고 해도 꽤 복잡한 개념들인데, 한 권의 책을 통해 이 넓은 내용을 다 다루고 있다는 것만으로도 사실 대단하지 않나 생각합니다. 그래서인지 운영체제와 C 언어에 대한 지식이 전혀 없는 분들이 읽기에는 이 책이 약간 어려울 수도 있을 것 같은데요. 그래서 저는 운영체제에 대한 개념 공부를 한 사이클 돌린 분들 이 본다면 좀 더 시너지가 나는 책이라고 생각합니다. 아무래도 비유된 지식을 정확히 체득하는 것도 그 개념을 어느 정도 알고 있을 때 더욱 효과가 나더라구요.

마지막으로, 책 제목에서 언급한 밑바닥 만큼은 확실히 다루고 있다는 점에서 만족스러운 책이었습니다.

이 포스트가 유익하셨다면?




프로필 사진

👨‍💻 정종윤

글 쓰는 것을 좋아하는 프론트엔드 개발자입니다. 온라인에서는 재그지그라는 닉네임으로 활동하고 있습니다.


Copyright © 2024, All right reserved.

Built with Gatsby