1. 程式人生 > >Linux 核心分析及應用

Linux 核心分析及應用

編輯推薦

本書分模組介紹了 Linux 作業系統的核心設計和實現,針對關鍵概念、演算法和資料結構做了重點的講解。同時,對諸多經典應用程式進行了剖析,如 Nginx、Memcached、Redis、LVS 等,講解如何利用作業系統提供的底層支援進行合理的應用設計和實現。

內容簡介

本書由架構師親力打造,分享了他十多年後端開發經驗,特別是圍繞 Linux 系統進行的服務開發經驗。

本書共8章,主要內容包括:

  • 第1章介紹 Linux 對程序和執行緒的實現原理,並分析了 Memcached 和 Nginx 工作程序池模型的實現;
  • 第2章介紹併發的概念以及 Linux 中的併發相關工具,然後分析常見開源軟體的併發問題;
  • 第3章介紹 Linux 是如何進行記憶體管理的,分析了 Memcached 和 Redis 的記憶體管理機制;
  • 第4章介紹 Linux 系統對中斷進行的封裝和實現;
  • 第5章介紹 I/O 的全過程,以及某些開源系統中 I/O 相關呼叫的實現等;
  • 第6章介紹 Linux 檔案系統的整體架構及核心概念,然後介紹 ext4 檔案系統的特點,以及 TFS 小檔案系統的設計思路;
  • 第7章介紹 Linux 程序隔離技術,以及 Docker 容器的部分實現;
  • 第8章介紹 Linux 網路層資料的流轉過程,以及 lvs 如何在 netfilter 上定製,後分析了 Nginx 伺服器 socket 監聽初始化的過程。

作者簡介

陳科,曾在阿里巴巴等多家網際網路公司擔任架構師、技術總監等職位,參與設計和開發了多個應對高併發、高可用的網際網路系統,對 Linux 系統以及圍繞 Linux 生態體系的開源軟體有深入研究,熱愛分享,在 UPYUN、DBA+、高可用架構群等組織的會議或者討論組中做過專題分享。

本書內容

對本書的讚譽

本書在分析 Linux 程序、併發、記憶體、中斷、IO、網路的同時,還分析了目前大家熟知的 Nginx、Memcached、Redis、LVS 等知名開源軟體,理論結合實踐,讓人受益匪淺。特別是結合了容器化技術的分析,讓讀者從底層瞭解容器化(Docker)的基本原理,在容器化火熱的今天,不得不說作者特別貼心。這是一本開發人員、架構師都值得一看的增強內功的書。

——許澤彬,淘寶技術專家


經過20多年的發展,Linux 已經成為網際網路技術的基石之一。雖然關於 Linux 的書籍眾多,但幾乎是現代作業系統理念的介紹,或者在此之上結合 Linux 原始碼加以分析,從而使讀者瞭解作業系統的演變和實現。本書的內容更貼合網際網路時代,讓讀者重溫 Linux 之外,作者更希望引發大家思考作業系統的魅力。每一章不僅介紹核心理念和實現,而且還帶領大家拓展技術的延展性,重新思考 Nginx、Redis、LVS 等產品的技術發展脈絡。飲水思源,思考技術的延展性的書籍少之又,本書是難得佳品。

——楊翔,廣東三維家資訊科技有限公司 CTO、前螞蟻金服高階技術專家


本書的作者是我多年的老友,其對技術的興趣與鑽研精神令我非常敬佩。本書很好地將 Linux 核心與現今流行的重要技術相結合,闡述了很多技巧,然而最令我欣賞的是作者對“知其然,知其所以然”的實踐與佈道。技巧可以讓人即刻受益,然而在“思想”就顯得渺小了,領悟了技術思想將使人終身受益!我們也看到很多老鳥們在會耍十八般武藝後,遇到了發展和晉升的瓶頸,歸根到底是缺乏這種思想和實踐。本書以實戰的方式演繹瞭如何去“知其然”,更示範瞭如何去“知其所以然”,就如同名家教你如何臨摹名畫,引人入勝,發人深省。

