- Linux內核分析及應用
- 陳科
- 184字
- 2019-01-05 06:07:54
前言
隨著計算機技術的發展,開發人員想要根據業務需求寫出相關實現代碼還是比較容易的,因為已經有了很多工具、組件、庫等可幫助我們實現功能。開發人員很少會自己裸寫代碼,不會從底層到上層全部由自己來實現。于是,很多開發人員一旦遇到程序出現問題就會茫然失措,不知道該如何處理,甚至故障診斷和分析都成了一門高深的技術難題。
我們做任何一件事情都應該知其然,并知其所以然。操作系統是計算機的基礎,所有的應用程序都是運行在操作系統之上的,所以,不管開發人員使用什么語言,開發什么行業的應用,都應該了解操作系統的原理與實現細節。
本人因為長期從事系統架構相關的工作,在涉及一些中間件或者基礎組件的研發工作過程中,經常會與操作系統打交道,特別是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并有了總結思路。感謝吳怡編輯的辛勤工作和不斷督促,讓本書的出版成為可能。同時還要感謝許多我不知道名字的幕后工作人員為本書付出的努力。
最后,感謝我的家人,是你們默默地支持和付出,才能讓我在工作上不斷前進,你們的愛永遠是我前進的動力。
- Linux設備驅動開發詳解(第2版)
- Getting Started with oVirt 3.3
- 嵌入式應用程序設計綜合教程(微課版)
- Windows Phone 7.5 Data Cookbook
- Ganglia系統監控
- Installing and Configuring Windows 10:70-698 Exam Guide
- 巧學活用Windows 7
- Kali Linux 2018:Windows Penetration Testing
- Learning Magento 2 Administration
- NetDevOps入門與實踐
- Introduction to R for Quantitative Finance
- Windows 7使用詳解(修訂版)
- Windows 7實戰從入門到精通(超值版)
- HTML5 Enterprise Application Development
- Windows Server 2008組網技術與實訓(第3版)