网络IO模型
更加详细的解释:https://blog.csdn.net/u013205877/article/details/94228455
同步/异步:关注的是事件处理的消息通信机制,即在等待⼀件事情的处理结果时,被调⽤者是否提供完成通知。
阻塞/⾮阻塞:关注调⽤者在等待结果返回之前所处的状态 阻塞:locking,指IO操作需要彻底完成后才返回到⽤⼾空间,调⽤结果返回之前,调⽤者被挂起,⼲不了别的事情。 ⾮阻塞:nonblocking,指IO操作被调⽤后⽴即返回给⽤⼾⼀个状态值,⽆需等到IO操作彻底完成,最终的调⽤结果返回之前,调⽤者不会被挂起,可以去做别的事
情。
一、同步阻塞型
程序向内核发送IO请求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回,则进程将⼀直等待并不再接受新的请求,并由进程轮训查看IO是否完成,完成后进程将IO结果返回给Client,在IO没有返回期间进程不能接受其他客⼾的请求,⽽且是有进程⾃⼰去查看IO是否完成,这种⽅式简单,但是⽐较慢,⽤的⽐较少。
二、同步非阻塞型
程序向内核发送请IO求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回IO结果,进程将不再等待,⽽且继续处理其他请求,但是仍然需要进程隔⼀段时间就要查看内核IO是否完成。
三、IO多路复用型
IO multiplexing就是我们说的select,poll,epoll,有些地⽅也称这种IO⽅式为event driven IO。select/poll/epoll的好处就在于单个process就可以同时处理多个⽹络连接的IO。它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知⽤⼾进程。 当⽤⼾进程调⽤了select,那么整个进程会被block,⽽同时,kernel会“监视”所有select负责的socket,当任何⼀个socket中的数据准备好了,select就会返回。这个时候⽤⼾进程再调⽤read操作,将数据从kernel拷⻉到⽤⼾进程。
Apache 的三种工作模式,两种是属于这种工作模式
prefork是此模式的主进程+多进程/单线程+select
work是此模式的主进程+多进程/多线程+poll模式
四、信号驱动型
程序进程向内核发送IO调⽤后,不⽤等待内核响应,可以继续接受其他请求,内核收到进程请求后进⾏的IO如果不能⽴即返回,就由内核等待结果,直到IO完成后内核再通知进程。
apache event模型就是主进程+多进程/多线程+信号驱动
五、异步非阻塞
程序进程向内核发送IO调⽤后,不⽤等待内核响应,可以继续接受其他请求,内核调⽤的IO如果不能⽴即
返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的结果返回给进程,期间进程可以
接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现较⼤的同时并实现较⾼的IO复⽤,因此异步⾮阻
塞使⽤最多的⼀种通信⽅式。
nginx是异步⾮阻塞。