——胡志強,前馬雲公益基金會平臺總經理,阿里巴巴技術總監


IT 大時代,技術浪潮席捲整個人類社會。作為一名程式設計師或者架構師,每天會面對紛繁的技術領域與挑戰,掌握紮實的作業系統、資料結構與演算法、編譯原理、數學知識,是最基礎、最重要的,直接決定個人職業生涯的未來。我與本書作者認識多年且有機會一同共事,一直以來對其深厚的技術底蘊、孜孜不倦的技術鑽研,甚為佩服!本書對 Linux 核心原始碼的分析深入淺出,娓娓道來,涵蓋了 Linux 核心的各個重要方面,並且涉及目前業界熱門的容器與虛擬化技術,如果讀者能夠沿著本書的脈絡,結合 Linux 原始碼閱讀,一定能夠開卷有益,收穫良多!

——馮黎,前華為軟體開放平臺架構師


對於從事 Linux 平臺的開發者來說,瞭解 Linux 核心尤為重要,它不僅可以使我們對 Linux 更加了解,而且使我們分析問題會更加深入本質。本書從 Linux 核心分析到實際應用,結合 Nginx、Redis、Memcached 等常用應用的實際問題進行詳盡的分析,特別是對於一些關鍵技術點,作者都給予了深入的剖析和評價,對於從事 Linux 平臺的開發者來說本書無疑是一次知識盛宴。

——劉曉飛,前58同城首席架構師,技術總監


設計和實現一款優秀的作業系統核心或者應用程式充滿了挑戰,也正因為如此,深入理解 Linux 核心以及執行在 Linux 核心之上的具有代表性的應用程式就顯得非常有意義。我與本書作者陳科相識已久,見證了他多年戰鬥在一線,有著豐富的企業級系統架構經驗。本書分模組介紹了 Linux 作業系統的核心設計和實現,針對關鍵概念、演算法和資料結構做了重點的講解;並結合諸多經典應用程式解析瞭如何利用作業系統提供的底層支援進行合理的設計和實現。Linux 是一個龐大且偉大的工程,如果你不滿足於站在巨人的肩膀上,想要知其所以然,提升自己面對未知問題時的“遷移學習”能力,那麼本書將是一個很好的起點。

——鬱佳傑,貝貝網 CTO


現在是一個 IOT 正在興起的時代,我們的程式設計視角不斷地放大,從普通的 PC 機到人手一部的智慧機,再到各式各樣的終端裝置,這樣的高速成長離不開底層的作業系統升級。以毫不誇張地說,Linux 系統佔據了絕對的重要地位,我們任何的系統設計和架構最後都可以追溯到系統核心中。

阿里巴巴最近10年在技術上突飛猛進,某種程度上正是得益於對 Linux 系統底層的深度定製和使用,這才能研發出一系列的中介軟體和雲產品,支撐著 N 個雙11。

我和本書作者陳科認識好多年,每一次的交流我都能吸收到更多的技術靈感,我認為這正是本書能夠帶來的價值。掌握核心之後,理解和認識任何其他技術簡直是不費吹灰之力。很多人會覺得研究核心沒有用處,其實我們經常講的高併發、多執行緒等,正是 Linux 賦予我們的能力。

我已經要沉浸在這本書的樂趣中了,相信這本書可以讓大家能夠更快地掌握和理解 Linux 精髓,這是一件非常偉大的貢獻!

——焦英俊,未達科技創始人,前阿里巴巴中文站首席架構師,技術總監


本書作者擁有豐富的架構工作經驗,是以架構師身份在學習、實踐 Linux 的過程中總結出來的產物。本書內容涵蓋了 Linux 重要概念的分析過程,引導讀者一步步進入到 Linux 原始碼的世界,對剛接觸 Linux 的工程師很有指導價值。

——金立,河狸家技術 VP


