采用epoll模型服务器连接管理器实现

来源:互联网 发布:java游戏大全 编辑:程序博客网 时间:2024/05/16 10:40

【应用场景】

 

    在网络服务器中,需要维护所有连接信息,通常是以fd做为key,连接信息结构体做为value。每次有新连接接入时,需求加入一个映射关系;每次有新数据到达时,需要根据对应的fd查询到对应的连接信息结构。

 

    通过上面的场景我们可以抽象出来一类数据,数据的特点如下:

  • 数据有多条,支持增、删、改
  • 数据结构有唯一的索引,且索引号动态分配
  • 需要很方便的根据key查询到value(这里是性能的关键)
  • 记录数有上限(不是必要的,但通常都需要,比较TCP连接就需要)

【解决方案】   

 

    一种解决方案是,把信息保存在map或hash_map中,可以根据key方便的增、删、查对应的结构。不过,这两种存储方式都有一点的缺点,map查询的时间复杂度是o(logn),hash_map查询的时间复杂度是o(1),但是会分配一定的冗余空间。同时这两种方式都需要单独维护一个记录数上限。下面讨论一种基于下标查询的优化方案。

 

【方案优化】

 

    就查询效率而言,数组下标索引的时间复杂度是最低的o(1),因此我们可以考虑把所有的记录都使用下标进行索引,但因为key是动态分配的,比如TCP连接的fd就是系统分配的,因此fd是不适合做下标的,所以我们可以把下标信息保存在key信息中。每次获得key信息后,从
key信息中解出下标,然后直接通过下标进行索引。   这种方案对应用场景又加了一条限制,就是“每次获取到的key信息有冗余字段可以保存下标”,因为这个方案是从epoll服务模型中抽象出来的,更多的应用场景有待发据掘。

 

【代码示例】

 

    下面以基于epoll模型的服务器中连接管理为例介绍优化方案的实现。

原创粉丝点击