Search

[도서 리뷰] 컴퓨터 밑바닥의 비밀

Subtitle
컴퓨터 시스템의 본질을 알면 코드의 실마리가 보인다
Index
Review
Date
2024/12/05
2 more properties
개발자라면 학생 때부터 항상 듣는 이야기가 있죠. “개발자는 CS가 중요하다” 하지만 막상 학생 때 운영체제, 자료구조 등의 지루한 수업 등을 들을 때는 이게 왜 중요한가라는 생각을 하곤 했습니다. 과연 이런 이론들이 실무에서 쓰이는 것이 맞는 지 의심을 많이 했었는데요. 실제 개발자로 살고 있는 요즘 이런 기본기의 중요성을 매우 체감하고 있는 것 같습니다.
요즘 다시 CS를 공부해보고 싶다는 생각이 들었지만 어디서부터 어떻게 시작해야 할 지 감이 오지 않아 계속 백로그로만 쌓여 있었는데요. 때마침 글또에서 길벗출판사로부터 책 후원을 받을 수 있는 좋은 기회가 생겨 이를 활용할 수 있었습니다!
여러 책들 중에 저는 “컴퓨터 밑바닥의 비밀”이라는 책을 선택하였는데요. 이유는 위에서 설명드린 것처럼 다시 한 번 저의 CS 지식을 점검하고 복습하는 목적이었습니다.
책은 컴퓨터의 동작원리를 다루고 있는데요. 운영체제, 자료구조, 알고리즘 등 컴퓨터의 근간이 되는 CS를 대부분 다루고 있고, 자칫하면 굉장히 지루하고 어려울 수 있는 내용임에도 아주 높은 퀄리티와 쉬운 설명을 기반으로 구성되어 있습니다. 걱정과 다르게 저도 굉장히 재밌게 읽었고, 책 내용이 꽤 많음에도 불구하고 3일만에 완독을 하였네요
책은 각 목차별로 크게는 아래의 내용들을 다루고 있습니다.
1.
프로그램의 실행과정
2.
운영체제, 프로세스, 스레드
3.
메모리
4.
CPU
5.
캐시
6.
I/O
이번 리뷰에서는 1, 2장 일부를 소개해드리려고 하는데요. 정말 책의 모든 부분이 거를 내용없이 알차게 구성되어 있어서 꼭 책을 구입하시면 정독해보시는 것을 추천드립니다!

1장. 프로그래밍 언어부터 프로그램 실행까지, 이렇게 진행된다

1장은 컴퓨터가 어떤 방식으로 동작하는지 프로그램의 실행과정을 다루고 있습니다. 기본적으로 CPU는 데이터를 옮기는 매우 간단하고 멍청한 작업만 수행할 수 있습니다. 하지만 CPU의 가장 큰 특징은 이러한 행동을 매우매우 빠르게 수행할 수 있다는 것이죠. 우리는 이러한 특징을 이용하여 코드를 실행하는데요.
여기서 코드는 우리가 수행하고자 하는 명령을 추상적인 언어로 표현한 것입니다. 인간은 평소 굉장히 추상적으로 소통하는데, CPU는 이러한 추상적인 언어를 모릅니다. 예를 들어 “물 한잔을 주세요”라는 명령이 있다면 단순히 저렇게 명령해서는 CPU가 명령을 수행하지 못합니다. 오른쪽 다리를 내딛는다 → 멈춘다 → 왼쪽 다리를 내딛는다 → … → 물컵을 잡는다 → … 와 같이 굉장히 구체적으로 명령을 해주어야 제대로 동작을 수행할 수 있습니다. 어셈블리어 같은 언어가 이러한 저수준의 통제를 위해 만들어진 언어라고 할 수 있습니다.
매번 이렇게 코딩을 해야한다면 생산성이 매우매우 좋지 않기 때문에 인간은 보다 편리한 코딩을 위해서 C, 파이쎤과 같은 고수준의 언어를 만들어냅니다. 하지만 결국 프로그램 실행을 위해선 컴퓨터가 이해하는 0과 1로 변환이 필요한데, 이 역할을 하는 것이 바로 컴파일러입니다.
이 밖에도 1장에서는 컴파일러가 여러 소스 코드로 이루어진 프로그램을 컴파일하였을 때 소스 코드들을 모아 하나의 실행 파일로 만들어주는 링커라는 개념까지 아주 알차게 다루고 있습니다.
해당 챕터를 읽으면 컴퓨터가 얼마나 추상화가 잘 되어있는지 그 아름다움을 느낄 수 있습니다. 우리는 이 추상화를 통해 C, 파이썬과 같은 고수준의 언어로 CPU를 손쉽게 제어할 수 있고, file이라는 추상화를 통해 I/O를 다룰 수 있고, 가상 메모리를 통해 실제 물리 메모리나 파일을 일일이 제어할 필요가 없어집니다.
1장에서는 이러한 추상화를 한층 더 깊은 저수준 레벨로 자세하게 살펴볼 수 있도록 해주는데요. 개인적으로 글자에 불과한 코드가 어떻게 실제 수행되는 프로그램으로 나타나는 것인지 자세하게 알 수 있어서 굉장히 재미있게 읽었습니다.

2장. 프로그램이 실행되었지만, 뭐가 뭔지 하나도 모르겠다

개인적으로는 가장 재밌고 유익하게 읽었던 챕터입니다. 제목에서 짐작할 수 있듯 프로그램이 실행되는 과정을 더 자세하게 알아볼 수 있는 부분인데요. 특히 프로세스와 스레드의 동작방식에 대해 깊게 살펴볼 수 있는데, 저는 그중 콜백 함수, 코루틴 파트를 가장 재밌게 읽었습니다.
콜백 함수는 다른 코드에 매개변수로 넘긴 실행가능한 함수를 의미합니다. 콜백 함수의 역할은 변수와 유사한데요. 변수를 통해 값의 변경이 필요할 때 값이 사용되는 모든 위치를 수정할 필요없이 변수에 할당된 값만 수정하면 되듯이 콜백 함수도 실행하고자 하는 함수를 변수로 취급하여 코드를 더 효율적으로 설계할 수 있게 됩니다.
코루틴은 이러한 콜백 함수를 비동기적으로 작성할 때 아주 유용한데, 일반 함수가 return문을 만나면 종료되어버리는 것과 다르게 코루틴은 함수의 실행을 직접 제어할 수 있습니다.
# 일반 함수 def func(): print("a") return <- 여기서 종료 print("b") # 코루틴 def func(): print("a") yield print("b") yield print("c")
Python
복사
만약 코루틴 없이 비동기 콜백을 작성한다면 아래와 같이 콜백 지옥을 경험할 수 있는데요.
하지만 코루틴을 이용하면 코드 구현은 동기로 작성하지만 비동기 실행과 같은 효과를 얻을 수 있습니다. 코루틴이 일시 중지되면 작업자 스레드는 준비 완료된 다른 코루틴을 실행하기 위해 전환되고, 일시 중지된 코루틴에 할당된 사용자 서비스가 응답한 후 그 처리 결과를 반환하면 다시 준비 상태가 되어 스케줄링 차례가 되돌아오길 기다립니다.
2장을 통해서는 프로그램이 어떻게 실행되는지 자세한 프로세스와 함께 평소 어렴풋하게 알고 있던 동기&비동기, 블로킹&논블로킹, 코루틴 개념을 확실하게 알 수 있게된 것 같아서 특히나 유익하게 읽었던 파트였던 것 같습니다.

마무리

최근 개발자이지만 CS가 부족하여 공부가 필요할 것 같다는 느낌을 많이 받고 있었는데요. 책 제목처럼 컴퓨터 동작원리를 밑바닥부터 체험한 느낌이라 다 읽고나서 굉장히 뿌듯했던 것 같습니다. 특히 이 책이 굉장히 좋았던 점은 여타 전공 서적처럼 이해 불가능한 글과 코드만 나열되어 있는 것이 아니라 정말 최대한 쉽게 설명하려고 한다는 느낌을 많이 받았습니다.
그림, 도표, 비유를 많이 사용하여 최대한 쉽게 설명하려다 도리어 잘못되거나 더 어려운 설명이 될 수도 있는데 이 책의 저자는 쉽지만 정확하게 내용을 전달하고 있다고 생각이 들었습니다. 그만큼 정말 많은 고뇌를 하면서 책을 집필했다는 것이 느껴졌고, 올해 읽은 개발 관련 서적 중 가장 으뜸이라고 할만한 퀄리티가 상당한 책이었던 것 같습니다.
개발자로서 컴퓨터의 작동원리와 CS 지식을 채우고 싶으신 분들에게 강추합니다!