TCP并发服务器和 Linux常用IO模型
1.TCP并发服务器单循环服务器一次只能处理一个客户端任务的服务器。并发服务器能够同时处理多个客户端任务的服务器。TCP并发服务端多进程 安全、资源开销大、并发量小多线程 相对进程资源开销小相对并发量大线程池 提前创建好大量线程管理起来避免反复创建线程带来时间消耗 生产者--消费者 设计模式IO多路复用 文件 ---fd 对多个文件描述符的监测复用一个进程。2. Linux常用IO模型1.阻塞IO让多个IO具有先后顺序节省CPU资源2.非阻塞IO搭配轮询方式实现浪费CPU资源3.信号驱动IO效率高驱动的信号个数有限应用层无法区分多个IO事件4. IO多路复用在一个进程中同时监测多个IO1.select创建文件描述符集合添加需要监测的文件描述符到集合通知内核开始监测由IO事件到达时监测返回结果int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能:通知内核监测文件描述符中的事件 参数 nfds 集合中最大的文件描述符1 readfds读事件的文件描述符集合 writefds写事件的文件描述符集合 exceptfds其他 timeout超时时间 NULL 不设置超时时间阻塞 返回值 成功返回到达事件的个数 失败-1 void FD_CLR(int fd, fd_set *set); 功能将fd对应文件描述符清零 int FD_ISSET(int fd, fd_set *set); 功能判断fd对应的文件描述符是否被置位 void FD_SET(int fd, fd_set *set); 功能将集合表中的fd对用的文件描述符置位 void FD_ZERO(fd_set *set); 功能将集合表全部清零2.epollint epoll_create(int size); 功能创建文件描述符集合 参数 size监测的文件描述符的最大上限 返回值 成功返回集合代表的文件描述符 失败-1 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 功能对epoll的文件描述符集合进行操作 参数 epfd文件描述符集合 op操作指令 EPOLL_CTL_ADD:添加 EPOLL_CTL_MOD:修改 EPOLL_CTL_DEL:删除 fd需要操作的文件描述符 event事件类型 返回值 成功0 失败-1 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 功能通知内核开始监测文件描述符集合并等待返回监测到的事件结果 参数 epfd文件描述符集合 events保存到达事件的数组 maxevents监测的事件最大个数 timeout 超时时间 -1 不设置超时 返回值 成功返回到达事件的个数 失败-15.总结selectselect使用数组位图保存文件描述符集合最多允许监测1024个文件描述符select将集合表创建在应用层需要应用层和内核层的反复数据拷贝select需要遍历寻找到达的IO事件效率低select只能工作在水平触发模式低速模式不能工作在边沿触发模式高速模式pollpoll使用链表保存文件描述符集合理论上没有文件描述符限制poll将集合表创建在应用层需要应用层和内核层的反复数据拷贝poll需要遍历寻找到达的IO事件效率低poll只能工作在水平触发模式低速模式不能工作在边沿触发模式高速模式epollepoll使用树形结构保存文件描述符集合红黑树epoll将结合表直接创建在内核层避免应用层和内核层的反复数据拷贝epoll直接返回到达的事件不需要应用层遍历查找epoll可以工作在水平触发模式低速模式也可以工作在边沿触发模式高速模式