一文搞懂BIO、NIO、I/O多路复用与异步AIO

一文搞懂BIO、NIO、I/O多路复用与异步AIO

1. IO操做本质

1. 内存分为内核缓冲区和用户缓冲区python

2. 用户的应用程序不能直接操做内核缓冲区,须要将数据从内核拷贝到用户才能使用nginx

3. 而IO操做、网络请求加载到内存的数据一开始是放在内核缓冲区的windows

4. 数据的复制过程是不消耗CPU的bash

2. BIO 阻塞模式I/O

举个例子:
一我的去 商店买一把菜刀,
他到商店问老板有没有菜刀(发起系统调用)
若是有(表示在内核缓冲区有须要的数据)
老板直接把菜刀给买家(从内核缓冲区拷贝到用户缓冲区)
这个过程买家一直在等待

若是没有,商店老板会向工厂下订单(IO操做,等待数据准备好)
工厂把菜刀运给老板(进入到内核缓冲区)
老板把菜刀给买家(从内核缓冲区拷贝到用户缓冲区)
这个过程买家一直在等待
是同步io

 

 3. NIO 非阻塞模式I/O

用户进程发起请求,若是数据没有准备好,那么马上告知用户进程未准备好;此时用户进程可选择继续发起请求、或者先去作其余事情,稍后再回来继续发请求,直到被告知数据准备完毕,能够开始接收为止; 数据会由用户进程完成拷贝网络

举个例子:
一我的去 商店买一把菜刀,
他到商店问老板有没有菜刀(发起系统调用)
老板说没有,在向工厂进货(返回状态)
买家去别地方玩了会,又回来问,菜刀到了么(发起系统调用)
老板说尚未(返回状态)
买家又去玩了会(不断轮询)
最后一次再问,菜刀有了(数据准备好了)
老板把菜刀递给买家(从内核缓冲区拷贝到用户缓冲区)

整个过程轮询+等待:轮询时没有等待,能够作其余事,从内核缓冲区拷贝到用户缓冲区须要等待
是同步io

4. I/O多路复用模型

相似BIO,只不过找了一个代理,来挂起等待,并能同时监听多个请求; 数据会由用户进程完成拷贝异步

举个例子:多我的去 一个商店买菜刀,
多我的给老板打电话,说我要买菜刀(发起系统调用)
老板把每一个人都记录下来(放到select中)
老板去工厂进货(IO操做)
有货了,再挨个通知买到的人,来取刀(通知/返回可读条件)
买家来到商店等待,老板把到给买家(从内核缓冲区拷贝到用户缓冲区)

多路复用:老板能够同时接受不少请求(select模型最大1024个,epoll模型),
可是老板把到给买家这个过程,还须要等待,
是同步io

select本质也是轮询最多能够监听1024个,而epoll模型是事件驱动,好了会主动告诉你socket

-select:小明,你写好了么?小红你写好了么?.......
-epoll:同窗写好了,举手告诉老师来检查(nginx、tornado用的是epoll)windows平台不支持epoll,用的是select函数

5. 异步IO-AIO

发起请求马上获得回复,不用挂起等待; 数据会由内核进程主动完成拷贝,目前不成熟tornado

举个例子:仍是买菜刀
如今是网上下单到商店(系统调用)
商店确认(返回)
商店去进货(io操做)
商店收到货把货发个卖家(从内核缓冲区拷贝到用户缓冲区)
买家收到货(指定信号)

整个过程无等待
异步io

 

 

  • 同步I/O与异步I/O判断依据是,是否会致使用户进程阻塞
  • BIO中socket直接阻塞等待(用户进程主动等待,并在拷贝时也等待)
  • NIO中将数据从内核空间拷贝到用户空间时阻塞(用户进程主动询问,并在拷贝时等待)
  • IO Multiplexing中select等函数为阻塞、拷贝数据时也阻塞(用户进程主动等待,并在拷贝时也等待)
  • AIO中从始至终用户进程都没有阻塞(用户进程是被动的)
相关文章
相关标签/搜索