本书分模块介绍了 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+、高可用架构群等组织的会议或者讨论组中做过专题分享。
本书内容
对本书的赞誉
——许泽彬,淘宝技术专家
——杨翔,广东三维家信息科技有限公司 CTO、前蚂蚁金服高级技术专家
——胡志强,前马云公益基金会平台总经理,阿里巴巴技术总监
——冯黎,前华为软件开放平台架构师
——刘晓飞,前58同城首席架构师,技术总监
——郁佳杰,贝贝 CTO
现在是一个 IOT 正在兴起的时代,我们的编程视角不断地放大,从普通的 PC 机到人手一部的智能机,再到各式各样的终端设备,这样的高速成长离不开底层的操作系统升级。以毫不夸张地说,Linux 系统占据了绝对的重要地位,我们任何的系统设计和架构最后都可以追溯到系统内核中。
阿里巴巴最近10年在技术上突飞猛进,某种程度上正是得益于对 Linux 系统底层的深度定制和使用,这才能研发出一系列的中间件和云产品,支撑着 N 个双11。
我已经要沉浸在这本书的乐趣中了,相信这本书可以让大家能够更快地掌握和理解 Linux 精髓,这是一件非常伟大的贡献!
——焦英俊,未达科技创始人,前阿里巴巴中文站首席架构师,技术总监
——金立,河狸家技术 VP
——张晓科,顶象科技风控技术负责人,前阿里巴巴风控技术专家
编程如同写诗,程序员用一种精巧设计的“符 ”输送给计算机,从而构建着这个信息世界;计算机是对空间和时间的形式化描述,是对描述性知识的精确表达;更形象地说计算机通过“符 ”形式化的表述指令的计算过程。对计算机系统的本质进行挖掘,是我们提高技艺和兴趣所在,本书最大的特点就是以应用层和 Linux 内核的运行机制相结合的方式,站在程序应用的视角深入内核这个奇妙的世界,读来有一种醍醐灌顶的畅快感。
——徐兆朋,爱财科技集团技术负责人
在互联 飞速发展的20年,新兴技术层出不穷,但是大道之间,以不变应万变。作为技术人员,大部分编写的软件都是运行在操作系统之上的,尤其是运行在 Linux 操作系统上。不管你是业务程序员还是底层中间件程序员,掌握好 Linux 内核都大有裨益。本书从实战角度出发,对 Linux 的实现进行剖析,推荐所有有志于成为系统架构师的技术人员阅读。
——郭秀军,吉利集团曹操专车 CTO
——大少,阿里巴巴集团研究员,天猫首席架构师
前言
随着计算机技术的发展,开发人员想要根据业务需求写出相关实现代码还是比较容易的,因为已经有了很多工具、组件、库等可帮助我们实现功能。开发人员很少会自己裸写代码,不会从底层到上层全部由自己来实现。于是,很多开发人员一旦遇到程序出现问题就会茫然失措,不知道该如何处理,甚至故障诊断和分析都成了一门高深的技术难题。
我们做任何一件事情都应该知其然,并知其所以然。操作系统是计算机的基础,所有的应用程序都是运行在操作系统之上的,所以,不管开发人员使用什么语言,开发什么行业的应用,都应该了解操作系统的原理与实现细节。
本人因为长期从事系统架构相关的工作,在涉及一些中间件或者基础组件的研发工作过程中,经常会与操作系统打交道,特别是 Linux 内核。我个人认为,所有应用开发人员都应该了解操作系统的实现原理和思路。Linux 是人类工程史上的一个奇迹(那么大的工程,那么多人在 络上维护,能保持那么高的可用性),Linux 内核作为一个开放源码的工程,在很多方面值得我们学习和借鉴。其实在工程领域,很多问题的解题思路是类似的,掌握内核的实现,对于我们更好地编写高性能、高可靠性的程序有很大帮助,也更加利于千里定位故障,秒杀 Bug。
Linux 体系结构
操作系统是所有应用程序生长的河床,它帮我们屏蔽各种硬件的细节,并且抽象出各种系统调用供应用开发人员来使用。
下面来介绍一下本书将要介绍的 Linux 内核的体系结构(图1),以便于后续章节展开分析。

图1 Linux 内核的体系结构
整个 Linux 内核可以分为4层:
驱动管理层,驱动并管理外部一些硬件设备,例如磁盘、 卡等。
工具层,内核抽象出一些通用组件便于自己使用,例如并发管理中的一些锁、per-cpu 变量等工具,另外还有中断机制,也给进程管理、信 处理等提供了基础功能。
系统能力层,操作系统的功能包括进程管理、内存管理、文件系统、I/O 管理、 络等,这些功能都是基于工具层和驱动管理层提供的能力来构建的。
系统调用接口层(syscall),给应用程序开发人员提供相关接口。因为系统调用的使用成本较高,参数也比较多,需要对内核有较多了解,所以,又抽象出一些 libc 等库函数来封装系统调用,应用开发人员一般都是通过 libc 等库来与内核打交道的。
推荐预备知识
理论上说,只需具备一门编程语言的开发基础就能阅读本书,不过,为了更好地研究操作系统,我推荐大家先阅读下面的书籍:
《80×86汇编语言程序设计》(沈美明等),与 CPU 打交道最好的方式还是汇编语言,另外,了解汇编语言也方便更好地掌握计算机体系结构,进而深入理解系统的工作原理。
《Intel 开发手册卷3》,Intel 公司的开发手册,可以让读者了解 CPU 的工作原理、基本指令集等。CPU 相关的功能也是内核最为重要的部分之一。
《自己动手编写操作系统》(于渊),该书通过编写一个简易系统,让读者更加了解硬件的工作原理。
《Linux 内核完全注释》(v0.11)(赵炯),通过对0.11版本的 Linux 学习,可以了解早期的内核架构,这对学习新版本内核也有很大的帮助。
《软件调试的艺术》(马特洛夫),作为一名程序员,掌握基本的调试技能是必须的。
《程序员的自我修养:链接、装载与库》(潘爱民等),这本书有助于掌握编译、链接的原理,对了解操作系统编译、运行以及应用程序的装载原理有很大帮助。
本书章节概述
由于篇幅有限,本书并没有详细介绍 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 内核源代码。
致谢
最后,感谢我的家人,是你们默默地支持和付出,才能让我在工作上不断前进,你们的爱永远是我前进的动力。
第1章 进程与线程(上)
?第1章 进程与线程(下)
第2章 并发(上)
第2章 并发(下)
第3章 内存管理(上)
第3章 内存管理(下)
第4章 中断机制
第5章 输入输出(上)
第5章 输入输出(下)
第6章 文件系统
第7章 Linux 的进程隔离技术与 Docker 容器
第8章 Linux 络层数据流分析(上)
第8章 Linux 络层数据流分析(下)
阅读全文: http://gitbook.cn/gitchat/geekbook/5bd685c98b3f803a63efa052
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux25299 人正在系统学习中 相关资源:菜鸟耍人专用-软件测试其他资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!