欢迎光临
我们一直在努力

关于C++网络编程中Epoll和套接字阻塞与非阻塞有感

前情提要:小编本人是刚开始学C++网络编程的学生,来记录一下学习笔记,大家如果看到有错误请不要吝啬您的指导,助力每一位it追梦人

我们创建的套接字不管是连接套接字Acceptor_fd还是客户端套接字Client_fd都会放到Epoll中来进行管理,Epoll是Linux内核自带的,里面有一个红黑树来管理我们的套接字。他最主要的一个功能就是将有事件发生的套接字给返回出来,我们一般用一个数组Events来承接,这样我们就不需要便利每一个套接字fd了,只需要处理这个数组里面的即可。

套接字阻塞:阻塞就是你用read()的时候,如果读缓冲区里面没有数据他就会一直在那里面等着,这样我们Events里面的其他套接字就要跟他一直在那里等。如果说客户端连接比较少的情况下还可以考虑,那么如果有成千上万个呢?这个时候我们就要想办法了。

套接字非阻塞:非阻塞比阻塞多了一个东西,如果缓冲区读取完了会返回一个EAGIN,我们只许哟啊加上一个判断if (errno == EAGAIN || errno == EWOULDBLOCK),这样我们就读完数据就可以安全的退出了,不影响其他的fd处理。

Epoll水平触发LT:水平触发坦白说就是他会一直通知你如果你没有把数据读完,下一次调用 epoll_wait() 时会立即返回,再次告诉你这个 fd 可读,也就是“持续通知”

Epoll边缘触发ET:边缘触发相对于水平触发,他只会通知你一次,即使缓冲区里面还有数据也不会再次通知你,所以你需要保证他通知你一次,然后你一次性的把数据给拿完。因为我们用到ET他只会通知一次,你必须得循环的去取数据,如果你用阻塞的话,缓冲区没有数据,它会一直阻塞在那里,所以我们的ET必须搭配非阻塞,这在下边也会有提到。

经典配合1:LT+阻塞 ,如果说在我么们平常的学习当中客户端非常的少,并发量比较小的情况下可以使用,代码最简单,线性逻辑。AI给出的连接数量建议是<500

经典配合2: ET+非阻塞:优点就是每个事件只通知一次,在成千上万的高并发服务器中,大大减少了通知的次数,但是这个需要我们的代码复杂度比较高.AI给出的连接数量建议是>10000

配合3:LT+非阻塞:适合中等数量的连接,只开一个线程,但是通知次数多。AI给出的连接数量建议是500~2000

重点: 阻塞因为read()会卡在那里等待缓冲区有数据,所以需要有几个连接就开几个线程,但是线程熟练后膨胀会导致cpu调度崩溃,内存爆炸,不建议这样。如果是LT就无所谓,读一次就可以退出,反正epoll会产生事件。

心得体会

1.使用LT,阻塞与非阻塞无所谓

2.使用ET,必须配合非阻塞,循环read

3.使用阻塞,在循环read的时候必须要每个连接单开线程(多线程)

4.使用非阻塞,单线程处理处理多连接,多线程也可以(没有必要)

这四条是小编总结的黄金法则

总结:ET比LT高效,因为通知的次数大幅度降低。非阻塞比阻塞灵活,因为它不会在那里死等。具体情况还需要具体讨论,情况复杂多变。

赞(0)
未经允许不得转载:171主机测评 » 关于C++网络编程中Epoll和套接字阻塞与非阻塞有感
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址