Linux高性能服务器编程

出版社:游双 机械工业出版社 (2013-05出版)  
Tag标签:无  

前言

前言为什么要写这本书目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞。很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚。有些书籍给读者展现的是网络上随处可见的知识,基本没有自己的观点,甚至连一点自己的总结都没有。反观大师们的经典书籍,整本书只专注于一个问题,而且对每个技术细节的描述都是精雕细琢。最关键的是,我们在阅读这些经典书籍时,似乎是在用心与一位编程高手交流,这绝对是一种享受。我们把问题缩小到计算机网络编程领域。关于计算机网络编程的相关书籍,不得不提的是已故网络教育巨匠W•Richard Stevens先生的《TCP/IP协议详解》(三卷本),以及《UNIX网络编程》(两卷本)。作为一名网络程序员,即使没有阅读过这几本书,也应该听说过它们。但这几本书中的内容实在是太庞大了,没有耐心的读者根本不可能把它们全部读完。而且对于英文不太好的朋友来说,选择阅读其翻译版本又有失原汁原味。基于以上两点原因,笔者编写了这本《Linux高性能服务器编程》。本书是笔者多年来学习网络编程之总结,是在充分理解大师的作品并融入自己的理解和见解后写成的。本书讨论的主题和定位很明确。简单来说就是:如何通过各种手段编写高性能的服务器程序。网络技术是在不断向前发展的,比如Linux提供的epoll机制就是在内核2.6版本之后才正式引入的。但是,编程思想却可以享用一辈子。我们在不断学习并使用新技术,不断适应新环境的同时,书中提到的网络编程思想能让我们看得更远,想得更多。笔者相信,没有谁会认为W•Richard Stevens先生的网络编程书籍过时了。读者对象阅读本书之前,读者需要了解基本的计算机网络知识,并具有一定的Linux系统编程和C++编程基础,否则阅读起来会有些困难。本书读者对象主要包括:Linux网络应用程序开发人员Linux系统程序开发人员C/C++程序开发人员对网络编程技术感兴趣,或希望参与网络程序开发的人员开设相关课程的大专院校师生本书特色本书的特点:不求内容宽泛,但求专而精,深入地剖析服务器编程的要素;不求内容精准,但求融入笔者自己的理解和观点,可谓“另眼”看服务器编程。如何提高服务器程序性能是本书要着重讨论的。第6、8、9、11、12、15、16等章中都用了相当的篇幅讨论这一主题。其论述方法是:首先,探讨提高服务器程序性能的一般原则,比如使用“池”以牺牲空间换取效率,使用零拷贝函数以避免内核和用户空间的切换等;其次,介绍一些高效的编程模式及其应用,比如使用有限状态机来分析用户数据,使用进程池或线程池来处理用户请求;最后,探讨如何通过调整系统参数来从服务器程序外部提高其整体性能。光说不练假把式。如果没有实例,或者只是给出几个“Hello World”,那么本书就真没有出版的必要了。笔者要做的是让读者能真正把理论和实践完美地结合起来。在写作本书之前,笔者阅读了不少开源社区的优秀服务器软件的源代码,自己也写过相当多的小型服务器程序。这些软件中那些最精彩的部分,在书中都有充分的体现。比如第15章给出的两个实例——用进程池实现的简单CGI服务器和用线程池实现的简单Web服务器,就充分展现了如何利用各种提高服务器性能的手段来高效地解决实际问题。此外,为了帮助读者进一步把书中的知识融汇到实际项目中,笔者还特意编写了一个较为完整的负载均衡服务器程序springsnail。该程序能从所有逻辑服务器中选取负荷最小的一台来处理新到的客户连接。在这个程序中,使用了进程池、有限状态机、高效数据结构来提高其性能;同时,细致地封装了每个函数和模块,使之更符合实际工程项目。由于篇幅的限制,笔者未将该程序的源代码列在书中,读者可从华章网站上下载它。如何阅读本书本书分为三篇:第一篇(第1~4章)介绍TCP/IP协议族及各种重要的网络协议。只有很好地理解了底层TCP/IP通信的过程,才能编写出高质量的网络应用程序。毕竟,坚实的基础设施造就稳固的上层建筑。第二篇(第5~15章)细致地剖析了服务器编程的各主要方面,其中对每个重要的概念、模型以及函数等都以实例代码的形式加以阐述。这一篇又可细分为如下四个部分:第一部分(第5~7章)介绍Linux操作系统为网络编程提供的众多API。这些API就像是基本的音符,我们通过组织它们来谱写优美的旋律。第二部分(第8章)探讨高性能服务器程序的一般框架。在这一部分中,我们将服务器程序解构为I/O单元、逻辑单元和存储单元三个部件,并重点介绍了I/O单元、逻辑单元的几种高效实现模式。此外,我们还探讨了提高服务器性能的其他建议。第三部分(第9~12章)深入剖析服务器程序的I/O单元。我们将探讨I/O单元需要处理的I/O事件、信号事件和定时事件,并介绍一款优秀的开源I/O框架库——Libevent。第四部分(第13~15章)深入剖析服务器程序的逻辑单元。这一部分我们要讨论多线程、多进程编程,以及高性能逻辑处理模型——进程池和线程池,并给出相应的实例代码。第三篇(第16~17章)探讨如何从系统的角度优化和监测服务器性能。本篇的内容涉及服务器程序的调制、调试和测试,以及诸多常用系统监测工具的使用。勘误和支持由于作者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。书中的全部源文件都可以从华章网站下载。期待能够得到您的真挚反馈。致谢首先要感谢伟大的网络教育导师W•Richard Stevens先生,他的书籍帮助了无数的网络程序开发人员,也给笔者指明了学习的道路。感谢机械工业出版社华章公司的编辑杨福川老师和孙海亮老师,是他们在这两年多的时间中始终支持着我的写作,因为有了他们的鼓励、帮助和引导,笔者才能顺利完成全部书稿。感谢好友史正政,他对编程充满热爱,也无私地为本书提供了原材料。谨以此书献给我最亲爱的家人和朋友,以及那些为计算机网络教育做出巨大贡献的大师们,还有正在为自己的未来努力拼搏、充满朝气和活力的IT工程师们!游双于北京