在工程化領域,已有足夠多的開源產品和元件,讓我們快速搭建產品應用,然而產品質量、架構和運維的好壞,取決於我們開發人員對更多細節和實現原理的掌握,這又關乎自身的成長和發展。本書每個章節基本上是從問什麼、什麼是,開始介紹基本概念和實現機制,然後以常見開源產品的場景和案例進行問題分析,既適合於初級開發人員,又適合架構師和多年經驗的老鳥。我與本書作者相識多年,他對技術的熱情和“知其所以然”的鑽研精神一直令我敬佩,本書結合了作者自身多年的實戰經驗,帶著大家進行“知其然”的實踐和思考,非常值得一讀。

——張曉科,頂象科技風控技術負責人,前阿里巴巴風控技術專家


程式設計如同寫詩,程式設計師用一種精巧設計的“符號”輸送給計算機,從而構建著這個資訊世界;計算機是對空間和時間的形式化描述,是對描述性知識的精確表達;更形象地說計算機通過“符號”形式化的表述指令的計算過程。對計算機系統的本質進行挖掘,是我們提高技藝和興趣所在,本書最大的特點就是以應用層和 Linux 核心的執行機制相結合的方式,站在程式應用的視角深入核心這個奇妙的世界,讀來有一種醍醐灌頂的暢快感。

——徐兆朋,愛財科技集團技術負責人


在網際網路飛速發展的20年,新興技術層出不窮,但是大道之間,以不變應萬變。作為技術人員,大部分編寫的軟體都是執行在作業系統之上的,尤其是執行在 Linux 作業系統上。不管你是業務程式設計師還是底層中介軟體程式設計師,掌握好 Linux 核心都大有裨益。本書從實戰角度出發,對 Linux 的實現進行剖析,推薦所有有志於成為系統架構師的技術人員閱讀。

——郭秀軍,吉利集團曹操專車 CTO


Linux 誕生二十多年,已經成為開源運動的代名詞,吸收了全世界優秀程式設計師的精華。我印象中的本書作者陳科是 Linux 的狂熱分子,十年前我剛認識陳科,他就在鑽研 Linux 原始碼,在阿里期間經常搞一些內部分享,攢了不少粉絲。本書沉澱了陳科這些年對 Linux 系統的從全域性縱覽到區域性設計的深入理解,不同於市面上常見的 Linux 原始碼介紹書籍,本書不僅僅是講解程式碼實現,更是對一些精妙的設計理念做了剖析,相信一定能讓讀者受益匪淺。

——大少,阿里巴巴集團研究員,天貓首席架構師

前言

隨著計算機技術的發展,開發人員想要根據業務需求寫出相關實現程式碼還是比較容易的,因為已經有了很多工具、元件、庫等可幫助我們實現功能。開發人員很少會自己裸寫程式碼,不會從底層到上層全部由自己來實現。於是,很多開發人員一旦遇到程式出現問題就會茫然失措,不知道該如何處理,甚至故障診斷和分析都成了一門高深的技術難題。

我們做任何一件事情都應該知其然,並知其所以然。作業系統是計算機的基礎,所有的應用程式都是執行在作業系統之上的,所以,不管開發人員使用什麼語言,開發什麼行業的應用,都應該瞭解作業系統的原理與實現細節。

本人因為長期從事系統架構相關的工作,在涉及一些中介軟體或者基礎元件的研發工作過程中,經常會與作業系統打交道,特別是 Linux 核心。我個人認為,所有應用開發人員都應該瞭解作業系統的實現原理和思路。Linux 是人類工程史上的一個奇蹟(那麼大的工程,那麼多人在網路上維護,能保持那麼高的可用性),Linux 核心作為一個開放原始碼的工程,在很多方面值得我們學習和借鑑。其實在工程領域,很多問題的解題思路是類似的,掌握核心的實現,對於我們更好地編寫高效能、高可靠性的程式有很大幫助,也更加利於千里定位故障,秒殺 Bug。

Linux 體系結構

