linux高性能服务器编程书本总结

linux高性能服务器编程书本总结_第1张图片

 

目录

目录分析

第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型

第二篇 核心篇 5 章到 15 章节

5-6章节 主要介绍 套接字编程API的使用和介绍

 

7章 是linux 服务器方面的一个规范操作

8-9 服务器的架构模式  --也是本书最重要的章节 8是内核

10章 信号

11章定时器

12章 libevent 开源库

13-14 多进程线程编程开发

15章 进程池线程池

第三篇 高性能服务器优化监控  介绍了一个linux 下的工具和小技巧



这本书是我在上周面试 2月25号-28号之间看的,早上面试下午看书,从书本中学到的东西马上就在面试官面前卖弄,输入输出,让我感觉自己的收获还是挺大的。

看书小技巧:首先拿到一本书,看出版社看序言-一般作者或出版社会大概介绍本书,让后是书本目录,花个几分钟全书浏览一般,目的是为大致再了解一下本书,是否你有兴趣读,是否可以阅读有意义?让后再花一天时间将本书从头阅读一遍,遇到重点章节记录一下,难以理解的记住某一个章节,让后继续把这本书看完,到时候拿出具体都重点章节和难点章节啃掉。 

---读书的方法可以看《如何阅读一本书》

 

目录分析

第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型

  1. ARP 原理 DNS 原理  
  2. IP协议   特点:动力层,为上层提供无状态,无连接,不可靠服务。
    1. IP 头    --通常20字节
    2. 介绍 IP 数据报路由与转发
      1. IP路由 是为了找到目标机器的路径  --了解这个前提要了解IP模块工作流程
  3. 传输层 tcp
    1. tcp头部   --40个固定字节,用来连接和控制
    2. 三次握手四次挥手
      1. 半关闭状态   某一方不再发送,但是允许继续接受对方数据.
    3. 状态转移过程  -- 两段状态变化的过程。
    4. linux高性能服务器编程书本总结_第2张图片
      1. 复位报文手段   作用也就是通知对方关闭连接或者重新连接
        1. 访问不存在的端口  --什么情况下都可以收到复位报文段
        2. 异常终止连接   
          1. 一旦tcp发送了复位报文,发送端所等待的排队数据都被丢弃,可以使用 SO_LINGER来发送复位报文段,终止一个连接。
        3. 处理半打开连接  就是对方网络故障没有收到结束报文 网络故障等一些原因,但是服务器以为对方关闭成为半打开,可以写数据时发一个复位报文,就可以被关闭了
    5. 数据流 就是tcp与应用程序之间的数据通讯分析
      1. 交互数据 字节少,实时性高。
        1. nagle算法优化 将多个小的数据报文一起发了,减少小数据报文
      2. 成块数据 例如ftp
      3. 外带数据  用于迅速告诉对方本端发生的重要事件。
        1. 所以外带数据的优先级最高,无需排队,udp 没有该数据,tcp 也不是真正意义上的,只是利用紧急指针的两个字段,该缓存1字节,上层如何没有及时拿出下次就覆盖了。
    6. 数据流控制  超时重传和拥塞控制
      1. tcp 超时重传  也就是发生异常网络情况下
        1. tcp 模块维护的 重传定会器--如果对方没有应答那么就启动,传多少次? 经过分析 重传五次 0.2s 0.4 0.8 1.6 3.2s每次重传加倍,五次后由IP和ARP接管。
      2. 拥塞控制
        1. tcp 重要任务 提高网络利用率降低丢包,保证网络资源对数据流的公平性,这就是拥塞控制。
          1. 慢启动
          2. 拥塞避免
          3. 快速重传
          4. 快速恢复

-- 这里呢 也只是简单的介绍一下书,要看具体详情 网络这一块 可以看tcp/ip核心3卷

 

第二篇 核心篇 5 章到 15 章节