作者简介

游双,资深Linux软件开发工程师,对Linux网络编程,尤其是服务器端的编程,有非常深入的研究,实战经验也十分丰富。曾就职于摩托罗拉,担任高级Linux软件工程师。此外,他还精通C++、Android、QT等相关的技术。活跃于Chinaunix等专业技术社区,发表了大量关于Linux网络编程的文章,深受社区欢迎。

书籍目录

前言第一篇 TCP/IP协议详解第1章 TCP/IP协议族 21.1 TCP/IP协议族体系结构以及主要协议 21.1.1 数据链路层 21.1.2 网络层 31.1.3 传输层 41.1.4 应用层 51.2 封装 61.3 分用 71.4 测试网络 81.5 ARP协议工作原理 91.5.1 以太网ARP请求/应答报文详解 91.5.2 ARP高速缓存的查看和修改 101.5.3 使用tcpdump观察ARP通信过程 101.6 DNS工作原理 121.6.1 DNS查询和应答报文详解 121.6.2 Linux下访问DNS服务 141.6.3 使用tcpdump观察DNS通信过程 151.7 socket和TCP/IP协议族的关系 16第2章 IP协议详解 172.1 IP服务的特点 172.2 IPv4头部结构 182.2.1 IPv4头部结构 182.2.2 使用tcpdump观察IPv4头部结构 202.3 IP分片 212.4 IP路由 222.4.1 IP模块工作流程 232.4.2 路由机制 242.4.3 路由表更新 252.5 IP转发 252.6 重定向 262.6.1 ICMP重定向报文 262.6.2 主机重定向实例 272.7 IPv6头部结构 272.7.1 IPv6固定头部结构 282.7.2 IPv6扩展头部 29第3章 TCP协议详解 303.1 TCP服务的特点 303.2 TCP头部结构 323.2.1 TCP固定头部结构 323.2.2 TCP头部选项 333.2.3 使用tcpdump观察TCP头部信息 353.3 TCP连接的建立和关闭 373.3.1 使用tcpdump观察TCP连接的建立和关闭 373.3.2 半关闭状态 393.3.3 连接超时 393.4 TCP状态转移 403.4.1 TCP状态转移总图 413.4.2 TIME_WAIT状态 433.5 复位报文段 443.5.1 访问不存在的端口 443.5.2 异常终止连接 453.5.3 处理半打开连接 453.6 TCP交互数据流 463.7 TCP成块数据流 483.8 带外数据 503.9 TCP超时重传 513.10 拥塞控制 533.10.1 拥塞控制概述 533.10.2 慢启动和拥塞避免 543.10.3 快速重传和快速恢复 55第4章 TCP/IP通信案例:访问Internet上的Web服务器 574.1 实例总图 574.2 部署代理服务器 584.2.1 HTTP代理服务器的工作原理 584.2.2 部署squid代理服务器 594.3 使用tcpdump抓取传输数据包 604.4 访问DNS服务器 624.5 本地名称查询 634.6 HTTP通信 644.6.1 HTTP请求 654.6.2 HTTP应答 664.7 实例总结 68第二篇 深入解析高性能服务器编程第5章 Linux网络编程基础API 705.1 socket地址API 705.1.1 主机字节序和网络字节序 705.1.2 通用socket地址 715.1.3 专用socket地址 725.1.4 IP地址转换函数 735.2 创建socket 745.3 命名socket 755.4 监听socket 765.5 接受连接 785.6 发起连接 805.7 关闭连接 805.8 数据读写 815.8.1 TCP数据读写 815.8.2 UDP数据读写 855.8.3 通用数据读写函数 865.9 带外标记 875.10 地址信息函数 875.11 socket选项 875.11.1 SO_REUSEADDR选项 895.11.2 SO_RCVBUF和SO_SNDBUF选项 895.11.3 SO_RCVLOWAT和SO_SNDLOWAT选项 935.11.4 SO_LINGER选项 935.12 网络信息API 945.12.1 gethostbyname和gethostbyaddr 945.12.2 getservbyname和getservbyport 955.12.3 getaddrinfo 965.12.4 getnameinfo 98第6章 高级I/O函数 1006.1 pipe函数 1006.2 dup函数和dup2函数 1016.3 readv函数和writev函数 1036.4 sendfile函数 1066.5 mmap函数和munmap函数 1076.6 splice函数 1086.7 tee函数 1106.8 fcntl函数 112第7章 Linux服务器程序规范 1147.1 日志 1147.1.1 Linux系统日志 1147.1.2 syslog函数 1157.2 用户信息 1167.2.1 UID、EUID、GID和EGID 1167.2.2 切换用户 1177.3 进程间关系 1187.3.1 进程组 1187.3.2 会话 1187.3.3 用ps命令查看进程关系 1197.4 系统资源限制 1197.5 改变工作目录和根目录 1207.6 服务器程序后台化 121第8章 高性能服务器程序框架 1238.1 服务器模型 1238.1.1 C/S模型 1238.1.2 P2P模型 1248.2 服务器编程框架 1258.3 I/O模型 1268.4 两种高效的事件处理模式 1278.4.1 Reactor模式 1288.4.2 Proactor模式 1288.4.3 模拟Proactor模式 1298.5 两种高效的并发模式 1308.5.1 半同步/半异步模式 1318.5.2 领导者/追随者模式 1348.6 有限状态机 1368.7 提高服务器性能的其他建议 1448.7.1 池 1448.7.2 数据复制 1458.7.3 上下文切换和锁 145第9章 I/O复用 1469.1 select系统调用 1469.1.1 select API 1469.1.2 文件描述符就绪条件 1489.1.3 处理带外数据 1489.2 poll系统调用 1509.3 epoll系列系统调用 1519.3.1 内核事件表 1519.3.2 epoll_wait函数 1529.3.3 LT和ET模式 1539.3.4 EPOLLONESHOT事件 1579.4 三组I/O复用函数的比较 1619.5 I/O复用的高级应用一:非阻塞connect 1629.6 I/O复用的高级应用二:聊天室程序 1659.6.1 客户端 1659.6.2 服务器 1679.7 I/O复用的高级应用三:同时处理TCP和UDP服务 1719.8 超级服务xinetd 1759.8.1 xinetd配置文件 1759.8.2 xinetd工作流程 176第10章 信号 17810.1 Linux信号概述 17810.1.1 发送信号 17810.1.2 信号处理方式 17910.1.3 Linux信号 17910.1.4 中断系统调用 18110.2 信号函数 18110.2.1 signal系统调用 18110.2.2 sigaction系统调用 18110.3 信号集 18210.3.1 信号集函数 18210.3.2 进程信号掩码 18310.3.3 被挂起的信号 18310.4 统一事件源 18410.5 网络编程相关信号 18810.5.1 SIGHUP 18810.5.2 SIGPIPE 18910.5.3 SIGURG 190第11章 定时器 19311.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO 19311.2  SIGALRM信号 19511.2.1 基于升序链表的定时器 19511.2.2 处理非活动连接 20011.3 I/O复用系统调用的超时参数 20511.4 高性能定时器 20611.4.1 时间轮 20611.4.2 时间堆 211第12章 高性能I/O框架库Libevent 21812.1 I/O框架库概述 21812.2 Libevent源码分析 22012.2.1 一个实例 22012.2.2 源代码组织结构 22212.2.3 event结构体 22412.2.4 往注册事件队列中添加事件处理器 22612.2.5 往事件多路分发器中注册事件 23012.2.6 eventop结构体 23312.2.7 event_base结构体 23512.2.8 事件循环 236第13章 多进程编程 23913.1 fork系统调用 23913.2 exec系列系统调用 24013.3 处理僵尸进程 24013.4 管道 24113.5 信号量 24313.5.1 信号量原语 24313.5.2 semget系统调用 24413.5.3 semop系统调用 24513.5.4 semctl系统调用 24713.5.5 特殊键值IPC_PRIVATE 24913.6 共享内存 25113.6.1 shmget系统调用 25113.6.2 shmat和shmdt系统调用 25213.6.3 shmctl系统调用 25313.6.4 共享内存的POSIX方法 25413.6.5 共享内存实例 25413.7 消息队列 26313.7.1 msgget系统调用 26313.7.2 msgsnd系统调用 26413.7.3 msgrcv系统调用 26413.7.4 msgctl系统调用 26513.8 IPC命令 26613.9 在进程间传递文件描述符 267第14章 多线程编程 26914.1 Linux线程概述 26914.1.1 线程模型 26914.1.2 Linux线程库 27014.2 创建线程和结束线程 27114.3 线程属性 27314.4 POSIX信号量 27514.5 互斥锁 27614.5.1 互斥锁基础API 27614.5.2 互斥锁属性 27714.5.3 死锁举例 27814.6 条件变量 27914.7 线程同步机制包装类 28014.8 多线程环境 28214.8.1 可重入函数 28214.8.2 线程和进程 28314.8.3 线程和信号 284第15章 进程池和线程池 28715.1 进程池和线程池概述 28715.2 处理多客户 28815.3 半同步/半异步进程池实现 28915.4 用进程池实现的简单CGI服务器 29815.5 半同步/半反应堆线程池实现 30115.6 用线程池实现的简单Web服务器 30415.6.1 http_conn类 30415.6.2 main函数 318第三篇 高性能服务器优化与监测第16章 服务器调制、调试和测试 32416.1 最大文件描述符数 32416.2 调整内核参数 32516.2.1 /proc/sys/fs目录下的部分文件 32516.2.2 /proc/sys/net目录下的部分文件 32516.3 gdb调试 32616.3.1 用gdb调试多进程程序 32616.3.2 用gdb调试多线程程序 32816.4 压力测试 329第17章 系统监测工具 33317.1 tcpdump 33317.2 lsof 33417.3 nc 33617.4 strace 33817.5 netstat 34117.6 vmstat 34217.7 ifstat 34417.8 mpstat 344参考文献 346

编辑推荐

《Linux高性能服务器编程》编辑推荐:Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写。从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,包含两个综合性案例,极具实战意义。

图书封面

图书标签Tags

评论、评分、阅读与下载



用户评论 (总计9条)

 
 

  •   这本书明显没有什么深层次的东西,那些货在网上就能找到
  •   看了下目录,这个确实和书的简介不大一致;书的简介称求深入而不求广泛,但从目录来看,内容很宽泛,都不深入,呵呵
  •   把基本的服务器开发介绍的很好,比较集中的讲解服务器开发。挺好的
  •   主要介绍了一些常用的API和工具,希望作者出个第二版 可以写再详细一些
  •   书不错!值得学习,网络编程,快速上手
  •   挺好的一本书,从工具到方法到比较高效的API都介绍了一下,花上几个下午快速过一下挺有帮助的。
  •   买了书的同学发现了没有, 书里面的很多内容在网上能够搜索到一字不差的......
  •   还行!!正在看,看完再来评论
  •   挺有启发的.............
 

250万本中文图书简介、评论、评分,PDF格式免费下载。 第一图书网 手机版

京ICP备13047387号-7