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

14 篇文章 0 订阅
1 篇文章 0 订阅

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

 

首先:

了解 五种网络IO模型

  1. 阻塞IO
  2. 非阻塞IO
  3. IO多路复用
  4. 信号驱动IO
  5. 异步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

IO 多路复用的模型详解

经典的五张图片:

 

没啦!。。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值