作業系統是所有應用程式生長的河床,它幫我們遮蔽各種硬體的細節,並且抽象出各種系統呼叫供應用開發人員來使用。

下面來介紹一下本書將要介紹的 Linux 核心的體系結構(圖1),以便於後續章節展開分析。

圖1 Linux 核心的體系結構

整個 Linux 核心可以分為4層:

  • 驅動管理層,驅動並管理外部一些硬體裝置,例如磁碟、網絡卡等。

  • 工具層,核心抽象出一些通用元件便於自己使用,例如併發管理中的一些鎖、per-cpu 變數等工具,另外還有中斷機制,也給程序管理、訊號處理等提供了基礎功能。

  • 系統能力層,作業系統的功能包括程序管理、記憶體管理、檔案系統、I/O 管理、網路等,這些功能都是基於工具層和驅動管理層提供的能力來構建的。

  • 系統呼叫介面層(syscall),給應用程式開發人員提供相關介面。因為系統呼叫的使用成本較高,引數也比較多,需要對核心有較多瞭解,所以,又抽象出一些 libc 等庫函式來封裝系統呼叫,應用開發人員一般都是通過 libc 等庫來與核心打交道的。

推薦預備知識

理論上說,只需具備一門程式語言的開發基礎就能閱讀本書,不過,為了更好地研究作業系統,我推薦大家先閱讀下面的書籍:

  • 《80x86組合語言程式設計》(沈美明等),與 CPU 打交道最好的方式還是組合語言,另外,瞭解組合語言也方便更好地掌握計算機體系結構,進而深入理解系統的工作原理。

  • 《Intel 開發手冊卷3》,Intel 公司的開發手冊,可以讓讀者瞭解 CPU 的工作原理、基本指令集等。CPU 相關的功能也是核心最為重要的部分之一。

  • 《自己動手編寫作業系統》(於淵),該書通過編寫一個簡易系統,讓讀者更加了解硬體的工作原理。

  • 《Linux 核心完全註釋》(v0.11)(趙炯),通過對0.11版本的 Linux 學習,可以瞭解早期的核心架構,這對學習新版本核心也有很大的幫助。

  • 《軟體除錯的藝術》(馬特洛夫),作為一名程式設計師,掌握基本的除錯技能是必須的。

  • 《程式設計師的自我修養:連結、裝載與庫》(潘愛民等),這本書有助於掌握編譯、連結的原理,對了解作業系統編譯、執行以及應用程式的裝載原理有很大幫助。

當然,掌握 C 語言也是必須的,畢竟 Linux 核心是用 C 語言開發的,如果是 C 語言新手,可以先閱讀 Memcached 的原始碼,因為作者的程式碼寫得比較清晰,易於理解,初學者都可以輕鬆上手。

本書章節概述

由於篇幅有限,本書並沒有詳細介紹 Linux 核心的所有知識點,比如系統的啟動過程,雖然對於一個核心的實現來講,系統啟動是非常重要的,但本書考慮的場景都是圍繞系統啟動之後提供的功能來展開的,所以本書沒有包括這部分內容。

本書共分為8章,分別介紹 Linux 作業系統的各個模組。對於 Linux 核心來講,各個模組之間雖然都是緊密結合的,但是從系統領域模型的角度,每一章都可以獨立展開,讀者既可以從頭開始閱讀,也可以選擇自己感興趣的章節進行學習。

第1章介紹程序和執行緒的概念、歷史、實現原理、應用場景等,然後介紹 Linux 對程序和執行緒的實現,以及排程的機制、程序 CPU 親和度等,並分析了 Memcached 執行緒池模型和 Nginx 工作程序池模型的實現,最後介紹了程序除錯分析監控等工具的用法,包括 gdb、coredump、strace、SystemTap、DTrace 等除錯工具。

