您的位置:首页 > 理论基础 > 计算机网络

网络IO、Linux 网络模型 、同步、异步、IO多路复用

2018-03-07 18:01 381 查看

网络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
经典的五张图片:











没啦!。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: