网络服务模型分为同步阻塞IO模型、同步非阻塞IO模型、异步IO模型、信号驱动、IO多路复用等
阻塞与非阻塞的区别:阻塞调用是指调用结果返回之前,调用线程只有在得到结果之后才会返回,否则当前线程会被挂起。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程
一、同步阻塞IO模型
相当于串行,在系统内核准备数据期间会发生阻塞,数据准备完成后才会准备下一次数据。特点:IO执行的两个阶段都被block了
二、非阻塞IO模型
在数据没有准备好之前,会直接返回error,然后进程可以做其他的事情,不会发生阻塞。数据准备好之后,复制数据到用户空间,进程处理数据,这一阶段,进程会发生阻塞。特点:第一阶段没有被block,第二阶段则依然被block
三、异步IO模型
通过aio_read调用系统内核,告知需要的数据,然后进程可以做其他事情,直到系统内核完成数据,将数据复制到用户空间再通知进程,此时进程直接处理用户空间的数据。
四、信号驱动IO模型
应用程序通过sigaction发送请求,通知系统内核需要什么样的数据,然后进程就可以去做其他事,当系统内核准备好数据之后,会立刻返回信号,然后进程立刻调用recvfrom,等待数据从内核空间复制到用户空间,待完成之后recvfrom返回成功指示,进程才处理别的事情
五、IO多路复用模型
I/O多路复用和阻塞I/O类似,不同的是这里使用两个system call (select 和 recvfrom),而blocking IO只调用了一个system call (recvfrom)。I/O多路复用用户进程阻塞的不是recvfrom,而是select/epoll。但是,用select的优势在于它可以同时处理多个connection。所以,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading +blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接
总结: