실습과 그림으로 배우는 리눅스 구조를 읽고

리뷰라는 건 내용보다 누가 하냐가 중요한 것 같다. 그래서 먼저 나를 소개하고자 한다.

1. 리뷰어 소개

본인은 PC통신을 하며 처음으로 C언어를 배웠다. PC가 돌아가는 원리가 궁금하여 당시 배우는 사람이 없었던 어셈블리어도 간단히 익혔다. 리눅스는 (아마도) 알짜리눅스 6.0 버전을 처음으로 설치했던 것 같다. 리눅스를 통해 처음 사회에 발을 내딛은 것은 2005년 Intel 개발자회의에서였다. 대학생 때는 작은 프로젝트를 수 차례 했다. 짧은 시간이었지만 국제기구에서 개발자로 일했다. 현재는 작은 공기업의 IT부서에서 전체 시스템을 (다른 분들과 함께) 맡아서 운영하고 있다. 재직중인 곳에서는 포탈, 통합검색, 내・외부메일 업그레이드 및 교체 등 여러 가지 프로젝트를 수행했다.

2. 책 소개

이번에 읽은 책은 <실습과 그림으로 배우는 리눅스 구조> – 개발자가 알아야 하는 OS와 하드웨어의 기초이다. 일본의 후지츠(주)에서 일하는 다케우치 사토루씨가 쓴 책을 신준희님이 번역했다. 번역 수준은 훌륭한 편이다.

책 표지
실습과 그림으로 배우는 리눅스 구조

이 책은 OS와 하드웨어 원리를 소개한 다른 책들과 다르게 훌륭한 그림, 쉬운 설명, 그리고 설명을 직접 확인할 수 있는 프로그램 까지 함께 제공하기 때문에 그 어떤 책보다 쉽게 컴퓨터의 동작 원리를 이해할 수 있다.

3. 대상독자

당신이 개발자 혹은 서버 운영자라고 가정하자. 만약 아래 용어 중 하나라도 자신의 언어로 풀어서 설명할 수 없다면 이 책을 읽을 것을 추천한다.

시스템 콜(system call), 커널 모드(kernel mode), 사용자 모드(user mode), 프로세스 생성, 프로세스 스케줄러, sar 명령어, ldd, 물리 메모리, 가상 메모리, 페이지 테이블, 요구 페이지, 페이지 인, 페이지 아웃, 스와핑, COW(Copy On Write), HDD와 SSD의 특성

4. 특징

최근에 읽었던 운영체제와 컴퓨터 원리를 설명한 서적 중 가장 잘쓰여진 책이라고 생각한다. 여기서는 좋았던 점과 아쉬웠던 점을 소개한다.

4.1. 좋았던 점

이 책의 가장 큰 장점은 훌륭한 그림이다. 책 서문에 나오는 컴퓨터 시스템의 계층을 예쁜 모델과 현실로 구분해서 그렸는데 참 인상적이었다.

프로세스와 OS의 관계 또한 그림과 함께 설명을 하다보니 매우 직관적이고 이해하기 쉽다. 아래 그림에서 보듯이 프로세스 고유의 코드(개발자가 작성한 코드)는 사용하는 언어가 제공하는 함수를 사용(OS외의 라이브러리)한다. 그리고 이 언어가 제공하는 기본 라이브러리는 결국 OS 라이브러리. 즉, 시스템 콜을 호출한다. 시스템 콜을 호출하면 프로그램 실행 모드가 사용자 모드에서 커널 모드로 변경되어야 한다. 이러한 설명이 그림과 함께 설명된다. 이 보다 더 쉬울 수 있을까?

가끔씩 OS나 하드웨어가 작동하는 원리를 이전처럼 잘 알 필요가 없다는 사람들도 있다. 실제로 어설픈 사람의 최적화보다 컴파일러의 자동 최적화가 더 나은 경우도 있다. 하지만 만약 자동화에 의해 처리되는 어떤 작업에 의심스러운 부분이 발생하면 어떻게 할 것인가? 그 때는 사람이 직접 분석해야 한다. 이러한 분석을 할 때 필수적으로 요구되는 것이 바로 ‘원리’ 이다. 아래 그림은 OS의 문맥 전환(context switching)에 대해 소개한다.

모바일 컴퓨팅 환경에서는 전원관리가 중요하다. 물론 iOS나 Android가 알아서 잘 하겠지만, 이러한 것이 어떻게 구현되어 작동하는지 알면 더 좋지 않을까?

개발자가 가상 메모리와 물리 메모리가 각각 언제 확보되는지를 이해하고 있다면 프로그램을 작성할 때 이러한 부분을 고려하여 개발할 수 있지 않을까? 물론 어떤 분야에서 일을 하느냐에 따라 고려할 필요가 거의 없는 경우도 있겠지만, 이러한 내용을 이해하는 사람과 그렇지 못한 사람은 시간이 지날수록 내공에 차이가 생기지 않을까?

OS는 I/O 스케줄러를 통해 HDD 또는 SSD가 최적의 성능을 낼 수 있도록 일하고 있다. 알고 있었는가?

C언어의 malloc() 함수는 메모리를 확보한다. 이 함수는 내부적으로 리눅스의 mmap() 함수를 호출한다.

최근에는 대학에서 입문용 프로그래밍 언어로, 산업에서는 인고지능 등에서 많이 사용하는 언어인 파이썬은 어떨까? 파이썬도 결국 C언어처럼 메모리 할당을 위해서 mmap() 함수를 호출한다.

또한, 이 책은 이론을 실제로 확인할 수 있는 프로그램을 제공한다. 아래 그림은 mmap() 함수를 호출하기 전과 후의 프로세스 메모리 맵 상태이다. 붉은 박스를 보면 알 수 있는데, mmap() 함수 호출 후 요청한 크기만큼의 메모리 공간이 확보되었다.

또한 아래 예제는 요구 페이지(demand paging)을 확인하는 프로그램이다. 두 번째 그림에서 보면 실제 물리 메모리가 확보되기 전 page fault가 먼저 발생하는 것을 알 수 있다. 지금 여기서 본인이 얘기하는 내용이 머리에 정확히 그려지지 않는다면 이 책을 사서 읽으면 된다. 정말 쉽게 설명을 하고 있다.

마지막으로 좋았던 점은 이 책의 번역자님이 중간에 작성하신 친절한 주석이다. 책을 읽는 중 궁금한 내용들이 자세히 적혀 있어서 좋았다.

4.2. 아쉬웠던 점

이 책의 내용 자체에 대해서는 아쉬운 점이 별로 없다. 그래도 한 가지 꼽자면 책의 내용을 실습하기 위한 소스코드를 제공하지 않는다는 것이다. 아래는 본인이 작성한 파일이다. 실습은 CentOS 7 (64비트) 에서 했으니 동일한 환경이면 문제 없이 실습이 가능할 것이다.

5. 총평

자신이 작성한 프로그램이 실제로 어떻게 동작하는지 궁금한 사람은 이 책을 읽어야 한다. 사용자 관점에서 조금은 더 컴퓨터 관점으로 프로그램의 실행 원리를 바라보게 되면 조금은 더 컴퓨터와 더 친해질 수 있다.

이 책을 통해 당장 눈에 보이는 화려한 스킬을 쌓을 수는 없다. 그러나 지금 당장은 아니지만 나중에 빛을 볼 수 있는 내공을 쌓을 수 있다. 소프트웨어 개발자로서 필요한 기본 역량을 쌓고 싶은 이들에게 일독을 권한다.