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

猜你喜欢

转载自blog.csdn.net/valada/article/details/83784961