网络服务模型(图文)

网络服务模型分为同步阻塞IO模型、同步非阻塞IO模型、异步IO模型、信号驱动、IO多路复用等

阻塞与非阻塞的区别:阻塞调用是指调用结果返回之前,调用线程只有在得到结果之后才会返回,否则当前线程会被挂起。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

一、同步阻塞IO模型

相当于串行,在系统内核准备数据期间会发生阻塞,数据准备完成后才会准备下一次数据。特点:IO执行的两个阶段都被block了


二、非阻塞IO模型

在数据没有准备好之前,会直接返回error,然后进程可以做其他的事情,不会发生阻塞。数据准备好之后,复制数据到用户空间,进程处理数据,这一阶段,进程会发生阻塞。特点:第一阶段没有被block,第二阶段则依然被block

三、异步IO模型

通过aio_read调用系统内核,告知需要的数据,然后进程可以做其他事情,直到系统内核完成数据,将数据复制到用户空间再通知进程,此时进程直接处理用户空间的数据。

异步IO模型

四、信号驱动IO模型

应用程序通过sigaction发送请求,通知系统内核需要什么样的数据,然后进程就可以去做其他事,当系统内核准备好数据之后,会立刻返回信号,然后进程立刻调用recvfrom,等待数据从内核空间复制到用户空间,待完成之后recvfrom返回成功指示,进程才处理别的事情

信号驱动IO模型

五、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的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接


总结:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容