IO 异步模型有 select, poll, signal-driven IO, epoll
select , poll 是比较接近的两种,只是调用方法上的区别
epoll 是linux 中的新的模式,相比对于大量的数据会有较高的性能
select, poll 是在每次调用的时需要将自己要监听的信息送入调用函数,内核据此检测,并在有事件时,通知调用者,并清空相关信息。在参数中会提供最大数量 ,内核 也正是基于此最大数量来进行检测,所以在数量较大时性能会下降。
对于 epoll,在一次添加后,就不需要再操作了,内核有自己的记录方式,并在事件产生时,由epoll_wait 直接返回,而没有事件时, epoll_wait 基于不做事,这样对于大量的文件监听,性能也不会有太大变动。
signal-driven IO 是基于信号机制的一种监听方式,在有事件产生时,会以信号的形势通知到调用者,使用场景不高
针对 select 方式,假设调用时先创建信号函数 ,再调用 select ,而事件在 两者之间产生,就会使用得 select 接收不到,此种现象提供了 pselect 函数,具体用处较少,可自行查阅
同时也提供另一种方法,即创建管道,在信号产生时往管道去写,同时 select 监听此管道,也就是在信号产生时将事件通知到 select