《Linux高性能服务器编程》 读书笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhougb3/article/details/83544435

第一章 TCP/IP协议族

在这里插入图片描述
在这里插入图片描述

数据链路层可以看成是一个网卡驱动,为上层提供了一个统一的接口。

Telnet协议是一种远程登录协议,它使得我们能在本地完成远程任务。


第二章 IP协议详解


第三章 TCP协议详解

在这里插入图片描述
在这里插入图片描述

产生复位报文段的三种情况:

  1. 访问不存在的端口
  2. 异常终止连接
  3. 处理半打开连接

tcp交互数据流(Telnet,ssh)和成块数据流(ftp)

tcp利用紧急指针标志和紧急指针来实现所谓的带外数据(只有一个字节)。


第五章 Linux网络编程基础API

分为三个部分:

  1. socket地址API(ip,port)
  2. socket基础API(sys/socket.h)
  3. 网络信息API(netdb.h,用于主机名和IP地址的转换)

第六章 高级IO函数

详见书中。


第七章 linux服务器程序规范

(需要更深入地理解)

  1. 系统日志(Linux提供了一个写日志的接口)
  2. 用户信息(UID, EUID, GID, EGID)
  3. 进程间关系
  4. 系统资源限制
  5. 改变工作目录和根目录
  6. 服务器程序后台化

第八章 高性能服务器程序框架

阻塞IO,IO复用,信号驱动IO都是同步IO模型,因为它们都是在IO事件发生之后,由应用程序来完成(将数据从用户空间写入内核空间)。对异步IO来说,则是全部交给了内核(数据在内核和用户空间之间的移动由内核完成)。同步IO向应用程序通知的是IO就绪事件,异步IO对应用程序通知的是IO完成事件。

两种高效的事件处理模式:reactor模式(同步IO模型)和Proactor模式(异步IO模型)

在这里插入图片描述

Proactor模式将所有的IO操作交给主线程和内核来完成:
在这里插入图片描述
在这里插入图片描述

并发编程就是为了提高CPU的利用率嘛,如果是计算密集型的那并发编程就没有用了。

并发编程模式:

  1. 半同步半异步模式:同步线程用于处理客户逻辑,异步线程用于处理IO事件,一种变体如下(这其实是reactor模式,因为传的是socket):
    在这里插入图片描述
    在这里插入图片描述
  2. 领导者追随者模式:
    在这里插入图片描述

有限状态机(一种高效的逻辑处理方式)的使用:举了一个解析http的例子。(由于不知道http的头部长度,所以我们通过使用状态机边解析边判断,如果未读完则继续读取,解析出错则可以直接返回,不用等到全部读完才解析了)这个有限状态机的代码实现值得研究。

提高服务器性能的其他建议:

  1. 使用池(内存池,进程池,线程池,连接池):以空间换时间,避免对内核的频繁访问。内存池通常用于socket的接收缓存和发送缓存,连接池通常用于服务器或服务器群的内部永久连接(例如:每个逻辑单元要访问数据库时,直接从连接池中取得一个连接实体并使用,完成之后再返回给连接池)。
  2. 减少数据复制(比如ftp需要发送一个文件,可以直接使用零拷贝函数sendfile,而不用读到应用缓冲区再发送给内核)
  3. 上下文切换和锁:不应该有太多的线程,尽量避免使用锁(锁不但不处理任何业务逻辑,还需要访问内核资源),减少锁的粒度(使用读写锁)。

第九章 IO复用

在这里插入图片描述

IO多路复用的应用:

  1. 客户端非阻塞的connect,可以同时发起多个连接
  2. splice函数也可以用来实现零拷贝,将用户输入内容直接定向到网络连接上(用户输入就是文件描述符0)。

第十章 信号

在这里插入图片描述

统一事件源:
在这里插入图片描述


第十一章 定时器

使用一个链表来升序存储每个定时器的触发内容,当有定时事件发生时,主循环(使用统一事件源)监测到可读事件就会去遍历链表执行可以执行的定时事件。可以使用这个方法去实现服务端定时清除非活跃连接的功能。
在这里插入图片描述

两种高效的管理定时器的容器:时间轮(哈希)和时间堆(二叉树)


高性能IO框架库libevent

linux服务器必须处理的三种事件:IO事件,信号和定时事件(这三种都可以统一事件源)。

源码


其他

展开阅读全文

没有更多推荐了,返回首页