1、什么是IO多路复用
其实就是充分利用资源,只有一个线程(人力), 能够处理多个事情。
就比如说一个饭店,招了一名员工,你希望它来客人地时候招呼客人,厨房菜好了的时候,去上菜, 客人吃完饭的时候,去清理桌子,要打烊的时候,收桌子等。
同理地,我们一个设备可能连接很多设备,或者网络连接等等,当有数据流要输入或者输出到这个连接地时候, 就让这个线程去处理。 而多路复用,就是让这个线程尽可能多地处理这些连接。
2、作用
明显地,一个线程可以处理更多的I/O流(也就是高并发),充分利用了这个线程资源。
3、实现技术
那么问题来了, 像上面饭店员工那样,员工怎么知道当下可以做什么事情呢。
3.1 select
员工就不断地逐个去观察(轮询),先观察是否有客人来, 然后观察厨房菜好了没有, 观察客人吃完饭没有。。。 哪个好了就去做哪个
3.2 poll
同样地,和select一样员工就不断地逐个去观察(轮询), 哪个好了就去做哪个。 那么他们的区别在于哪里呢, select是招的这个员工一来就已经签好了合同说我只能干四个事情, 而poll则不同,我可以按照老板要求动态调整,让我多干几个事情也没关系。
3.3 epoll
epoll技术就是给门口、客人的桌子上、厨房安装不同的铃铛, 然后不同的铃铛响了,便知道对应要做什么处理, 就不需要员工主动地去观察所有可能的情况。
总结:
select 和poll 都是主动轮询,适合低并发或跨平台场景。
select 限制了最大连接数量, 而poll可以调整连接数量。
而epoll由事件驱动,适合高并发 Linux 服务。