历史版本2:提交错误报告

swoole里使用了固定大小一次分配的connection_list数据结构。这样做的好处是:

  • 内存管理最简单,就是C数组,通过fd作为下标就可以访问到连接的信息
  • 不存在内存扩容,是线程安全的

缺点是一次性占用一大块内存,单个connection结构的长度大致为70字节,如果serv->max_conn = 1M,那一次性要分配70M内存。

connection_list是建立在共享内存上的,所以无论在进程均可访问到数据。

遍历connection_list

使用connection_list[0]和connection_list[1]分别保存最大FD和最小FD,直接执行for循环,从minfd->maxfd即可访问到所有连接。当close(maxfd)时,通过循环maxfd--,找到除maxfd外最大的fd作为新的maxfd。

connection_list[0].active == 0时,表示此连接不存在或者已经关闭。等于1时表示是活动的连接。

这里利用了Linux文件描述符总是从最小的数字开始复用,所以maxfd ~= 总的连接数量。

比如有文件描述符 18,19,23,50 如果18, 23,50被close了,那一定是18最先被复用