You are currently viewing 그림으로 배우는 리눅스 구조 리뷰

그림으로 배우는 리눅스 구조 리뷰

“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.”

그림으로 배우는 리눅스 구조, 한빛 출판 네트워크

1. Intro

클라우드 엔지니어의 필수품, 리눅스


‘클라우드 관련 업무를 하기위해 무엇을 공부해야할까요?’한다면 네트워크, 리눅스, 스크립트 등이 항상 빠지지 않고 등장한다. 모두 다 우선순위를 논할 수 없을 만큼 중요하다.

그들 중 리눅스는 왜 중요할까? 대다수의 서버는 리눅스 환경에서 작동되기 때문일 것이다. 일부 상황에서는 윈도우 서버또한 사용되지만, 일반적인 AWS/GCP등의 클라우드 환경에서는 리눅스 기반의 서버가 주로 사용되기 떄문일 것이다.

그렇다면 왜 리눅스가 주로 사용되는 것인가? 제일 큰 이유는 오픈소스로 제공되는 OS이기 때문일 것이다. 비용상으로 저렴하기 때문에 많이 채택되고, 사용 레퍼런스가 많으며 유저커뮤니티가 크게 형성되어있다. 또한 오픈소스 기반인 만큼 다양한 배포판이 존재하며, 사용자의 요구사항에 맞는 여러 커스텀이 가능함이 많은 사용의 이유라고 생각한다.

사용은 간단하지만, 동작원리를 이해하는것은 어렵다.

이 책의 추천사 중, 다음 추천사가 매우 마음에 와 닿았었다.

리눅스 커널 책의 두께와 기술적 깊이에 질려 중간에 포기한 경험이 있는 엔지니어라면, 이 책의 이해를 더하는 수많은 그림과 실습 코드로 충분히 다시 도전해 볼 만하다고 생각합니다.

최규민, 국가정보자원관리원(NIRS)


앞서 말한 바와 같이 리눅스는 많이 채택되었으며, 간단하게 명령어 입력 등을 통해 사용하는것은 누구나 익힐 수 있다. 그러나 단순히 명령어와 그 옵션들을 정리하는 것이 아닌, 명령어를 입력했을때 서버에서는/OS단에서는 어떤일이 일어나는가?는 대답하기 어려웠다.

그렇지만 본격적으로 하드웨어/커널/OS단을 공부하려고 한다면, 설명이 너무 어렵고 막연해서 이해하기 어려웠다. 이 책은 그러한 부분을, 그림을 통한 자세한 설명을 통해 알려주는 책이다.

13장 중 일부, 매우 나와 유사해서 인상적이였다.

2. 책 구성

본 책은 프로세스, 메모리, 디바이스, 파일 시스템, 가상화, 컨테이너, cgroup 등 리눅스커널이 어떻게 구성되어있는지, 어떤식으로 작동하는지를 설명한다.
사실 이 책은 신간은 아니고, 2019년에 발간되었던 실습과 그림으로 배우는 리눅스 구조의 개정판이다. 구판에서는 위의 언급한 주제중 파일시스템 까지 설명되어있으며, 이번 신판에는 가상화와 컨테이너환경에서의 리눅스의 작동등이 추가로 설명되었다.

책 목차

CHAPTER 0 시작하면서

CHAPTER 1 리눅스 개요
1.1 프로그램 및 프로세스
1.2 커널
1.3 시스템 콜
_시스템 콜 호출 확인해 보기
_시스템 콜을 처리하는 시간 비율
Column 모니터링, 경고 알림 및 대시 보드
_시스템 콜 소요 시간
1.4 라이브러리
_표준 C 라이브러리
_시스템 콜 래퍼 함수
_정적 라이브러리와 공유 라이브러리
Column 정적 링크가 돌아왔다


