引用
一篇干货博客:
select的原理和用法:FD_SET的使用
写在前面
IO复用模型轮询IO就绪转态,其实在IO就绪前的轮询都是无意义的,浪费CPU的时间片。那有没有一种办法可以让IO就绪的时候反过来通知我们呢,这样便只存在一次交互。
模型概念
信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用 sigaction 的时候建立一个 SIGIO 的信号),线程不阻塞。当内核数据准备好后,再通过 SIGIO 信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用 recvfrom ,去读取数据。
这解决了IO复用模型中工作线程等待IO就绪的问题,我们在IO就绪时才向内核发起IO请求取出数据。
总结
该模型下去掉了轮询,使得cpu在能处在一个较为空闲的状态,将更多时间片给其他作业。其工作流程将IO请求分为就绪前和就绪后。
•首先告诉内核需要发起IO,此后内核在IO就绪后通知应用层程序
•程序发起IO获得数据,IO完成。