目录

并发服务器的实现

目录

并发服务器的实现

单循环服务器:服务器同一时刻只能响应一个客户端的请求

并发服务器:服务器同一时刻可以响应多个客户的请求

TCP并发服务器:

1.多进程: 资源消耗大,同资源平台下,并发量小。

2.多线程:创建线程资源消耗小,但是比较耗时。

3.线程池:提前预创建大量线程,避免任务执行过程中创建线程的耗时

4.IO多路复用()select.poll.epoll(类似于生产者和消费者模式)

在不创建新的进程和线程的前提下,可以在一个进程中同时监测多个IO(fd/sockfd/connfd)

优点:节省资源

不足:不利于处理比较耗时,延时比较长的任务

创建步骤:1. 创建文件描述符集合

  1. 将关注的文件描述符加入到集合

  2. 等待IO事件到达

  3. 根据不同的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 个文件描述符(有上限);

  1. 文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝

  2. 需要应用层对集合表进行 遍历 ,寻找到达的事件

  3. 只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)

https://i-blog.csdnimg.cn/direct/9bfdb3ec2c384c57bc16dfd605512b1b.png

select在应用层和内核层的拷贝以及返回操作

https://i-blog.csdnimg.cn/direct/15d9f15357f646cc846fd5f1fa7dd71b.png

IO多路复用的流程图