 |
-- 會員 / 註冊 --
|
|
|
|
Linux內核分析及應用 ( 簡體 字) |
作者:陳科 | 類別:1. -> 作業系統 -> Linux |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 49546 詢問書籍請說出此書號!【缺書】 NT售價: 395 元 |
出版日:7/1/2018 |
頁數:272 |
光碟數:0 |
|
站長推薦:  |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111604082 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:隨著計算機技術的發展,開發人員想要根據業務需求寫出相關實現代碼還是比較容易的,因為已經有了很多工具、組件、庫等可幫助 我們實現功能。開發人員很少會自己裸寫代碼,不會從底層到上層全部由自己來實現。于是,很多開發人員一旦遇到程序出現問題就 會茫然失措,不知道該如何處理,甚至故障診斷和分析都成了一門高深的技術難題。
我們做任何一件事情都應該知其然,并知其所以然。操作系統是計算機的基礎,所有的應用程序都是運行在操作系統之上的,所以, 不管開發人員使用什么語言,開發什么行業的應用,都應該了解操作系統的原理與實現細節。
本人因為長期從事系統架構相關的工作,在涉及一些中間件或者基礎組件的研發工作過程中,經常會與操作系統打交道,特別是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監聽初始化的過程。
本書精選了大量案例,相關代碼可以下載,其中包括本書使用的Linux內核 源代碼。
致謝
感謝我曾經的同事和領導們:莊濤、胡志強、何崚、吳國慶、劉曉飛、陳潔梅、郭秀軍,等等,是你們對我工作的幫助和支持,才讓 我有機會深入了解Linux并有了總結思路。感謝吳怡編輯的辛勤工作和不斷督促,讓本書的出版成為可能。同時還要感謝許多我不知道 名字的幕后工作人員為本書付出的努力。
最后,感謝我的家人,是你們默默地支持和付出,才能讓我在工作上不斷前進,你們的愛永遠是我前進的動力。 |
內容簡介:本書由資深架構師親力打造,分享了他十多年后端開發經驗,特別是圍繞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監聽初始化的過程。 |
目錄:前言 第1章 進程與線程 1 1.1 進程和線程的概念 1 1.1.1 進程的歷史 1 1.1.2 線程的不同玩法 3 1.2 Linux對進程和線程的實現 5 1.2.1 Linux中的進程實現 6 1.2.2 進程創建之后 12 1.2.3 內核線程和進程的區別 13 1.2.4 用戶線程庫pthread 15 1.3 進程的調度 16 1.3.1 進程調度機制的架構 16 1.3.2 進程切換的原理 19 1.3.3 調度中的CPU親和度 21 1.4 在應用程序中管理進程和線程 22 1.4.1 Memcached線程池模型分析 22 1.4.2 Nginx進程模型分析 24 1.5 處理進程和線程的相關工具 25 1.5.1 開發環境調試線程 25 1.5.2 進程崩潰調試方法 26 1.5.3 strace工具 28 1.5.4 SystemTap工具 29 1.5.5 DTrace工具 30 1.6 本章小結 32 第2章 并發 33 2.1 什么是并發 34 2.1.1 并發是如何產生的 34 2.1.2 并發會帶來什么問題 34 2.1.3 如何解決并發帶來的問題 35 2.2 操作系統會在哪些場景遇到并發 35 2.3 Linux中并發工具的實現 37 2.3.1 原子變量 37 2.3.2 自旋鎖 38 2.3.3 信號量 42 2.3.4 互斥鎖 43 2.3.5 讀寫鎖 43 2.3.6 搶占 44 2.3.7 per-cpu變量 45 2.3.8 RCU機制 48 2.3.9 內存屏障 51 2.4 常見開源軟件中的并發問題分析 54 2.4.1 Nginx原子性 54 2.4.2 Memcached中的互斥鎖 55 2.4.3 Redis無鎖解決方案 56 2.4.4 Linux中驚群問題分析 57 2.4.5 解決MyCat同步問題 65 2.4.6 false-sharing問題解決方案 67 2.5 本章小結 69 第3章 內存管理 70 3.1 為什么需要內存管理 71 3.2 MMU和地址空間 73 3.2.1 虛擬地址、線性地址、物理地址 73 3.2.2 MMU的內存管理機制 74 3.3 Linux中的分段和分頁機制 79 3.3.1 分段機制 79 3.3.2 分頁機制 80 3.4 Linux的內存管理 82 3.4.1 物理內存管理 83 3.4.2 進程地址空間管理 86 3.5 Linux的內存分配和管理 89 3.5.1 物理內存分配算法 89 3.5.2 slab分配器 95 3.5.3 內核態內存管理 105 3.5.4 用戶態內存申請 109 3.6 棧內存分配和管理 109 3.7 內存管理案例分析 110 3.7.1 Memcached內存管理機制分析 110 3.7.2 Redis內存管理機制分析 113 3.8 本章小結 115 第4章 中斷機制 116 4.1 x86系統的中斷機制 116 4.1.1 x86中斷架構 117 4.1.2 x86在保護模式下的中斷 117 4.2 Linux對中斷的支持和實現 119 4.2.1 初始化IRQ中斷門 120 4.2.2 中斷響應流程 120 4.2.3 中斷回調handler注冊過程 122 4.3 Linux加速中斷處理的機制 122 4.3.1 軟中斷 122 4.3.2 tasklet 126 4.3.3 工作隊列 128 4.4 系統調用 132 4.5 時鐘中斷 134 4.6 信號處理機制 135 4.7 Nginx信號處理機制 139 4.8 本章小結 141 第5章 輸入輸出 142 5.1 I/O在Linux中的生命周期 143 5.1.1 vfs層 143 5.1.2 文件系統層 144 5.1.3 Block層 152 5.1.4 scsi層 156 5.1.5 I/O流程總結 157 5.2 I/O調度器 159 5.3 多隊列機制 161 5.4 I/O多路復用實現 163 5.5 Redis對epoll的封裝 170 5.6 Nginx文件異步I/O 175 5.7 tail指令為何牛 177 5.8 零拷貝技術應用分析 179 5.8.1 mmap 180 5.8.2 sendf?ile 181 5.8.3 mmap和sendf?ile在開源軟件中的使用 183 5.9 本章小結 186 第6章 文件系統 187 6.1 Linux文件系統架構 187 6.2 文件系統的主要功能 189 6.2.1 文件系統的安裝 190 6.2.2 文件路徑查找 191 6.3 ext4文件系統 201 6.3.1 磁盤布局 201 6.3.2 inode定位 203 6.3.3 碎片問題解決方案 204 6.3.4 extent tree結構 204 6.4 淘寶TFS小文件系統分析 206 6.5 本章小結 207 第7章 Linux的進程隔離技術與Docker容器 208 7.1 虛擬化相關技術 208 7.2 Linux進程隔離技術 209 7.2.1 chroot 209 7.2.2 namespace 210 7.2.3 cgroup 212 7.3 Docker容器的部分實現 219 7.3.1 新版Docker架構 220 7.3.2 containerd的實現 221 7.4 本章小結 241 第8章 Linux網絡層數據流分析 242 8.1 數據在網絡層的流轉 242 8.1.1 sk_buff結構 243 8.1.2 數據流轉過程 244 8.2 socket接口層的實現 248 8.2.1 socket系統初始化 248 8.2.2 socket創建 250 8.2.3 socket綁定 251 8.2.4 socket監聽 253 8.2.5 socket接受連接 254 8.2.6 新連接的到來 257 8.2.7 socket整體流程 259 8.3 netf?ilter和lvs 260 8.3.1 netf?ilter 260 8.3.2 lvs 263 8.4 網絡相關的一些參數 265 8.4.1 Java socket相關的參數 265 8.4.2 Linux TCP相關隊列 267 8.5 Nginx服務器監聽socket初始化過程 268 8.6 本章小結 274 |
序: |
|