并发服务器的实现
单循环服务器:服务器同一时刻只能响应一个客户端的请求
并发服务器:服务器同一时刻可以响应多个客户的请求
TCP并发服务器:
1.多进程: 资源消耗大,同资源平台下,并发量小。
2.多线程:创建线程资源消耗小,但是比较耗时。
3.线程池:提前预创建大量线程,避免任务执行过程中创建线程的耗时
4.IO多路复用()select.poll.epoll(类似于生产者和消费者模式)
在不创建新的进程和线程的前提下,可以在一个进程中同时监测多个IO(fd/sockfd/connfd)
优点:节省资源
不足:不利于处理比较耗时,延时比较长的任务
创建步骤:1. 创建文件描述符集合
2. 将关注的文件描述符加入到集合
3. 等待IO事件到达
4. 根据不同的IO事件处理不同的任务
(1)select
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
功能:阻塞等待IO事件,返回事件结果
参数:
nfds:关注的最大文件描述符+1
readfds:文件描述符读事件集合表
writefds:写事件集合表
exceptfds:其他事件集合表
timeout:超时时间
NULL:不设置超时
返回值:
成功:返回到达的事件个数
失败:-1
0:超时事件到达但没有IO事件
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);
特点:1. select使用位图管理文件描述符,最多允许同时监测1024个文件描述符(有上限);
2. 文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝
3. 需要应用层对集合表进行遍历,寻找到达的事件
4. 只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)
select在应用层和内核层的拷贝以及返回操作
IO多路复用的流程图