网络IO、Linux 网络模型 、同步、异步、IO多路复用
网络IO、Linux 网络IO模型 、同步、异步、IO多路复用
首先:
了解 五种网络IO模型
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 信号驱动IO
- 异步IO
前四种是属于同步的,后一种是属于异步的。
详细描述:
阻塞IO:进程会等待任务完成,例如是对于某个套接字的内容读取等。然后在进行其他的操作
非阻塞IO:进程不会一直等待某个任务执行完成,而是先去执行其他操作,然后不断的去查看任务的执行情况,进而处理
I/O多路复用:进程可能需要去处理很多任务,这些任务一个一个去处理太慢,所以就同时去处理,然后以某种方式分别对不同任务的结果进行处理,这里的某种方式主要是有两类:select/poll 和 epoll,两个明显区别是前者是主要以轮训的方式进行检查任务的执行情况,而后者主要是通过对已经获得结果的任务进行处理,例如:poll会在用户态和内核态之间多次复制数据,并且对设备至少做一次加入和删除的操作,导致性能低下,而epoll则是提供callback,在某个设备就绪之后,才会进行一下操作。
信号驱动IO: 是应用进程告知内核开始进行操作,然后这是不阻塞,操作完成之后通过某个信号通知应用进程进行IO,然后由进程进行操作,操作的这个过程是阻塞的。看起来和接下来的异步IO很像,其区别就是,内核通知应用的时机不同,信号驱动IO是在可以进行IO的时候通知进程,而异步IO是在IO完成之后通知应用,但是他们都不阻塞!!!
异步IO: 和信号驱动IO类似,在内核IO完成之后调用相应的处理程序。
一张图:
关于同步IO和异步IO的解释:
- 同步I/O操作(synchronous I/O operation)导致请求进程阻塞,直到I/O操作完成。
- 异步I/O操作(asynchronous I/O operation)不导致请求进程阻塞。
举个例子,在tornado应用中,如果启动一个tornado的服务进程,然后,对于某个请求的处理函数中进行了time.sleep操作来模拟耗时操作,那么当有其他请求进来的时候,会不被处理,直到之前的请求处理完成,也就是这个服务进程被阻塞了。
然而呢,可以使用tornado.gen.sleep()模拟耗时操作,其他请求进来就能立刻被处理,这时就是异步状态了
几个优秀链接:
知乎各路大神的讨论:https://www.cnblogs.com/nufangrensheng/p/3588690.html
一个博友的总结:https://www.cnblogs.com/nufangrensheng/p/3588690.html
经典的五张图片:
没啦!。。