CHAPTER 2 프로세스 관리(기초편)
2.1 프로세스 생성
_같은 프로세스를 두 개로 분열시키는 fork() 함수
_다른 프로그램을 기동하는 execve() 함수
_ASLR로 보안 강화
2.2 프로세스의 부모 자식 관계
Column fork() 함수와 execve() 함수 이외의 프로세스 생성 방법
2.3 프로세스 상태
2.4 프로세스 종료
2.5 좀비 프로세스와 고아 프로세스
2.6 시그널
Column 반드시 죽이는 SIGKILL 시그널과 절대로 죽지 않는 프로세스
2.7 셸 작업 관리 구현
_세션
_프로세스 그룹
2.8 데몬


CHAPTER 3 프로세스 스케줄러
3.1 기본 지식: 경과 시간과 사용 시간
3.2 논리 CPU 하나만 사용하는 경우
3.3 논리 CPU 여러 개를 사용하는 경우
3.4 real보다 user+sys가 커지는 경우
3.5 타임 슬라이스
Column 타임 슬라이스 구조
3.6 컨텍스트 스위치
3.7 처리 성능
3.8 프로그램 병렬 실행의 중요성


CHAPTER 4 메모리 관리 시스템
4.1 메모리 관련 정보 수집하기
_used
_buff/cache
_sar 명령어를 사용해서 메모리 관련 정보를 수집하기
4.2 메모리 재활용 처리
_프로세스 삭제와 메모리 강제 해제
4.3 가상 메모리
_가상 메모리가 없을 때 생기는 문제점
_가상 메모리 기능
_가상 메모리로 문제 해결하기
4.4 프로세스에 새로운 메모리 할당
_메모리 영역 할당: mmap () 시스템 콜
Column Meltdown 취약점의 공포
_메모리 할당: Demand paging
Column 프로그래밍 언어 번역기와 메모리 관리
4.5 페이지 테이블 계층화
_Huge Page
_Transparent Huge Page(THP)


CHAPTER 5 프로세스 관리(응용편)
5.1 빠른 프로세스 작성 처리
_fork() 함수 고속화: 카피 온 라이트
_execve() 함수의 고속화: Demand paging
5.2 프로세스 통신
_공유 메모리
_시그널
_파이프
_소켓
5.3 배타적 제어
5.4 돌고 도는 배타적 제어
5.5 멀티 프로세스 및 멀티 스레드
Column 커널 스레드와 사용자 스레드


CHAPTER 6 장치 접근
6.1 디바이스 파일
_캐릭터 장치
_블록 장치
Column 루프 장치
6.2 디바이스 드라이버
_메모리 맵 입출력(MMIO)
_폴링
_인터럽트
Column 일부러 폴링을 사용하는 경우
6.3 디바이스 파일명은 바뀌기 마련


CHAPTER 7 파일 시스템
7.1 파일 접근 방법
7.2 메모리 맵 파일
7.3 일반적인 파일 시스템
7.4 쿼터(용량 제한)
7.5 파일 시스템 정합성 유지
_저널링을 사용한 오류 방지
_카피 온 라이트로 오류 방지
_뭐니 뭐니 해도 백업
7.6 Btrfs에서 제공하는 파일 시스템의 고급 기능
_스냅샷
_멀티 볼륨
Column 어떤 파일 시스템을 사용하면 좋은가?
7.7 데이터 손상 감지와 복구
7.8 기타 파일 시스템
_메모리 기반의 파일 시스템
_네트워크 파일 시스템
_procfs
_sysfs


CHAPTER 8 메모리 계층
8.1 캐시 메모리
_참조의 지역성
_계층형 캐시 메모리
_캐시 메모리 접근 속도 측정
Simultaneous Multi Threading (SMT)
Column 변환 색인 버퍼(Translation Lookaside Buffer)
8.2 페이지 캐시
_페이지 캐시 효과
8.3 버퍼 캐시
8.4 쓰기 타이밍
8.5 직접 입출력
8.6 스왑
8.7 통계 정보


CHAPTER 9 블록 계층
9.1 하드 디스크의 특징
9.2 블록 계층의 기본 기능
9.3 블록 장치의 성능 지표 및 측정 방법
_하나의 프로세스만 입출력을 호출하는 경우
_여러 프로세스가 병렬로 입출력을 호출하는 경우
Column 추측하지 말고, 측정해라
_성능 측정 도구: fio
9.4 블록 계층이 하드 디스크 성능에 주는 영향
_패턴 A 측정 결과
_패턴 B 측정 결과
Column 무엇을 위한 성능 측정인가
_기술 혁신과 관련된 블록 계층의 변화
9.5 블록 계층이 NVMe SSD의 성능에 미치는 영향
_패턴 A 측정 결과
_패턴 B 측정 결과
Column 실제 성능 측정


CHAPTER 10 가상화 기능
10.1 가상화 기능이란 무엇인가
10.2 가상화 소프트웨어
10.3 이 장에서 사용하는 가상화 소프트웨어
Column 중첩 가상화
10.4 가상화를 지원하는 CPU 기능
_QEMU+KVM 조합
Column CPU 가상화 기능이 없는 경우의 가상화
10.5 가상 머신은 호스트 OS에서 어떻게 보이는가?
_호스트 OS에서 본 게스트 OS
_여러 머신을 실행하는 경우
Column IaaS의 오토스케일 메커니즘
10.6 가상화 환경의 프로세스 스케줄링
_물리 기기에서 프로세스가 동작하는 경우
_통계 정보
10.7 가상 머신 및 메모리 관리
_가상 머신이 사용하는 메모리
10.8 가상 머신과 저장 장치
_가상 머신과 저장소 입출력
_저장 장치 쓰기와 페이지 캐시
_반가상화 장치와 virtio_blk
Column 호스트 OS와 게스트 OS의 저장소 입출력 성능 역전 현상
10.9 virtio_blk 구조
Column PCI 패스스루


CHAPTER 11 컨테이너
11.1 가상 머신과 차이점
11.2 컨테이너 종류
11.3 네임스페이스
_프로세스ID 네임스페이스
_컨테이너 정체
11.4 보안 위험성


CHAPTER 12 cgroup
12.1 cgroup으로 제어 가능한 자원
12.2 사용 예: CPU 사용 시간 제어
Column cgroup 기능이 리눅스 커널에 포함된 과정
12.3 응용 예
Column cgroup v2

CHAPTER 13 이 책에서 배우는 내용과 활용법

3. 이 책의 장점

3.1. 그림과 코드과 곁들여진 자세한 설명


일부러 어렵게 설명하고자하는 저자는 없을 것이다. 쉽게 설명하는것과 그것이 실제로 잘 전달되는지는 별개의 문제라고 생각한다. 본 책의 경우 아무페이지로 이동해도 그림/장표가 있을 정도로 설명에 노력하고 있으며, 실습코드의 각 구문이 무엇을 위해서인지, 실행한 결과는 어떻게 되는지, 거기서 어떤 결론을 확인할 수 있는지 순서대로 설명해주어서 이해하기 용이하였다

3.2. 따라할 수 있는 실습 코드의 제공


단순히 설명을 하는 책이 아닌, 설명과 실제 따라하며 확인하는 방식으로 책이 구성되어있다. 설명만 있거나, 별도의 실습코드를 제공하지않으면 그냥 책의 내용을 보면서 고개만 끄덕이고 넘어가기 쉽다. 출판사홈페이지에서 go 또는 python으로 작성된 관련 코드를 받고 따라하기가 매우 용이하다

실습코드 링크: https://hanbit.co.kr/support/supplement_survey.html?pcode=B9151150768


4. Outro

마지막으로 이 책의 추천 독자를 정리하며 마무리하고자 한다.


이 책은 리눅스 입문자를 지나, 중급 또는 고급 사용자가 되기를 희망하는 사람들에게 적절한 책인듯 하다.

기본 패키지 설정 및 명령어 사용에 관한 책은 아니며, 리눅스 커널/OS단의 작동에 대해 설명하는 책이다. 저자는 이 책 이후로 시스템 운영, 보다 나은 프로그래밍, 본격적인 커널개발의 테크트리(?)를 제안한다. 시스템 성능 분석 및 최적화, 커널 튜닝, 등에 관심이 있다면 그 전의 단계에 있는 사람들이 읽으면 큰 도움이 되는 책이다.

Leave a Reply