官术网_书友最值得收藏!

前言

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

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

本人因為長期從事系統架構相關的工作,在涉及一些中間件或者基礎組件的研發工作過程中,經常會與操作系統打交道,特別是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并有了總結思路。感謝吳怡編輯的辛勤工作和不斷督促,讓本書的出版成為可能。同時還要感謝許多我不知道名字的幕后工作人員為本書付出的努力。

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

主站蜘蛛池模板: 竹北市| 萨迦县| 鱼台县| 镇赉县| 青海省| 大关县| 五指山市| 莲花县| 建昌县| 涪陵区| 凌海市| 仪陇县| 历史| 孟州市| 察隅县| 当阳市| 亳州市| 台南县| 滨州市| 关岭| 濮阳市| 恩平市| 荣昌县| 疏勒县| 南投县| 且末县| 土默特左旗| 东乡族自治县| 靖宇县| 广东省| 洱源县| 和政县| 沅江市| 衡阳县| 江源县| 福海县| 漳平市| 华安县| 锡林浩特市| 福清市| 蓬莱市|