01
阻塞I/O blocking i/o
①等待数据:需要等待数据拷贝进内核
②需要等内核将数据复制到用户空间。
◇优点:①能够及时返回数据,无延迟。②内核开发者省事。
◇缺点:对用户来说处于等待就要付出性能的代价了
02
非阻塞I/O nonblocking i/o
用户进程需要不断的主动询问kernel数据好了没有。
用户进程发出read操作,由于内核还没有准备好数据,所以马上返回一个error标识,用户进程知道内核还没准备好,所以并没有block,而且还会轮询的调用read询问数据是否准备好,内核准备好后就返回给用户进程。
同步非阻塞方式相比同步阻塞方式:
◇优点:能够在等待任务完成的时间里干其他活了(包括提交其他任务,也就是 “后台” 可以有多个任务在同时执行)。
◇缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。
03
I/O多路复用 i/o multicomplexing
基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
同步是需要主动等待消息通知,而异步则是被动接收消息通知,通过回调、通知、状态等方式来被动获取消息。IO多路复用在阻塞到select阶段时,用户进程是主动等待并调用select函数获取数据就绪状态消息,并且其进程状态为阻塞。所以,把IO多路复用归为同步阻塞模式。
04
信号驱动式IO(signal-driven IO)
、
05
异步 IO(asynchronous IO)
06
5种IO模型区别
◇blocking和non-blocking区别
调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。
◇synchronous IO和asynchronous IO区别
两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞。之前所述的blocking IO,non-blocking IO,IO multiplexing都属于synchronous IO。
而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。
non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。
【笔记系列】
笔记 | 面试官问我高并发的问题:并发编程的三大挑战
3、Kafka面试题!掌握它才说明你真正懂Kafka
4、Netty 5.0为啥被舍弃?原因竟然是...
5、中台之上——业务架构系列【汇总】
-关注搬运工来架构,与优秀的你一同进步-
原创不易,如果喜欢这篇文章可以点在看哦↘
本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构
文章评论