还不理解select、poll、epoll ? 在参考众多的文章及书本之后,在此记录一下我的理解!
多路复用本质上是一种优化思想,通过对事件监听或是对描述符的轮询从而使 N->N 到 1->N 优化。
应用到网络编程中,select与epoll就是上面思路的实现,应用到redis中就是io多路复用的基础模型
select与poll
在看众多文章时,发现好多文章都放出了select源码。固然研究源码的思想是正确的,但对于菜鸟来说就直接劝退了(本人,c++的代码一言难尽)
所以我仅仅在此谈论思想,select是通过对fd_set(文件描述符的集合)轮询检查来确认事件的发生,从而进行处理。而且poll与select仅仅是实现的细节不同,本质上都是轮询集合
epoll
epoll通过注册事件及回调函数,换句话说是面向事件驱动编程,即不是主动轮询集合。显而易见,事件驱动提高了处理者对事件的响应速度。
举个例子,幼儿园某个小朋友把花瓶打碎了,select老师就挨个的问小朋友“你有没有把花瓶打碎呀”。而epoll老师提前与小朋友们的约定(事件驱动),于是epoll老师只要等着小明自己承认错误就可以了
多路复用的应用场景
网络编程
在网络编程中,一次数据的交互通常是由数据抵达与数据复制组成。
在服务器中使用一个线程或少量线程来处理多个tcp连接,从而达到多路复用