- 单循环服务器:服务端同一时刻只能处理一个客户端的任务
- 并发服务器:服务端同一时刻可以处理多个客户端的任务
- TCP服务端并发模型


- 线程相对于进程资源开销小,相同资源环境下,并发量比进程大
- 线程池
- 为了解决多进程多线程模型在服务器运行过程中,频繁创建和销毁进程线程带来的时间消耗问题
- 基于生产者和消费者编程模型,以及任务队列,实现的一套多线程框架
- IO多路复用
- 对多个文件描述符的读写可以复用一个进程
- 在不创建新的进程线程的前提下,使用一个进程实现对多个文件读写的同时监测

- select实现IO多路复用
- 创建文件描述符集合
- 添加关注的文件描述符到集合
- 使用select传递集合表给内核,内核开始监测事件
- 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果
- 根据select返回的结果做不同的情况处理
- 函数接口
- void FD_CLR(int fd, fd_set *set); 从集合中移除描述符
- int FD_ISSET(int fd,fd_set *set); 检查描述符是否在集合中
- void FD_SET(int fd, fd_set *set); 添加描述符到集合
- void FD_ZERO(fd_set *set) 清空集合
- select :int select(int nfds,fd_set*readfds,fd_set *writefdsfd_set *exceptfds, struct timeval *timeout)
- 功能:传递文件描述符结合表给内核并等待获取事件结果
- 参数:
- nfds:关注的最大文件描述符+1;
- readfds:读事件的文件描述符集合;
- writefds:写事件的文件描述符集合;
- exceptfds:其他事件的文件描述符集合;
- timeout:设置select监测时的超时时间;NULL:不设置超时时间(select一直阻塞等待)
- 返回值:成功:返回内核监测的到达事件的个数;失败:-1;0:超时时间到达,但没有事件发生,则返回0

- select的优缺点
- 优点:
- 跨平台:几乎所有Unix-like系统都支持
- 简单易用:API相对简单,易于理解
- 超时控制:可以设置精确的超时时间
- 缺点:
- 性能问题:每次调用都需要遍历所有描述符
- 描述符限制:FD_SETSIZE通常限制为1024
- 内存拷贝:每次调用都需要在用户空间和内核空间之间拷贝fd_set
- 线性扫描:需要遍历所有描述符来检查状态