文章目录
  1. 有限状态机
    1. 背景
    2. 从属状态机
    3. 主状态机
  2. 提高服务器性能的几条建议
    1. 数据复制
    2. 上下文切换与锁

有限状态机

有限状态机是逻辑单元内部的一种高效编程方法。

以”HTTP请求的读取与分析”来说明有限状态机的使用。

背景

很多网络协议的头部都是固定格式再加上位于末尾的选项字段,通过头部中的长度字段就可以完全地解析头部数据;但是,HTTP协议的头部长度变化非常大,并且头部中没有长度字段,这时就需要借助有限状态机来解析HTTP报文。解析程序使用两个有限状态机(主状态机与从属状态机)来完成HTTP报文的解析工作。

从属状态机

从属状态机的工作是解析一行的内容,从属状态机的状态转移图如下所示。

 

主状态机

主状态机调用从属状态机与两个解析器来解析HTTP报文,主状态机的状态转移图如下所示。

 

提高服务器性能的几条建议

以空间换时间,“浪费”服务器的硬件资源以换取其运行效率。池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源分配。服务器进入运行状态后,如果它需要相应的资源,就直接从池中获取,无需动态分配。

常见的池有内存池、进程池、线程池、连接池。其中,连接池用于服务器或服务器机群的内部永久连接。比如,服务器预先与数据库程序建立的连接放到连接池中,当服务器的逻辑单元需要访问数据库时,它可以直接从连接池中取得一个连接的实体来使用。完成数据库的访问之后,再归还该连接。

数据复制

高性能服务器要避免不必要的数据复制,尤其当数据复制发生在用户空间与内核空间之间时。比如内核可直接处理从socket或文件读入的数据时,则应用程序无需将这些数据从内核缓冲区复制到应用程序缓冲区。

此外,用户空间之间的数据复制也可以避免:使用共享内存而避免使用管道/消息队列。

上下文切换与锁

进程/线程切换要耗费大量CPU时间,最好不要为每个客户连接都创建一个工作线程;高效的半同步/半异步工作模式要比半同步/半异步工作模式的效率高。多线程服务器的一个优点是不同线程可运行在不同CPU上,当线程数目小于CPU数目时,就不存在上下文切换的问题。

服务器如果有更好的选择,应避免使用锁。