5-6章节 主要介绍 套接字编程API的使用和介绍

  1. socket地址API
    1. 主机字节序和网络字节序(大端:高位字节存储低位,低位字节存储高位,主机字节序反之)
      char union_bytes[sizeof(short)];
      
      if (sizeof(short) == 2) { 
          if (test.union_bytes[0] == 1 && test.union_bytes[1] == 2) 
              cout << "big endian" << endl; 
          else if (test.union_bytes[0] == 2 && test.union_bytes[1] == 1) 
              cout << "little endian" << endl; 
      }  ---代码段
    2. 套接字地址族   含 地址族(IPV4,6) 端口号(网络字节序) IPV4地址结构体
    3. 创建socket  socket 它是一个可读可写可控制,可开关的文件描述符。
    4. 命名socket  bind 函数来做一个地址族绑定具体某一个socket
    5. 监听socket  listen函数 创建一个监听队列来存放待处理的客户连接。
    6. 接受连接 accept 
      1. 测试 :如果在accept 接受过程中客户端断开了,会不会影响到该函数的调用呢? 经过测试答案是不会的,它只是从队列中取出来数据而已。
    7. 发送请求 connect 客户端与服务器主动发出连接
    8. 关闭连接  close
  2. 数据读写
    1. tcp 数据写
      1. recv
      2. send
    2. udp数据读写
      1. recvfrom
      2. sendto
    3. 通用读写函数
      1. recvmsg
      2. sendmsg
    4. 外带标记 sockatmark
    5. 地址信息函数  获取本端的socket地址 获取远端的 getsockname getpeername
    6. socket 选项  getsocket  setsocket  --这个是专门用来设置socket文件描述符的属性,而fcntl 是POSIX方法。具体了解https://blog.csdn.net/swartz_lubel/article/details/79574472   该函数更多选项
  3. 网络信息API
    1. 根据主机名获取主机完整信息,根据ip 获取完整信息
    2. 根据名称获取某个服务的完整信息,根据端口获取某个服务完整信息  -- 具体函数就不列举出来了,只是告诉有这个功能
  4. 高级io 函数-----------------------
  5. pipe 管道,做进程间通讯
  6. dup dup2 函数  把标准输出重定向到另一个文件或者其它的。
  7. readv 和 writev 函数  将分散在内存块中的数据一并写入文件描述符中。
  8. sendfile 两个文件描述符之间直接传递数据,避免内核和用户缓冲区,提高效率。
  9. mmap munmap 用于申请一块内存,该内存作为进程间通讯的共享内存。
  10. splice 函数 用于连个文件描述符之间数据移动 ,零拷贝就是不消耗什么效率
  11. tee 两文件描述符之间复制数据
  12. fcntl 函数 提供对文件描述符的各种控制
    1. 复制文件描述符
    2. 设置获取文件描述符标志
    3. 设置获取它们状态
    4. 管理信号

 

7章 是linux 服务器方面的一个规范操作

  1. 系统日志  服务器的维护和调试都需要这个东西,系统也提供了 一些函数 rsyslogd
  2. 有时候不能以root 权限来操作,因为权限太大,所以应该使用用户  代码中做用户判断呢?
  3. 系统资源限制 
    1. 物理限制  cpu 内存数
  4. 服务器程序后台化 就是以守护进程的方式运行

8-9 服务器的架构模式  --也是本书最重要的章节 8是内核

  1. 服务器编程框架
    1. 模块 单个服务器程序 服务器集群  
      I/O处理单元 处理客户连接,读写网络数据 作为接入服务器实现负载均衡  
      逻辑单元 业务进程或现场 逻辑服务器  
      存储单元 本地数据库或文件缓存 数据库服务器  
      请求队列 各个单元之间通讯方法 各个服务器之间永远tcp连接  
             
       
      1.  IO模型
        1. 将文件描述符设置为非阻塞  fcntl  设置为F_SETFL
        2. IO模型 读写操作和阻塞阶段  
          阻塞IO 程序阻塞利于读写函数  
          IO复用 程序阻塞与IO复用系统调用,可以同时监听多个IO事件  
          SIGIO信号 信号触发读写就绪事件,用户程序执行读写操作,程序不阻塞  
          异步IO 内核执行写操作并触发读写完成事件。  
               

           

      2. 两种高效事件处理模式
        1. Reactor
          1. 负责监听文件描述符是否具有事件发生,如果有事件则立即通知该事件的工作线程。 select
          2. 详细介绍https://www.cnblogs.com/doit8791/p/7461479.html
        2. Proactor 模式将所有IO操作都交给主线程和内核来处理,工作线程仅仅只负责处理业务逻辑
      3. 逻辑单元

10章 信号

11章定时器

12章 libevent 开源库

13-14 多进程线程编程开发

15章 进程池线程池

第三篇 高性能服务器优化监控  介绍了一个linux 下的工具和小技巧

 

 

你可能感兴趣的:(服务器,读书日记系列)