第2章介紹併發的概念及其引發的相關問題,接著介紹操作系會在哪些場景遇到併發,進而分析 Linux 中的併發相關工具,如 atomicspin_lock、semaphore、mutex、讀寫鎖、per-cpu、搶佔、記憶體屏障、RCU 機制,最後介紹常見開源軟體中的併發問題分析,如 Nginx 的原子性、Memcached 的互斥鎖、Linux 中驚群問題分析、解決 MyCat 中的同步問題、偽共享問題解決方案等。

第3章首先介紹記憶體在體系結構中的作用,以及在使用中會遇到什麼問題,接著介紹 MMU 的記憶體管理機制、線性地址、實體地址、虛擬地址等。接下來分析 Linux 是如何進行記憶體管理的,包括整體架構以及夥伴演算法、slab 分配器、kmalloc、vmalloc、mallc 等。Linux 棧記憶體如何分配,對於核心棧和執行緒棧 Linux 又是如何區分和管理的。最後介紹了 Memcached 和 Redis 是如何管理記憶體的。

第4章首先介紹 x86 系統的中斷機制,以及為什麼要引入中斷機制,接著介紹 Linux 系統如何對中斷機制進行封裝和實現,並且介紹為加速中斷的處理過程,Linux 引入的機制,如軟中斷、tasklet、工作佇列等,最後介紹系統呼叫、時鐘中斷、訊號處理機制等實現方式。

第5章闡述了 I/O 在計算機體系結構中的重要性,以及 I/O 產生的全過程,還介紹 I/O 排程器和多佇列機制。最後介紹一些開源系統和作業系統中 I/O 相關呼叫的實現,比如:I/O 多路複用 epoll 呼叫、Redis 對 epoll 的封裝、Nginx 讀檔案非同步 I/O、零拷貝技術,主要圍繞 mmap 和 sendfile 的比對以及 Mongodb、Kafka 對零拷貝技術的使用等。

第6章以 vfs 為切入點,介紹 Linux 檔案系統的整體架構以及檔案系統的核心概念,並且介紹檔案系統的主要功能:如安裝、檔案查詢、讀寫等,簡單介紹 ext4 檔案系統,最後介紹 TFS 小檔案系統的設計思路。

第7章介紹 Intel VT 的硬體虛擬化技術,以及 Linux KVM 模組等虛擬化技術,然後介紹 chroot、namespace、cgroup 等容器虛擬化底層技術在 Linux 上的實現,最後,著重分析新版 Docker 容器拆分後,容器化模組 containerd 的實現。

第8章圍繞資料如何在 Linux 網路層流轉來介紹 Linux 網路層的控制機制,首先簡單介紹 lvs 如何在 netfilter 上進行定製,最後介紹 Nginx 伺服器 socket 監聽初始化的過程。

本書精選了大量案例,相關程式碼可以下載,地址為 https://github.com/lingq1818/analysis_linux,其中包括本書使用的 Linux 核心原始碼。

致謝

感謝我曾經的同事和領導們:莊濤、胡志強、何崚、吳國慶、劉曉飛、陳潔梅、郭秀軍,等等,是你們對我工作的幫助和支援,才讓我有機會深入瞭解 Linux 並有了總結思路。感謝吳怡編輯的辛勤工作和不斷督促,讓本書的出版成為可能。同時還要感謝許多我不知道名字的幕後工作人員為本書付出的努力。

最後,感謝我的家人,是你們默默地支援和付出,才能讓我在工作上不斷前進,你們的愛永遠是我前進的動力。

第1章 程序與執行緒(上)
第1章 程序與執行緒(下)
第2章 併發(上)
第2章 併發(下)
第3章 記憶體管理(上)
第3章 記憶體管理(下)
第4章 中斷機制
第5章 輸入輸出(上)
第5章 輸入輸出(下)
第6章 檔案系統
第7章 Linux 的程序隔離技術與 Docker 容器
第8章 Linux 網路層資料流分析(上)
第8章 Linux 網路層資料流分析(下)

閱讀全文: http://gitbook.cn/gitchat/geekbook/5bd685c98b3f803a63efa052